练习3-1
#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; /* 胜利 */ // } //} void count_no_disp_result(int result) { switch (result) { case 0: draw_no++; puts("平局。"); break; /* 平局 */ case 1: lose_no++; puts("你输了。"); break; /* 失败 */ case 2: win_no++; puts("你赢了。"); break; /* 胜利 */ } return; } /*--- 确认是否再次挑战 ---*/ 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(judge); /* 更新胜利/失败/平局次数 */ //disp_result(judge); /* 显示判断结果 */ count_no_disp_result(judge);//count_no和disp_result整合成一个函数 retry = confirm_retry(); /* 确认是否再次挑战 */ } while (retry == 1); printf("%d胜%d负%d平。\n", win_no, lose_no, draw_no); return 0; }练习3-2
#include <time.h> #include <stdio.h> #include <stdlib.h> int human; /* 玩家的手势 */ int comp; /* 计算机的手势 */ int win_no; /* 胜利次数 */ int lose_no; /* 失败次数 */ int draw_no; /* 平局次数 */ char *hd[] = { "石头", "剪刀", "布" }; /* 手势 */ int gamenumber;/*游戏次数*/ /*--- 初始处理 ---*/ void initialize(void) { win_no = 0; /* 胜利次数 */ lose_no = 0; /* 失败次数 */ draw_no = 0; /* 平局次数 */ srand(time(NULL)); /* 设定随机数种子 */ printf("猜拳游戏开始!!\n"); printf("要猜赢几次?"); scanf("%d",&gamenumber); } /*--- 运行猜拳游戏(读取/生成手势) ---*/ 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; /* 胜负 */ initialize(); /* 初始处理 */ do { jyanken(); /* 运行猜拳游戏 */ printf("我出%s,你出%s。\n", hd[comp], hd[human]);/* 显示计算机和玩家的手势 */ judge = (human - comp + 3) % 3; /* 判断胜负 */ count_no(judge); /* 更新胜利/失败/平局次数 */ disp_result(judge); /* 显示判断结果 */ } while (win_no < gamenumber && lose_no < gamenumber); printf(win_no == 3 ? "\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 human; /* 玩家的手势 */ int comp; /* 计算机的手势 */ int win_no; /* 胜利次数 */ int lose_no; /* 失败次数 */ int draw_no; /* 平局次数 */ char *hd[] = { "石头", "剪刀", "布" }; /* 手势 */ int gamenumber;/*游戏次数*/ /*--- 初始处理 ---*/ void initialize(void) { win_no = 0; /* 胜利次数 */ lose_no = 0; /* 失败次数 */ draw_no = 0; /* 平局次数 */ srand(time(NULL)); /* 设定随机数种子 */ printf("猜拳游戏开始!!\n"); printf("要猜赢几次?"); scanf("%d",&gamenumber); } /*--- 运行猜拳游戏(读取/生成手势) ---*/ void jyanken(void) { int i; do { comp = rand() % 3; /* 用随机数生成计算机的手势(0~2)*/ } while (comp==1);//当生成剪刀时继续生成。。直至生成石头或布 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; /* 胜负 */ initialize(); /* 初始处理 */ do { jyanken(); /* 运行猜拳游戏 */ printf("我出%s,你出%s。\n", hd[comp], hd[human]);/* 显示计算机和玩家的手势 */ judge = (human - comp + 3) % 3; /* 判断胜负 */ count_no(judge); /* 更新胜利/失败/平局次数 */ disp_result(judge); /* 显示判断结果 */ } while (win_no < gamenumber && lose_no < gamenumber); printf(win_no == 3 ? "\n□你赢了。\n" : "\n■我赢了。\n"); printf("%d胜%d负%d平。\n", win_no, lose_no, draw_no); return 0; }练习3-4
#include <time.h> #include <stdio.h> #include <stdlib.h> int human; /* 玩家的手势 */ int comp; /* 计算机的手势 */ int win_no; /* 胜利次数 */ int lose_no; /* 失败次数 */ int draw_no; /* 平局次数 */ char *hd[] = { "石头", "剪刀", "布" }; /* 手势 */ int gamenumber;/*游戏次数*/ static int currentgamenumber;/*目前第几次,自动初始化为0*/ /*--- 初始处理 ---*/ void initialize(void) { win_no = 0; /* 胜利次数 */ lose_no = 0; /* 失败次数 */ draw_no = 0; /* 平局次数 */ srand(time(NULL)); /* 设定随机数种子 */ printf("猜拳游戏开始!!\n"); printf("要猜赢几次?"); scanf("%d",&gamenumber); } /*--- 运行猜拳游戏(读取/生成手势) ---*/ void jyanken(void) { int i; if (currentgamenumber == 0) comp = 0;//强行让计算机第一次出石头 else comp = rand() % 3; /* 用随机数生成计算机的手势(0~2)*/ currentgamenumber++; 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; /* 胜负 */ initialize(); /* 初始处理 */ do { jyanken(); /* 运行猜拳游戏 */ printf("我出%s,你出%s。\n", hd[comp], hd[human]);/* 显示计算机和玩家的手势 */ judge = (human - comp + 3) % 3; /* 判断胜负 */ count_no(judge); /* 更新胜利/失败/平局次数 */ disp_result(judge); /* 显示判断结果 */ } while (win_no < gamenumber && lose_no < gamenumber); printf(win_no == 3 ? "\n□你赢了。\n" : "\n■我赢了。\n"); printf("%d胜%d负%d平。\n", win_no, lose_no, draw_no); return 0; }练习3-5
#include <time.h> #include <stdio.h> #include <stdlib.h> int human; /* 玩家的手势 */ int comp; /* 计算机的手势 */ int win_no; /* 胜利次数 */ int lose_no; /* 失败次数 */ int draw_no; /* 平局次数 */ char *hd[] = { "石头", "剪刀", "布" }; /* 手势 */ int gamenumber;/*游戏次数*/ static int currentgamenumber;/*目前第几次,自动初始化为0*/ /*--- 初始处理 ---*/ void initialize(void) { win_no = 0; /* 胜利次数 */ lose_no = 0; /* 失败次数 */ draw_no = 0; /* 平局次数 */ srand(time(NULL)); /* 设定随机数种子 */ printf("猜拳游戏开始!!\n"); printf("要猜赢几次?(一直猜请输入-1):"); scanf("%d",&gamenumber); } /*--- 运行猜拳游戏(读取/生成手势) ---*/ void jyanken(void) { int i; if (currentgamenumber %5 != 0) comp = rand() % 3; /* 用随机数生成计算机的手势(0~2)*/ currentgamenumber++; 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); if(currentgamenumber % 5 == 0) comp = (human + 2) % 3;//计算机每5次后出 } /*--- 更新胜利/失败/平局次数 ---*/ 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; /* 胜负 */ initialize(); /* 初始处理 */ if (gamenumber == -1) { printf("一直猜\n"); while(1) { jyanken(); /* 运行猜拳游戏 */ printf("我出%s,你出%s。\n", hd[comp], hd[human]);/* 显示计算机和玩家的手势 */ judge = (human - comp + 3) % 3; /* 判断胜负 */ count_no(judge); /* 更新胜利/失败/平局次数 */ disp_result(judge); /* 显示判断结果 */ } } else { printf("猜%d次\n",gamenumber); do { jyanken(); /* 运行猜拳游戏 */ printf("我出%s,你出%s。\n", hd[comp], hd[human]);/* 显示计算机和玩家的手势 */ judge = (human - comp + 3) % 3; /* 判断胜负 */ count_no(judge); /* 更新胜利/失败/平局次数 */ disp_result(judge); /* 显示判断结果 */ } while (win_no < gamenumber && lose_no < gamenumber); } printf(win_no == 3 ? "\n□你赢了。\n" : "\n■我赢了。\n"); printf("%d胜%d负%d平。\n", win_no, lose_no, draw_no); return 0; }
练习3-6 待做 学过第五章之后做
练习3-7
#include <time.h> #include <stdio.h> #include <stdlib.h> int human; /* 玩家的手势 */ int comp1; /* 计算机1的手势 */ int comp2; int win_no; /* 胜利次数 */ int lose_no; /* 失败次数 */ int draw_no; /* 平局次数 */ char *hd[] = { "石头", "剪刀", "布" }; /* 手势 */ int gamenumber;/*游戏次数*/ static int currentgamenumber;/*目前第几次,自动初始化为0*/ /*--- 初始处理 ---*/ void initialize(void) { win_no = 0; /* 胜利次数 */ lose_no = 0; /* 失败次数 */ draw_no = 0; /* 平局次数 */ srand(time(NULL)); /* 设定随机数种子 */ printf("猜拳游戏开始!!\n"); printf("要猜赢几次?(一直猜请输入-1):"); scanf("%d",&gamenumber); } /*--- 运行猜拳游戏(读取/生成手势) ---*/ void jyanken(void) { int i; comp1 = rand() % 3; /* 用随机数生成计算机1的手势(0~2)*/ comp2 = rand() % 3; /* 用随机数生成计算机2的手势(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; /* 胜负 */ initialize(); /* 初始处理 */ if (gamenumber == -1) { printf("一直猜\n"); while(1) { jyanken(); /* 运行猜拳游戏 */ printf("计算机1出%s,计算机2出%s,你出%s。\n", hd[comp1], hd[comp2], hd[human]);/* 显示计算机1/2和玩家的手势 */ //if (((human != comp1) && (human != comp2) && (comp1 != comp2)) || ((human == comp1) && (human == comp2))) if ((human + comp1 + comp2 == 0) || (human + comp1 + comp2 == 3) || (human + comp1 + comp2 == 6)) judge = 0;//平局 else if ((((human - comp1 + 3) % 3 == 1) && (((human - comp2 + 3) % 3 == 1) || ((human - comp2 + 3) % 3 == 0)))//human输comp1且输或平comp2 || (((human - comp2 + 3) % 3 == 1) && (((human - comp1 + 3) % 3 == 1) || ((human - comp1 + 3) % 3 == 0))))//human输comp2,输或平comp1 judge = 1;//human输了 else if ((((human - comp1 + 3) % 3 == 2) && (((human - comp2 + 3) % 3 == 2) || ((human - comp2 + 3) % 3 == 0)))//human赢comp1且赢或平comp2 || (((human - comp2 + 3) % 3 == 2) && (((human - comp1 + 3) % 3 == 2) || ((human - comp1 + 3) % 3 == 0)))) judge = 2;//human赢了 else printf("bug!\n"); //judge = (human - comp + 3) % 3; /* 判断胜负 */ count_no(judge); /* 更新胜利/失败/平局次数 */ disp_result(judge); /* 显示判断结果 */ } } else { printf("猜%d次\n",gamenumber); do { jyanken(); /* 运行猜拳游戏 */ if ((human + comp1 + comp2 == 0) || (human + comp1 + comp2 == 3) || (human + comp1 + comp2 == 6)) judge = 0;//平局 else if ((((human - comp1 + 3) % 3 == 1) && (((human - comp2 + 3) % 3 == 1) || ((human - comp2 + 3) % 3 == 0)))//human输comp1且输或平comp2 || (((human - comp2 + 3) % 3 == 1) && (((human - comp1 + 3) % 3 == 1) || ((human - comp1 + 3) % 3 == 0))))//human输comp2,输或平comp1 judge = 1;//human输了 else if ((((human - comp1 + 3) % 3 == 2) && (((human - comp2 + 3) % 3 == 2) || ((human - comp2 + 3) % 3 == 0)))//human赢comp1且赢或平comp2 || (((human - comp2 + 3) % 3 == 2) && (((human - comp1 + 3) % 3 == 2) || ((human - comp1 + 3) % 3 == 0)))) judge = 2;//human赢了 else printf("bug!\n"); //judge = (human - comp + 3) % 3; /* 判断胜负 */ count_no(judge); /* 更新胜利/失败/平局次数 */ disp_result(judge); /* 显示判断结果 */ } while (win_no < gamenumber && lose_no < gamenumber); } printf(win_no == 3 ? "\n□你赢了。\n" : "\n■我赢了。\n"); printf("%d胜%d负%d平。\n", win_no, lose_no, draw_no); return 0; }练习3-8 待做 是否有通用一些的算法?如果5人对战,6人对战。。。。?