0

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

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

标准,

  • 当您掷出 3 个 6 时,您将获得 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 奖金才能工作(以及其他套装奖金)。当您的赌注不等于骰子总数时,我还需要申请奖金。

4

3 回答 3

6

这个条件:

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

永远不会实现!

于 2012-10-02T17:03:52.237 回答
4

这是你的问题:

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

这总是错误的。gamble 不能同时小于和大于总数。

我认为你在这里需要的只是else

于 2012-10-02T17:05:02.240 回答
3

其他答案将解决您的根本原因(在同一比较中同时具有 < 和 >)。

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

必须是:

else

这个错误是单元测试的一个很好的广告。只需将结果提取到一个类 (DiceResults) 中,就可以轻松地在运行的应用程序的上下文之外测试所有可能的结果。现在您有重复的逻辑来计算奖金,如果您在更改奖金逻辑时忘记更新两者,这本身很容易导致错误。

我并不是说我的解决方案是最好的代码(随着更多奖励规则的添加,if/else if列表将变得笨拙 -设计模式可以帮助解决这个问题),但是作为对代码的快速重构,它使遵循变得更加简单最终,测试。

我添加了一些测试作为示例;然后很容易添加额外的以测试所有结果。当您添加代码并进行更改时,您可以重新运行测试以检查您没有破坏任何东西。如果您使用的是 Visual Studio,那么您可以轻松地运行单元测试

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

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.....
}
于 2012-10-02T18:05:45.170 回答