我正在制作一个摇滚,剪刀游戏形式的应用程序,代码通过,但我似乎无法让它按照应有的方式工作。用户将键入纸张,剪刀或摇滚,然后计算机将选择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!";
}
}
答案 0 :(得分:1)
看起来你误解了Next()
是如何工作的。在你的情况下,你实际上是这样称呼它:
int computerChoice = r1.Next(3);
如果你看一下intellisense,你会看到它说:
返回小于指定最大值的非负随机数。
在这种情况下,您将最大值设置为3
,因此它只会返回值0
,1
或2
。这意味着:
else if (computerChoice == 3)
永远不会被击中。我假设这也是你再次使用while
循环来尝试纠正问题的原因,但它会做同样的事情,不允许计算机选择scissors
。
如果您仍想将rock
,paper
和scissors
的有效值约束为1
,2
和3
,您只需要将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