C 骰子游戏及其功能
我正在用C创建一种垃圾游戏 如果总和=7,则11胜; 如果总和=2,3,12,则损失; 否则继续 我对函数play_game()有一些问题,因为函数的返回不正确。例如,如果总和为3,有时返回的不是1而是2C 骰子游戏及其功能,c,C,我正在用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 (p
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。如果不是,则再次调用并检查结果是否为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');
除了精细答案中指出的算法问题外,掷骰子的模拟也不正确 此外,好的
rand()
在计算时间上往往比较昂贵。仅使用1rand()调用的备选方案
int roll_2dice(void){
int r = rand()%36; // 36 combinations
int die1 = r/6 + 1;
int die2 = r%6 + 1;
return die1 + die2;
}
如果总和为3,play_game()
不可能返回2。在您的代码中,骰子似乎是0-5,而不是1-6。最好使const int result=play_game()代码>为了清晰起见。两次循环后程序结束,我不明白为什么。@Waltergetchar
函数读取所有字符,包括换行符。如果你读了一行新词,你需要一直调用getchar
,直到你得到其他东西。
int roll_2dice(void){
int r = rand()%36; // 36 combinations
int die1 = r/6 + 1;
int die2 = r%6 + 1;
return die1 + die2;
}