对于这个掷骰子游戏,我应该同时计算掷两个骰子的输赢。
如果第一次掷骰子时两个骰子之和为7,则玩家获胜。如果第一个滚动不是7,则游戏继续进行,直到滚动与第一个滚动相同的数字,然后玩家获胜。如果玩家在第一次掷中没有7分,但在匹配第一次掷之前得到了7分,那么玩家就输了。
玩家玩1000场游戏,计算输赢。
我不完全确定这个编程赋值的逻辑,但我的代码执行并返回0表示输赢。
有人能告诉我代码出了什么问题吗?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int rolldice()
{
int num[1000], wins, losses;
srand(time(NULL));
for (int i = 0; i < 1000; i++)
{
int dice1 = (rand() % 6) + 1;
int dice2 = (rand() % 6) + 1;
num[i] = dice1 + dice2;
if (num[0] == 7)
{
wins++;
}
if (num[0] != 7 && num[i] == num[0])
{
wins++;
}
if (num[0] != 7 && num[i] == 7)
{
losses++;
}
return wins, losses;
}
}
int main()
{
int wins, losses;
rolldice();
printf("wins: %d nlosses: %d", wins, losses);
}
查看以下内容:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int roll(void)
{
return 2 + (rand() % 6) + (rand() % 6);
}
int game(void)
{
int first = roll();
if (first == 7)
return 1;
while (1) {
int second = roll();
if (second == first)
return 1;
if (second == 7)
return 0;
}
}
int main(void)
{
int wins = 0, i;
srand(time(NULL));
for (i = 0; i < 1000; i++) {
wins += game();
}
printf("wins: %d nlosses: %d", wins, 1000 - wins);
return 0;
}
我做了一个单掷两个骰子的函数。这很方便,因为我们需要两个不同位置的价值。
然后我写了一个游戏的逻辑。第一卷是7的情况很容易。但如果第一个掷硬币不是7,理论上,游戏可能会永远继续下去。这就是为什么或多或少需要while
循环的原因。在while循环中,逻辑颠倒了,我们需要与游戏的第一卷进行比较。这就是为什么我们需要将结果存储在变量first
中。
第三部分只是让游戏玩1000次并计算获胜次数。
这里有很多问题:
-
默认情况下,In C变量未初始化为0-请检查您的
wins
和losses
。增加一个变量需要读取它,而读取一个未初始化的变量会立即成为未定义的行为。 -
你不能在C中返回两个值。你可以制作一个可以容纳两个值并返回一个包装器的包装器,或者将指针传递到函数中并修改其地址处的数据,或者使用文件中随处可见的静态变量。取而代之的是一个逗号运算符,它总是返回第二个值。
-
main()
函数中声明的wins
和losses
变量与rolldice()
函数中的wins
和losses
变量没有任何连接。关于前面的问题,您可能希望使用指针(尽管静态变量会更容易(。 -
代码背后的逻辑被破坏了。这个
for
循环模拟单游戏,在获得胜利或失败后,它应该是break;
。但事实并非如此,所以即使你能看到结果,它们也是毫无意义的。 -
return
语句在for
循环中,总是在一次迭代后退出。这显然也破坏了整个模拟。 -
当比较
num[i] == num[0]
时,你应该检查i == 0
,否则它总是成功的,玩家总是赢的。
修复这些问题可以提供代码工作所需的最低修复:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
int wins = 0;
int losses = 0;
int rolldice()
{
int num[1000];
srand(time(NULL));
for (int game = 0; game < 1000; game++)
{
for(int i = 0; true; i++) // simulate a single game
{
int dice1 = (rand() % 6) + 1;
int dice2 = (rand() % 6) + 1;
num[i] = dice1 + dice2;
if (num[0] == 7)
{
wins++;
break;
}
if (num[0] != 7 && num[i] == num[0] && i != 0)
{
wins++;
break;
}
if (num[0] != 7 && num[i] == 7)
{
losses++;
break;
}
}
}
}
int main()
{
rolldice();
printf("wins: %d nlosses: %d", wins, losses);
}
这段代码与您的代码尽可能接近,只是这个版本正在运行。然而,还有很多其他改进可以做,请参阅其他评论。