2012-10-02 25 views
0

我正在编写一个简单的骰子游戏。该表格由3个文本框和多个标签组成(我将在稍后将1个文本框更改为标签)。
在左上角会出现3个骰子值。
从冒险文本框左侧出现总金额。骰子游戏不能正确显示赢钱

    你在你输入你要下注的奖金
  • 的金额的inzet文本框中输入你的猜测
  • 赌博文本
  • 文本框应显示的钱,你赢得的金额

标准,

  • ,当你把3个乱七八糟你得到20
  • 的奖金
  • 当你把一套低于6东西,你得到的10
  • 奖金,当你把双任何你获得的5
  • 奖金时,你的赌注是正确的inzet加倍(inzet = 1你就赢了2 )
  • 奖金有显示奖金+ inzet

问题是,当你赌博等于总金额,似乎只适用+5奖励奖金只更新。

下面的代码:

{ 
public partial class Form1 : Form 
{ 
    private Random throwDice = new Random(); 
    private int total; 
    private int inzet; 
    private int gamble; 
    private int prize; 
    private int bonus; 
    public Form1() 
    { 
     InitializeComponent(); 

    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     int die1, die2, die3; 

     die1 = throwDice.Next(1, 7); 
     die2 = throwDice.Next(1, 7); 
     die3 = throwDice.Next(1, 7); 

     label1.Text = die1.ToString(); 
     label2.Text = die2.ToString(); 
     label3.Text = die3.ToString(); 
     label4.Text = Convert.ToString(die1 + die2 + die3); 

     total = Convert.ToInt32(label4.Text); 
     inzet = Convert.ToInt32(textBox1.Text); 
     gamble = Convert.ToInt32(textBox2.Text); 

     if (gamble == total) 
     { 
      if (die1 == 6 && die1 == die2 && die1 == die3) 
      { 
       bonus = 20; 
      } 
      else if (die1 == die2 && die1 == die3) 
      { 
       bonus = 10; 
      } 
      else if (die1 == die2) 
      { 
       bonus = 5; 
      } 
      else if (die2 == die3) 
      { 
       bonus = 5; 
      } 
      else if (die1 == die3) 
      { 
       bonus = 5; 
      } 
      prize = inzet * 2 + bonus; 
      textBox3.Text = prize.ToString(); 

     } 
     else if (gamble < total && gamble > total) 
     { 
      if (die1 == 6 && die1 == die2 && die1 == die3) 
      { 
       bonus = 20; 
      } 
      else if (die1 == die2 && die1 == die3) 
      { 
       bonus = 10; 
      } 
      else if (die1 == die2) 
      { 
       bonus = 5; 
      } 
      else if (die2 == die3) 
      { 
       bonus = 5; 
      } 
      else if (die1 == die3) 
      { 
       bonus = 5; 
      } 
      prize = (inzet - inzet) + bonus; 
      textBox3.Text = prize.ToString(); 
     } 
    } 

} 

我需要得到6 6 6奖金的工作(另一组奖金)。 另外我需要奖金来申请当你的赌博不等于骰子总数。

+9

'奖金= (inzet - inzet)+奖金;' - 这相当于'奖金=奖金 - ' - 是你想要的吗? –

+1

'label4.Text = Convert.ToString(die1 + die2 + die3); total = Convert.ToInt32(label4.Text);'不是变量的最有效的用法。你可能会想'total = die1 + die2 + die3; label4.Text = total.ToString();' –

回答

6

这种情况:

else if (gamble < total && gamble > total) 

将永远不会实现!

+0

哈哈我怎么会错过那一个,如果这个帖子低于这一个不是那里id可能做成另一个单独的,如果。 – user1708501

4

这是你的问题:

else if (gamble < total && gamble > total) 

这始终是假的。赌博不能小于或大于总数。

我想你所需要的就是刚刚else

+0

@千:是的,谢谢。输入速度太快。 –

+0

只是其他人做了它的魔力,谢谢,我现在唯一的问题是。现在只有奖金有效。而赌博不会......和textbox3.text不会是0它只是记得最后的奖金。 – user1708501

3

其他人的答案会得到你的根本原因(同时具有<和>,在相同的比较)。

else if (gamble < total && gamble > total) 

需要只是:

else 

此错误是unit tests一个伟大的广告。只需将结果提取到一个类(DiceResults)中,就可以很容易地测试正在运行的应用程序的上下文之外的所有可能的结果。现在你有重复的逻辑来计算奖金,如果你在更改你的奖励逻辑时忘记更新,它本身很容易导致错误。

我并不是说我的方案是最好的代码(如更多的奖金规则补充说,if/else if名单将增长笨拙 - design patterns可以帮助解决),但你的代码的快速重构它使很容易跟踪并最终测试。

我已经添加了一些测试为例;那么为了测试所有结果就可以很容易地添加其他的。随着您添加到代码并进行更改,您可以重新运行测试以检查是否没有任何问题。如果你使用Visual Studio,那么你可以run the unit tests easily

这是你的新的事件处理程序:

private void button1_Click(object sender, EventArgs e) 
{ 
    int die1 = throwDice.Next(1, 7); 
    int die2 = throwDice.Next(1, 7); 
    int die3 = throwDice.Next(1, 7); 

    var results = new DiceResults(die1, die2, die3); 

    label1.Text = results.Dice1; 
    label2.Text = results.Dice2; 
    label3.Text = results.Dice3; 
    label4.Text = results.GetDiceTotal(); 

    inzet = Convert.ToInt32(textBox1.Text); 
    gamble = Convert.ToInt32(textBox2.Text); 

    int prize = results.GetPrize(gamble, inzet); 
    textBox3.Text = prize; 
} 

而新的代码来支持它:

public class DiceResults 
{ 
    public DiceResults(int dice1, int dice2, int dice3) 
    { 
     Dice1 = dice1; 
     Dice2 = dice2; 
     Dice3 = dice3; 
    } 

    public int Dice1 { get; private set; } 
    public int Dice2 { get; private set; } 
    public int Dice3 { get; private set; } 

    public int GetBonus() 
    { 
     int bonus = 0; 

     if (AllSixes()) 
     { 
      bonus = 20; 
     } 
     else if (SetLessThanSix()) 
     { 
      bonus = 10; 
     } 
     else if (AnyDouble()) 
     { 
      bonus = 5; 
     } 
     return bonus; 
    } 

    public bool AllSixes() 
    { 
     return Dice1 == 6 && 
       Dice1 == Dice2 && 
       Dice2 == Dice3; 
    } 

    public bool SetLessThanSix() 
    { 
     return Dice1 < 6 && 
       Dice1 == Dice2 && 
       Dice2 == Dice3; 
    } 

    public bool AnyDouble() 
    { 
     return Dice1 == Dice2 || 
       Dice2 == Dice3 || 
       Dice1 == Dice3; 
    } 

    public int GetDiceTotal() 
    { 
     return Dice1 + Dice2 + Dice3; 
    } 

    public int GetPrize(int gamble, int inzet) 
    { 
     int prize = GetBonus(); 
     if (gamble == GetDiceTotal()) 
     { 
      prize += inzet * 2; 
     } 
     return prize; 
    } 
} 

而且单元测试:

[TestClass] 
public class DiceResultsTest 
{ 
    [TestMethod] 
    public void TestDiceTotal() 
    { 
     //Arrange 
     var results = new DiceResults(1, 2, 3); 

     //Act 
     int diceTotal = results.GetDiceTotal(); 

     //Assert 
     Assert.AreEqual(6, diceTotal); 
    } 

    [TestMethod] 
    public void TestForAllSixes() 
    { 
     //Arrange 
     var results = new DiceResults(6, 6, 6); 

     //Assert 
     Assert.IsTrue(results.AllSixes()); 
    } 

    [TestMethod] 
    public void TestForAllFives() 
    { 
     //Arrange 
     var results = new DiceResults(5, 5, 5); 

     //Assert 
     Assert.IsTrue(results.SetLessThanSix()); 
    } 

    [TestMethod] 
    public void TestForDoubleTwo() 
    { 
     //Arrange 
     var results = new DiceResults(2, 5, 2); 

     //Assert 
     Assert.IsTrue(results.AnyDouble()); 
    } 

    [TestMethod] 
    public void TestBonusForAllSixes() 
    { 
     //Arrange 
     var results = new DiceResults(6, 6, 6); 

     //Act 
     int bonus = results.GetBonus(); 

     //Assert 
     Assert.AreEqual(20, bonus); 
    } 

    [TestMethod] 
    public void TestBonusForAllFives() 
    { 
     //Arrange 
     var results = new DiceResults(5, 5, 5); 

     //Act 
     int bonus = results.GetBonus(); 

     //Assert 
     Assert.AreEqual(10, bonus); 
    } 

    [TestMethod] 
    public void TestBonusForDoubleTwo() 
    { 
     //Arrange 
     var results = new DiceResults(2, 5, 2); 

     //Act 
     int bonus = results.GetBonus(); 

     //Assert 
     Assert.AreEqual(5, bonus); 
    } 

    [TestMethod] 
    public void TestBonusWhenNoBonus() 
    { 
     //Arrange 
     var results = new DiceResults(1, 2, 3); 

     //Act 
     int bonus = results.GetBonus(); 

     //Assert 
     Assert.AreEqual(0, bonus); 
    } 

    [TestMethod] 
    public void TestPrizeForAllSixesAndCorrectGamble() 
    { 
     //Arrange 
     var results = new DiceResults(6, 6, 6); 

     //Act 
     var prize = results.GetPrize(18, 50); 

     //Assert 
     Assert.AreEqual(120, prize); 
    } 

    [TestMethod] 
    public void TestPrizeForAllSixesAndIncorrectGamble() 
    { 
     //Arrange 
     var results = new DiceResults(6, 6, 6); 

     //Act 
     var prize = results.GetPrize(15, 50); 

     //Assert 
     Assert.AreEqual(20, prize); 
    } 

    //add more tests to cover all cases..... 
}