原题:
编写函数模拟掷骰子的游戏(两个骰子)。第一次掷的时候,如果点数之和为7或11则获胜;如果点数之和为2、3或12则落败;其他情况下的点数之和称为“目标”,游戏继续。在后续的投掷中,如果玩家再次掷出“目标”点数则获胜,掷出7则落败,其他情况都忽略,游戏继续进行。每局游戏结束时,程序询问用户是否再玩一次,如果用户输入的回答不是y或Y,程序会显示胜败的次数然后终止。
我的答案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <ctype.h>
int roll_dice(void); bool play_game(void);
int main(void) { char ch = 'y';
srand((unsigned) time(NULL));//配置随机数的种子数。
while (ch == 'y')//循环。 { if (play_game() == true)//返回bool值为true则胜。 { printf("You Win!\n"); } else { printf("You Lose!\n");//返回bool值为false则负。 }
printf("Play again?\n"); ch = tolower(getchar());//读取一个字符。 getchar();//读取换行符,避免换行符影响到下次循环时的ch的值。 printf("\n");
if (ch != 'y') break;//如果ch中的字符不为y,结束循环。 }
return 0; }
bool play_game(void) { int n,point; n = roll_dice();
switch (n) { case 7 : case 11: { printf("You rolled : %d\n",n);//如果掷骰子掷出7和10,胜。 return true; } break; case 2 : case 3 : case 12: { printf("You rolled : %d\n",n);//如果掷骰子掷出2,3,12,负。 return false; } break; default : { printf("You rolled : %d\n",n);//掷出别的点数则继续。 point = n;//把此时的点数值赋给point表示目标值。 conti: n = roll_dice();//再掷一次。(再获取随机点数) if ( point == n) { printf("You rolled : %d\n",n);//与目标值相等则胜。 return true; } else { if ( n == 7) { printf("You rolled : %d\n",n);//掷出7则负。 return false; } else goto conti;//掷出非7且与目标值不相等的值,则继续掷骰子。 } } } }
int roll_dice(void) { int r1,r2,s;
r1 = rand() % 6 + 1;//第一个骰子的点数。 //因为rand()%6取值范围在[0,5]的整数, //所以加1。 r2 = rand() % 6 + 1; s = r1 + r2;//把两个点数相加。
return s;//返回两个骰子点数之和。 }
|
需要注意的一点是:
注意:
在读取字符时,ch = getchar(),读取一个字符,然后回车键,getchar()会读入一个换行符,当循环继续走回来的时候,ch = '\n',而不会读入其他值,此时会出现错误。
解决方法:
在下面再加一个getchar();使换行符被下面的getchar()读入。避免影响下一步的输入。