0

私は単純なサイコロゲームをコーディングしています。フォームは 3 つのテキスト ボックスと多数のラベルで構成されます (後で 1 つのテキスト ボックスをラベルに変更します)。
左上隅に 3 つのサイコロの値が表示されます。
ギャンブルのテキストボックスの左に合計金額が表示されます。

  • ギャンブルテキストボックスにあなたの推測を入力します
  • インゼットのテキストボックスに、賭けたい金額を入力します
  • 賞金のテキストボックスに、獲得した金額が表示されます

基準、

  • 3 つの 6 を投げると、20 のボーナスが得られます。
  • 6 未満のセットを投げると、10 のボーナスが得られます。
  • 何かを2倍に投げると、5のボーナスが得られます
  • ギャンブルが正しければ、インゼットが 2 倍になります (インゼット = 1 で 2 勝)。
  • 賞金はボーナス + インゼットを表示する必要があります

問題は、あなたのギャンブルが合計金額に等しく、+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)

これは常に偽です。ギャンブルは、合計より小さくかつ大きくすることはできません。

ここで必要なのは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 に答える