Rock Paper Scissors游戏结果错误

时间:2014-01-11 19:19:47

标签: c# winforms

我正在制作一个摇滚,剪刀游戏形式的应用程序,代码通过,但我似乎无法让它按照应有的方式工作。用户将键入纸张,剪刀或摇滚,然后计算机将选择1-3,并且1是摇滚,2是纸,3是剪刀。你会赢,输或者是平局。有时没有印刷来,否则它说你赢了,但你真的输了。如果代码难以理解,请原谅我。我是初学者。

string userAnswer = textBox1.Text;
Random r1 = new Random();
int b = 3;
string comrock = "The computer chose rock!";
string compaper = "The computer chose paper!";
string comscissors = "The computer chose scissors!";
int computerChoice = r1.Next(b);
if (computerChoice == 1)
{
    label4.Text = comrock;
}
else if (computerChoice == 2)
{
    label4.Text = compaper;
}
else if (computerChoice == 3)
{
    label4.Text = comscissors;
}
else
{
    while (computerChoice == 0)
    {
        computerChoice = r1.Next(b);

        if (computerChoice == 1)
        {
            label4.Text = comrock;
        }
        else if (computerChoice == 2)
        {
            label4.Text = compaper;
        }
        else if (computerChoice == 3)
        {
            label4.Text = comscissors;
        }
    }

        if (userAnswer == "rock") ;
        {
            if (computerChoice == 2) ;
            {
                label3.Text = "You lost....";
            }
        }
        if (userAnswer == "paper") ;
        {
            if (computerChoice == 1) ;
            {
                label3.Text = "You Won!";
            }
        }
        if (userAnswer == "rock") ;
        {
            if (computerChoice == 1) ;
            {
                label3.Text = "It's a tie!";
            }
        }
        if (userAnswer == "rock") ;
        {
            if (computerChoice == 3) ;
            {
                label3.Text = "You lost....";
            }
        }
    if (userAnswer == "paper");
    {
        if (computerChoice == 2) ;
        {
            label3.Text = "It's a tie!";
        }
    }
    if (userAnswer == "paper");
    {
        if (computerChoice == 3) ;
        {
            label3.Text = "You lost....";
        }
    }
    if (userAnswer == "scissors");
    {
        if (computerChoice == 2) ;
        {
            label3.Text = "You won!";
        }
    }
    if (userAnswer == "scissors");
    {
        if (computerChoice == 3) ;
        {
            label3.Text = "It's a tie!";
        }
    }
    if (userAnswer == "scissors");
    {
        if (computerChoice == 2) ;
        {
            label3.Text = "You won!";
        }
    }

4 个答案:

答案 0 :(得分:1)

看起来你误解了Next()是如何工作的。在你的情况下,你实际上是这样称呼它:

int computerChoice = r1.Next(3);

如果你看一下intellisense,你会看到它说:

  

返回小于指定最大值的非负随机数。

在这种情况下,您将最大值设置为3,因此它只会返回值012。这意味着:

else if (computerChoice == 3)

永远不会被击中。我假设这也是你再次使用while循环来尝试纠正问题的原因,但它会做同样的事情,不允许计算机选择scissors

如果您仍想将rockpaperscissors的有效值约束为123,您只需要将1添加到调用Next()

的结果中
int computerChoice = r1.Next(b) + 1;

现在您的值已在适当的范围内,您根本不需要while循环。因此,您的computerChoice代码可以简化为:

if (computerChoice == 1)
{
    label4.Text = comrock;
}
else if (computerChoice == 2)
{
    label4.Text = compaper;
}
else if (computerChoice == 3)
{
    label4.Text = comscissors;
}

答案 1 :(得分:0)

您在Random中设置的值具有独占上限。这意味着当您指定r1.Next(3);时,您将获得0,1或2。

我没有检查其余的代码,但尝试更改您传递给r1.Next()的上限:

int b = 4;

...

int computerChoice = r1.Next(b);

答案 2 :(得分:0)

首先,正如Grant Winney所提到的,你永远不会让computerChoice成为3,因为Next(x)会返回

  

大于或等于零且小于maxValue的32位有符号整数;也就是说,返回值的范围通常包括零而不是maxValue。但是,如果maxValue等于零,则返回maxValue。

其次,不要让它返回0.然后你不必在循环时这样做。用户Next(1, 4)仅获取数字{1,2,3}。

然后,将用户输入转换为数字并比较数字

if (userChoice == computerChoice)
{
    // tie
    return;
}
// other comparing

答案 3 :(得分:0)

我刚刚使用C#/ WebApi和AngularJS的前端完成了一个针对岩石剪刀游戏的简短测试项目。它不是一个完整的应用程序,只是一个概念证明,但您可能想查看源代码,看看我是如何以更多的OOP方式构建代码。还包括Specflow和Nunit中的测试。

源代码在github => https://github.com/swin66/RockPaperScissors

你可以尝试app => http://rockpaperscissors.azurewebsites.net