练习3-1
//编写一个程序,把List 3-9程序中的函数count_no和disp_result整合成一个函数,然后讨论更改前和更改后的程序。 #include <time.h> #include <stdio.h> #include <stdlib.h> int human; /* 玩家的手势 */ int comp; /* 计算机的手势 */ int win_no; /* 胜利次数 */ int lose_no; /* 失败次数 */ int draw_no; /* 平局次数 */ char *hd[] = {"石头", "剪刀", "布"}; /* 手势 */ /*--- 初始处理 ---*/ void initialize(void) { win_no = 0; /* 胜利次数 */ lose_no = 0; /* 失败次数 */ draw_no = 0; /* 平局次数 */ srand(time(NULL)); /* 设定随机数种子 */ printf("猜拳游戏开始!!\n"); } /*--- 运行猜拳游戏(读取/生成手势)---*/ void jyanken(void) { int i; comp = rand() % 3; /* 用随机数生成计算机的手势(0~2)*/ do { printf("\n\a石头剪刀布 ···"); for (i = 0; i < 3; i++) printf(" (%d)%s", i, hd[i]); printf(":"); scanf("%d", &human); /* 读取玩家的手势 */ } while (human < 0 || human > 2); } /*--- 更新胜利/失败/平局次数 并显示结果---*/ void count_no_result(int result) { switch (result) { case 0: draw_no++; puts("平局。"); break; /* 平局 */ case 1: lose_no++; puts("你输了。"); break; /* 失败 */ case 2: win_no++; puts("你赢了。"); break; /* 胜利 */ } } /*--- 确认是否再次挑战 ---*/ int confirm_retry(void) { int x; printf("再来一次吗···(0)否 (1)是:"); scanf("%d", &x); return x; } int main(void) { int judge; /* 胜负 */ int retry; /* 再来一次?*/ initialize(); /* 初始处理 */ do { jyanken(); /* 运行猜拳游戏 */ /* 显示计算机和玩家的手势 */ printf("我出%s,你出%s。\n", hd[comp], hd[human]); judge = (human - comp + 3) % 3; /* 判断胜负 */ count_no_result(judge); retry = confirm_retry(); /* 确认是否再次挑战 */ } while (retry == 1); printf("%d胜%d负%d平。\n", win_no, lose_no, draw_no); return 0; }练习3-2
//把List 3-10中的猜赢3次拳泛化为猜赢n次拳。在游戏一开始就问“要猜赢几次?”,让玩家来输入n的值。 #include <time.h> #include <stdio.h> #include <stdlib.h> int human; /* 玩家的手势 */ int comp; /* 计算机的手势 */ int win_no; /* 胜利次数 */ int lose_no; /* 失败次数 */ int draw_no; /* 平局次数 */ char *hd[] = {"石头", "剪刀", "布"}; /* 手势 */ /*--- 初始处理 ---*/ void initialize(void) { win_no = 0; /* 胜利次数 */ lose_no = 0; /* 失败次数 */ draw_no = 0; /* 平局次数 */ srand(time(NULL)); /* 设定随机数种子 */ printf("猜拳游戏开始!!\n"); } /*--- 运行猜拳游戏(读取/生成手势) ---*/ void jyanken(void) { int i; comp = rand() % 3; /* 用随机数生成计算机的手势(0~2)*/ do { printf("\n\a石头剪刀布 ···"); for (i = 0; i < 3; i++) printf(" (%d)%s", i, hd[i]); printf(":"); scanf("%d", &human); /* 读取玩家的手势 */ } while (human < 0 || human > 2); } /*--- 更新胜利/失败/平局次数 ---*/ void count_no(int result) { switch (result) { case 0: draw_no++; break; /* 平局 */ case 1: lose_no++; break; /* 失败 */ case 2: win_no++; break; /* 胜利 */ } } /*--- 显示判断结果 ---*/ void disp_result(int result) { switch (result) { case 0: puts("平局。"); break; /* 平局 */ case 1: puts("你输了。"); break; /* 失败 */ case 2: puts("你赢了。"); break; /* 胜利 */ } } int main(void) { int judge; /* 胜负 */ int n; initialize(); /* 初始处理 */ printf("\n要猜赢几次?"); scanf("%d",&n); do { jyanken(); /* 运行猜拳游戏 */ /* 显示计算机和玩家的手势 */ printf("我出%s,你出%s。\n", hd[comp], hd[human]); judge = (human - comp + 3) % 3; /* 判断胜负 */ count_no(judge); /* 更新胜利/失败/平局次数 */ disp_result(judge); /* 显示判断结果 */ } while (win_no < n && lose_no < n); printf(win_no == n ? "\n□你赢了。\n" : "\n■我赢了。\n"); printf("%d胜%d负%d平。\n", win_no, lose_no, draw_no); return 0; }练习3-3
//编写一个“猜拳游戏”,让计算机只能出石头和布。 #include <time.h> #include <stdio.h> #include <stdlib.h> int main(void) { int comp,human,judge; char *hd[]={"布","石头","剪刀"}; //注意这里的顺序要变。 int win=0,lose=0,draw=0; int i,retry; srand (time(NULL)); printf("猜拳游戏开始!\n"); do { comp = rand()%2; do { printf("\n\a石头剪刀布···"); for (i=0; i<3; i++) printf(" (%d)%s",i,hd[i]); printf(":"); scanf("%d",&human); } while (human < 0 || human > 2); printf("我出%s,你出%s。\n", hd[comp], hd[human]); judge = (human - comp + 3) % 3; switch (judge) { case 0: draw++; puts("平局。"); break; case 1: lose++; puts("你输了。"); break; case 2: win++; puts("你赢了。"); break; } printf("再来一次吗···(0)否 (1)是:"); scanf("%d", &retry); } while (retry == 1); printf("%d胜%d负%d平。\n", win, lose, draw); return 0; }练习3-4
//编写一个“猜拳游戏”,让计算机第1次一定出石头。 #include <time.h> #include <stdio.h> #include <stdlib.h> int main(void) { int comp,human,judge; char *hd[]={"石头","剪刀","布"}; int win=0,lose=0,draw=0; int i,retry; int sum = 0; //新增一个sum变量统计猜拳次数,次数为1时单独讨论 srand (time(NULL)); printf("猜拳游戏开始!\n"); do { comp = rand()%3; do { printf("\n\a石头剪刀布···"); for (i=0; i<3; i++) printf(" (%d)%s",i,hd[i]); printf(":"); scanf("%d",&human); } while (human < 0 || human > 2); sum++; if (sum == 1) { printf("我出%s,你出%s。\n", hd[0], hd[human]); judge = (human - 0 + 3) % 3; //注意这里要单独判断胜负,否则comp仍然是个随机值 } else { printf("我出%s,你出%s。\n", hd[comp], hd[human]); judge = (human - comp + 3) % 3; } switch (judge) { case 0: draw++; puts("平局。"); break; case 1: lose++; puts("你输了。"); break; case 2: win++; puts("你赢了。"); break; } printf("再来一次吗···(0)否 (1)是:"); scanf("%d", &retry); } while (retry == 1); printf("%一共%d局,其中%d胜%d负%d平。\n", sum, win, lose, draw); return 0; }练习3-5
//编写一个“猜拳游戏”,让计算机每5次都会“后出”。编写两个版本,一个是只要玩家愿意就能不断重复玩的“猜拳游戏”,另一个是猜赢n次就会结束的“猜拳游戏”。 #include <time.h> #include <stdio.h> #include <stdlib.h> int win=0,lose=0,draw=0,sum=0; int comp,human,judge; char *hd[]={"石头","剪刀","布"}; void version1 () { int i,retry; do { do { printf("\n\a石头剪刀布···"); for (i=0; i<3; i++) printf(" (%d)%s",i,hd[i]); printf(":"); scanf("%d",&human); } while (human < 0 || human > 2); sum++; if (sum%5 == 0) comp = (human + 2) % 3; else comp = rand()%3; printf("第%d盘:我出%s,你出%s。\n", sum, hd[comp], hd[human]); judge = (human - comp + 3) % 3; switch (judge) { case 0: draw++; puts("平局。"); break; case 1: lose++; puts("你输了。"); break; case 2: win++; puts("你赢了。"); break; } printf("再来一次吗···(0)否 (1)是:"); scanf("%d", &retry); } while (retry == 1); } void version2 () { int n,i; printf("\n要猜赢几次?"); scanf("%d",&n); do { do { printf("\n\a石头剪刀布···"); for (i=0; i<3; i++) printf(" (%d)%s",i,hd[i]); printf(":"); scanf("%d",&human); } while (human < 0 || human > 2); sum++; if (sum%5 == 0) comp = (human + 2) % 3; else comp = rand()%3; printf("第%d盘:我出%s,你出%s。\n", sum, hd[comp], hd[human]); judge = (human - comp + 3) % 3; switch (judge) { case 0: draw++; puts("平局。"); break; case 1: lose++; puts("你输了。"); break; case 2: win++; puts("你赢了。"); break; } } while (win<n && lose<n); printf(win == n ? "\n□你赢了。\n" : "\n■我赢了。\n"); } int main(void) { int version; srand (time(NULL)); printf("猜拳游戏开始!\n"); choose: printf("你想玩哪个版本?不断重复---1 自动结束---2:"); scanf("%d",&version); if (version == 1) version1 (); else if (version == 2) version2 (); else { printf("ERROR!\n"); goto choose; } printf("%一共%d局,其中%d胜%d负%d平。\n", sum, win, lose, draw); return 0; }练习3-6
//编写一个“猜拳游戏”,让游戏结束时显示玩家和计算机出过的所有手势和胜负的历史记录。编写两个版本,一个是只要玩家愿意就能不断重复玩的“猜拳游戏”,另一个是猜赢n次就会结束的“猜拳游戏”。 #include <time.h> #include <stdio.h> #include <stdlib.h> int win=0,lose=0,draw=0,sum=0; int comp,human,judge; char *hd[]={"石头","剪刀","布"}; char human_record[100]; char comp_record[100]; char result_record[100]; void result_show (judge) { switch (judge) { case 0: draw++; puts("平局。"); break; case 1: lose++; puts("你输了。"); break; case 2: win++; puts("你赢了。"); break; } } void version1 () { int i,retry; do { do { printf("\n\a石头剪刀布···"); for (i=0; i<3; i++) printf(" (%d)%s",i,hd[i]); printf(":"); scanf("%d",&human); } while (human < 0 || human > 2); comp = rand()%3; sum++; human_record[sum] = human; comp_record[sum] = comp; printf("第%d盘:我出%s,你出%s。\n", sum, hd[comp], hd[human]); judge = (human - comp + 3) % 3; result_record[sum] = judge; result_show(judge); printf("再来一次吗···(0)否 (1)是:"); scanf("%d", &retry); } while (retry == 1); } void version2 () { int n,i; printf("\n要猜赢几次?"); scanf("%d",&n); do { do { printf("\n\a石头剪刀布···"); for (i=0; i<3; i++) printf(" (%d)%s",i,hd[i]); printf(":"); scanf("%d",&human); } while (human < 0 || human > 2); comp = rand()%3; sum++; human_record[sum] = human; comp_record[sum] = comp; printf("第%d盘:我出%s,你出%s。\n", sum, hd[comp], hd[human]); judge = (human - comp + 3) % 3; result_record[sum] = judge; result_show(judge); } while (win<n && lose<n); printf(win == n ? "\n□你赢了。\n" : "\n■我赢了。\n"); } int main(void) { int version; int i; srand (time(NULL)); printf("猜拳游戏开始!\n"); choose: printf("你想玩哪个版本?不断重复---1 自动结束---2:"); scanf("%d",&version); if (version == 1) version1 (); else if (version == 2) version2 (); else { printf("ERROR!\n"); goto choose; } printf("\n一共%d局,其中%d胜%d负%d平。\n\n", sum, win, lose, draw); for (i=1; i<=sum; i++) { printf("第%2d局:你出 %4s ,我出 %4s ,",i,hd[human_record[i]],hd[comp_record[i]]); printf("结果是 "); result_show(result_record[i]); } return 0; }练习3-7
//编写一个3人对战的“猜拳游戏”。由计算机来担任2个角色,这2个角色的手势都用随机数来生成。编写两个版本,一个是只要玩家愿意就能不断重复玩的“猜拳游戏”,另一个是猜赢n次就会结束的“猜拳游戏”。 #include <time.h> #include <stdio.h> #include <stdlib.h> int win=0,lose=0,draw=0,sum=0; int comp1,comp2,human,judge; char *hd[]={"石头","剪刀","布"}; int result_cal (int comp) { int x; x = (human - comp + 3) % 3; if (x == 1) return -1; else if (x == 2) return 1; else return 0; } void result () { int j1,j2; j1 = result_cal(comp1); j2 = result_cal(comp2); judge = j1+j2; if (judge >0 ) { win++; puts("你赢了。"); } else if (judge <0 ) { lose++; puts("你输了。"); } else { draw++; puts("平局。"); } } void computer_choose () { sum++; comp1 = rand()%3; comp2 = rand()%3; printf("第%d盘:第一个人出%s,第二个人出%s,你出%s。\n", sum, hd[comp1], hd[comp2], hd[human]); } void human_choose () { int i; do { printf("\n\a石头剪刀布···"); for (i=0; i<3; i++) printf(" (%d)%s",i,hd[i]); printf(":"); scanf("%d",&human); } while (human < 0 || human > 2); } void version1 () { int i,retry; do { human_choose(); computer_choose(); result(); printf("再来一次吗···(0)否 (1)是:"); scanf("%d", &retry); } while (retry == 1); } void version2 () { int n,i; printf("\n要猜赢几次?"); scanf("%d",&n); do { human_choose(); computer_choose(); result(); } while (win<n && lose<n); printf(win == n ? "\n□你赢了。\n" : "\n■我赢了。\n"); } int main(void) { int version; srand (time(NULL)); printf("猜拳游戏开始!\n"); choose: printf("你想玩哪个版本?不断重复---1 自动结束---2:"); scanf("%d",&version); if (version == 1) version1 (); else if (version == 2) version2 (); else { printf("ERROR!\n"); goto choose; } printf("%一共%d局,其中%d胜%d负%d平。\n", sum, win, lose, draw); return 0; }练习3-8
//编写一个4人对战的“猜拳游戏”。由计算机来担任3个角色,这3个角色的手势都用随机数来生成。编写两个版本,一个是只要玩家愿意就能不断重复玩的“猜拳游戏”,另一个是猜赢n次就会结束的“猜拳游戏”。 #include <time.h> #include <stdio.h> #include <stdlib.h> int win=0,lose=0,draw=0,sum=0; int comp1,comp2,comp3,human,judge; char *hd[]={"石头","剪刀","布"}; int result_cal (int comp) { int x; x = (human - comp + 3) % 3; if (x == 1) return -1; else if (x == 2) return 1; else return 0; } void result () { int j1,j2,j3; j1 = result_cal(comp1); j2 = result_cal(comp2); j3 = result_cal(comp3); judge = j1+j2+j3; if (judge >0 ) { win++; puts("你赢了。"); } else if (judge <0 ) { lose++; puts("你输了。"); } else { draw++; puts("平局。"); } } void computer_choose () { sum++; comp1 = rand()%3; comp2 = rand()%3; comp3 = rand()%3; printf("第%d盘:第一个人出%s,第二个人出%s,第三个人出%s,你出%s。\n", sum, hd[comp1], hd[comp2], hd[comp3], hd[human]); } void human_choose () { int i; do { printf("\n\a石头剪刀布···"); for (i=0; i<3; i++) printf(" (%d)%s",i,hd[i]); printf(":"); scanf("%d",&human); } while (human < 0 || human > 2); } void version1 () { int i,retry; do { human_choose(); computer_choose(); result(); printf("再来一次吗···(0)否 (1)是:"); scanf("%d", &retry); } while (retry == 1); } void version2 () { int n,i; printf("\n要猜赢几次?"); scanf("%d",&n); do { human_choose(); computer_choose(); result(); } while (win<n && lose<n); printf(win == n ? "\n□你赢了。\n" : "\n■我赢了。\n"); } int main(void) { int version; srand (time(NULL)); printf("猜拳游戏开始!\n"); choose: printf("你想玩哪个版本?不断重复---1 自动结束---2:"); scanf("%d",&version); if (version == 1) version1 (); else if (version == 2) version2 (); else { printf("ERROR!\n"); goto choose; } printf("%一共%d局,其中%d胜%d负%d平。\n", sum, win, lose, draw); return 0; }