我正在使用C创建一种掷骰子游戏。
如果总和= 7,11获胜; 如果总和= 2,3,12输; 否则继续。
我的函数play_game()有些问题,因为函数的返回不正确。例如,如果总和为3,有时不会返回1而是2。
int roll_dice(void);
int play_game(void);
int main(){
int sum;
char play;
do{
roll_dice();
play_game();
if (play_game()==0){
printf ("\nYou win!");
printf ("\nPlay again? ");
play=getchar();
}
else {
if (play_game()==1) {
printf ("\nYou lose!");
printf ("\nPlay again? ");
play=getchar();
}
else {
if (play_game()==2) play='y';
else system ("pause");
}
}
}
while (play=='y');
return 0;
}
int roll_dice(void){
int sum = rand()%6 + rand()%6;
return sum;
}
int play_game(void){
int sum = roll_dice();
printf ("\nYou rolled: %d", sum);
if ((sum==7)||(sum==11)) return 0;
else {
if ((sum==2)||(sum==3)||(sum==12)) return 1;
else {
printf ("\nYour point is %d", sum);
return 2;
}
}
}
答案 0 :(得分:5)
您经常拨打play_game
。
在循环开始时调用一次,但丢弃结果。您再次调用它并检查结果是否为0.如果不是,则再次将其称为 并检查结果是否为1,如果不是,则再次将其称为 并且检查结果是否为2。
您需要在每个循环中只调用一次play_game
并存储返回值,以便稍后检查它而无需再次调用该函数。
do{
const int result = play_game(); // save result
if (result ==0){ // use saved result
printf ("\nYou win!");
printf ("\nPlay again? ");
play=getchar();
}
else {
if (result ==1) { // use saved result
printf ("\nYou lose!");
printf ("\nPlay again? ");
play=getchar();
}
else {
if (result ==2) play='y'; // use saved result
else system ("pause");
}
}
}
while (play=='y');
答案 1 :(得分:0)
除了@dbush精确答案中指出的算法问题外,骰子卷未正确模拟。 @Klas Lindbäck
// better name: roll_2dice()
int roll_dice(void){
// int sum = rand()%6 + rand()%6; // wrong simulation
int sum = (rand()%6 + 1) + (rand()%6 + 1); // corrected.
return sum;
}
此外,好的rand()
在计算时间上往往很昂贵。仅使用1 rand()
电话
int roll_2dice(void){
int r = rand()%36; // 36 combinations
int die1 = r/6 + 1;
int die2 = r%6 + 1;
return die1 + die2;
}