【问题标题】:C# Bowling Game Calculation IssueC# 保龄球游戏计算问题
【发布时间】:2014-05-20 08:53:01
【问题描述】:

我的 C# 保龄球游戏有问题,我会寻求一些帮助,我会尽力解释代码。我已经尝试解决这个问题很长时间了,但还没有成功。

计算正常,但唯一的问题是我的罢工,罢工应计为 10 + 接下来的 2 次投掷。

那么我的程序做了什么:

如果您收到罢工,第一个值将设置为 10,然后我输入另一个罢工并将值设置为 21 但应该是 20。第二个框的值应该是 30。

所以首先我有 3 个数组来保存所有的文本框

    summa = new TextBox[] { textBox14, textBox15, textBox16, textBox17, textBox18, textBox19 };
    slag1 = new TextBox[] { textBox1, textBox3, textBox5, textBox7, textBox9, textBox11 };
    slag2 = new TextBox[] { textBox2, textBox4, textBox6, textBox8, textBox10, textBox12 };

所以我有两种方法,Slag1()Slag2() 罢工在Slag1() 方法中运行。

这是我用来计算罢工的部分

if (strike == true)
        {
            GotStrike[omgang] = true;
        }
        //strike = false;

        //Kollar ifall textbox är lika med 10
        if (slag1[omgang].Text == "10")
        {
            //Om text box är lika med 10 ändra värdet till X
            //Lägg till 10 poäng på total
            //Skriv ut värdet på summa (textbox)
            Arbetar = true;
            slag1[omgang].Text = "X";
            total += 9;
            summa[omgang].Text = total.ToString();
            omgang++;
            if (omgang == 6)
            {
                omgang--;
            }
            strike = true;
        }
        else if (slag1[omgang].Text == "X")
        {
            return;
        }
        else
        {
            checkSlag1 = Convert.ToInt32(slag1[omgang].Text);
            total += checkSlag1;
            summa[omgang].Text = total.ToString();

            if (strike == true)
            {
                if (omgang != 0)
                {
                    total += 10;
                    slag1[omgang - 1].Text = total.ToString();
                    if (omgang != 1)
                    {
                        slag1[omgang - 2].Text = total.ToString();
                    }
                    else
                    {

                    }
                }
                else
                {

                }
            }
        }
    }

有点难解释,但希望你能理解,如果你不明白,请告诉我,我会写一个更好的解释。

我希望您知道保龄球比赛的运作方式,一次击球 = 第一次击球以及接下来两次击球的价值。因此,如果我击中一击,我得到 10 的值,击中 2 的值为 10,击中 3 的值为 10。这就是索引 0 的总和。

【问题讨论】:

  • 如果您不理解这部分代码,您可以在这里免费查看源代码:pastebin.com/p6cttLX3
  • 你混合了 UI 和逻辑 (SoC)。如果将它们分开,编写测试以找出哪里开始出错会容易得多。 Bowling 也用于(我认为)Kent Beck 的《测试驱动开发》一书中。
  • 你能举例说明我应该如何构建我的代码吗?因为我不知道你想告诉我什么。
  • 你应该看看这本书Agile Principles, Patterns, and Practices in C# (Robert C. Martin)。我同意您应该使用 *TDD 来解决此类问题,这本书将对此有所帮助,并且还涉及构建保龄球游戏。
  • 我只想给文本框 +10,假设 textbox1 是 10,textbox2 10 它应该在文本框 1 上 +10,这给我一个 20 的值,然后是 20 + 10文本框 2. 我尝试做的是使用 summa[omgang - 1] & summa[omgang - 2],它应该返回 1 轮,然后每次罢工 2 轮。

标签: c# .net visual-studio visual-studio-2012


【解决方案1】:

由于您在计算保龄球比赛的正确分数时遇到问题,我建议您去掉保龄球比赛的机制,编写测试来检查不同的投掷是否正常工作(即正常、备用和击球)。然后你可以修改代码,当所有测试都通过时,你的评分就起作用了。之后,您可以创建任何使用保龄球游戏的 UI。

还要检查我在评论中提供的链接。该代码使用 Java 编写,但与 C# 非常相似,并提供了一个保龄球游戏 API 示例,并说明了它们是如何进行特定设计的。

您的保龄球比赛可能如下所示: (我真的不知道保龄球规则)

public class Bowling
{
     public void Throw(int count) // How do you call these things that you need to knock over...
     {
         Debug.Assert(count >= 0);
         Debug.Assert(count <= 12);
         // ... Lots of interesting code.
     }

     public int GetScore()
     {
          return 16;
     }
}

这段代码显然不起作用。诀窍是编写运行“红色”(=失败)的测试,然后编写代码直到测试运行“绿色”(=通过)。

对于这些测试,您可以使用 NUnit 等框架,...

[TestClass]
public class BowlingTests
{
    [Test]
    public void ThrowNormal_NormalScore()
    {
        var b = new Bowling();
        b.Throw(5);
        b.Throw(6);

        Assert.That(b.GetScore(), Is.EqualTo(11));
    }

    public void ThrowSpare_SpecialScore()
    {
         var b = new Bowling();
         b.Throw(1);
         b.Throw(11); // = spare
         b.Throw(5);  // score counts for double?
         b.Throw(3);  // No double score

         Assert.That(b.GetScore(), Is.EqualTo(1 + 11 + (5 * 2) + 3));
    }

    // More tests for all the edge cases (strike, special end of game rules etc)
}

【讨论】:

  • 它们被称为 Pins。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
  • 2012-01-31
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
相关资源
最近更新 更多