掷骰子游戏中的C数输赢

  • 本文关键字:游戏 掷骰子 c dice
  • 更新时间 :
  • 英文 :


对于这个掷骰子游戏,我应该同时计算掷两个骰子的输赢。

如果第一次掷骰子时两个骰子之和为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次并计算获胜次数。

这里有很多问题:

  1. 默认情况下,In C变量未初始化为0-请检查您的winslosses。增加一个变量需要读取它,而读取一个未初始化的变量会立即成为未定义的行为。

  2. 你不能在C中返回两个值。你可以制作一个可以容纳两个值并返回一个包装器的包装器,或者将指针传递到函数中并修改其地址处的数据,或者使用文件中随处可见的静态变量。取而代之的是一个逗号运算符,它总是返回第二个值。

  3. main()函数中声明的winslosses变量与rolldice()函数中的winslosses变量没有任何连接。关于前面的问题,您可能希望使用指针(尽管静态变量会更容易(。

  4. 代码背后的逻辑被破坏了。这个for循环模拟游戏,在获得胜利或失败后,它应该是break;。但事实并非如此,所以即使你能看到结果,它们也是毫无意义的。

  5. return语句在for循环中,总是在一次迭代后退出。这显然也破坏了整个模拟。

  6. 当比较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);
}

这段代码与您的代码尽可能接近,只是这个版本正在运行。然而,还有很多其他改进可以做,请参阅其他评论。

最新更新