1.游戏规则
石头赢剪刀,剪刀赢布,布赢石头
以1代表剪刀,2代表布,3代表石头。玩家通过选择模拟出拳。
2.游戏思路
1.创建菜单帮助玩家进行选择
2.实现石头剪刀布游戏
(1)玩家通过选择模拟出拳
(2)电脑随机出拳
(3)判断胜负
(4)将结果写入文件
3.查看游戏记录
4.删除历史记录
3.代码实现
1.分别创建头文件game.h、源文件game.c和test.c
game.h:存放自定义函数的声明、引用的标准库头文件等
game.c:存放函数的定义
test.c:用于程序测试
2.创建菜单并对输入的选择进行处理
voidmenu() { printf("******************************\n"); printf("****** 1.进入游戏 *******\n"); printf("****** 2.查看游戏记录 *******\n"); printf("****** 3.删除游戏记录 *******\n"); printf("****** 0.游戏退出 *******\n"); printf("******************************\n"); } intmain() { //选择选项intinput=0; do//循环至少执行一次 { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case1: //玩游戏break; case2: //查看比赛记录break; case3: //删除比赛记录break; case0: printf("游戏已退出\n"); break; default: printf("选择错误,请重新选择!\n"); break; } } while (input); return0; }
3.实现石头剪刀布小游戏
3.1 打印菜单帮助玩家出拳,并对玩家选择进行处理
//游戏菜单voidRPSmenu() { printf("******************************\n"); printf("****** 0.回到主界面 *******\n"); printf("****** 1.剪刀 2.布 *******\n"); printf("****** 3.石头 *******\n"); printf("******************************\n"); } //玩游戏voidRPS() { //玩家出拳intchoose=0; do { //打印游戏菜单RPSmenu(); printf("请选择:>"); scanf("%d", &choose); switch (choose) { case0: printf("已退回主界面!\n"); break; case1: case2: case3: //电脑出拳break; default: printf("选择错误,请重新选择!\n"); break; } } while (choose); }
3.2电脑随机出拳
通过生成随机数,实现电脑的随机出拳
使用rand函数可以生成伪随机数,但在使用rand函数前,应使用srand函数设置随机数种子,否则每次程序运行得到的随机数序列都相同
//电脑出拳intComputerRPS() { //产生随机数//在使用rand()函数时,要引用对应头文件//要使用srand((unsigned int)time(NULL)来进行初始化intnum=0; num=rand() %3+1; returnnum; }
3.3判断输赢
//判断输赢//平局返回0//玩家赢返回1//电脑赢返回-1intIsWin(intUserChoose, intComputerChoose) { //平局if (UserChoose==ComputerChoose) { return0; } //玩家赢elseif (UserChoose==1&&ComputerChoose==2||UserChoose==2&&ComputerChoose==3||UserChoose==3&&ComputerChoose==1) { return1; } //电脑赢else { return-1; } }
3.4 打印游戏结果
将数字转换为对应出拳
//数字对应的出拳char*Outcome(intnumber) { switch (number) { case1: return"剪刀"; case2: return"布"; case3: return"石头"; } }
打印游戏结果
//打印结果voidPrint(char*user, char*computer, intret) { printf("这一局,你选择出%s,电脑选择出%s\n", user, computer); if (ret==0) { printf("平局!\n"); } elseif (ret==1) { printf("恭喜你,你赢了!\n"); } else { printf("很遗憾,你输了!\n"); } }
3.5将结果写入文件
在game.h中定义变量
staticintwin=0; staticintlose=0; staticintdraw=0; staticintcount=0;
//保存数据voidSaveRPS(intret) { FILE*pf=fopen("test.txt", "w"); if (pf==NULL)//判断文件是否打开成功 { perror("SaveRPS");//打印错误信息return; } //分别统计胜利、输、平局次数if (ret==0) { draw++; } elseif (ret>0) { win++; } else { lose++; } count++; //写文件fprintf(pf, "%d %d %d %d", count, win, lose, draw); //关闭文件fclose(pf); pf=NULL; }
4.查看游戏记录
历史记录保存在文件中,每次程序运行时,应先读取文件中的数据
//加载上次记录voidLoadRPS() { //打开文件FILE*pf=fopen("test.txt", "r"); //文件未创建if (pf==NULL) { return; } //读文件fscanf(pf, "%d %d %d %d",&count, &win, &lose, &draw); //关闭文件fclose(pf); pf=NULL; }
查看游戏记录
//查看记录voidViewRPS() { //统计胜利、输、平局次数if (count==0) { printf("无历史记录!\n"); return; } //打开文件FILE*pf=fopen("test.txt", "r"); if (pf==NULL) { perror("ViewRPS"); } //读文件fscanf(pf, "%d %d %d %d",&count, &win, &lose, &draw);; //关闭文件fclose(pf); pf=NULL; //打印printf("******************************\n"); printf("***** 游戏局数:%d *****\n",count); printf("******* 胜利:%d ********\n", win); printf("******* 输: %d ********\n", lose); printf("******* 平局:%d ********\n", draw); printf("******************************\n"); printf("\n"); }
5.删除游戏记录
//删除所有记录voidDeleteRPS() { //查看是否有历史记录if (count==0) { printf("无历史记录,无需删除!\n"); return; } //确认是否删除所有记录intflag=0; while (1) { printf("是否确认删除所有记录?(是:1/否:0)"); scanf("%d", &flag); if (flag==0) { return; } elseif (flag==1) { //打开文件FILE*pf=fopen("test.txt", "w"); if (pf==NULL) { perror("Delete"); } //写文件win=0; lose=0; draw=0; count=0; fprintf(pf, "%d %d %d %d",count, win, lose, count); //关闭文件fclose(pf); pf=NULL; //打印提示printf("历史记录删除成功\n"); return; } else { printf("选择错误,请重新选择!\n"); continue; } } }
4.完整代码
game.h
voidRPS();//石头剪刀布游戏intComputerRPS();//电脑出拳intIsWin(intUserChoose, intComputerChoose);//判断输赢voidPrint(char*user, char*computer, intret);//打印结果char*Outcome(intnumber);//出拳结果voidSaveRPS(intret);//保存记录voidLoadRPS();//加载记录voidViewRPS();//查看记录voidDeleteRPS();//删除记录staticintwin=0; staticintlose=0; staticintdraw=0; staticintcount=0;
game.c
//游戏菜单voidRPSmenu() { printf("******************************\n"); printf("****** 0.回到主界面 *******\n"); printf("****** 1.剪刀 2.布 *******\n"); printf("****** 3.石头 *******\n"); printf("******************************\n"); } //玩游戏voidRPS() { //玩家出拳intchoose=0; //电脑随机出拳intret=0; do { //打印游戏菜单RPSmenu(); printf("请选择:>"); scanf("%d", &choose); switch (choose) { case0: printf("已退回主界面!\n"); break; case1: case2: case3: //电脑出拳ret=ComputerRPS(); //判断输赢//平局返回0//用户赢返回1//电脑赢返回-1intresult=IsWin(choose, ret); //打印游戏结果char*user=Outcome(choose); char*computer=Outcome(ret); Print(user, computer, result); //将结果写入文件SaveRPS(result); break; default: printf("选择错误,请重新选择!\n"); break; } } while (choose); } //电脑出拳intComputerRPS() { //产生随机数//在使用rand()函数时,要引用对应头文件//要使用srand((unsigned int)time(NULL)来进行初始化intnum=0; num=rand() %3+1; returnnum; } //判断输赢intIsWin(intUserChoose, intComputerChoose) { //平局if (UserChoose==ComputerChoose) { return0; } //玩家赢elseif (UserChoose==1&&ComputerChoose==2||UserChoose==2&&ComputerChoose==3||UserChoose==3&&ComputerChoose==1) { return1; } //电脑赢else { return-1; } } //打印结果voidPrint(char*user, char*computer, intret) { printf("这一局,你选择出%s,电脑选择出%s\n", user, computer); if (ret==0) { printf("平局!\n"); } elseif (ret==1) { printf("恭喜你,你赢了!\n"); } else { printf("很遗憾,你输了!\n"); } } //数字对应的出拳char*Outcome(intnumber) { switch (number) { case1: return"剪刀"; case2: return"布"; case3: return"石头"; } } //保存数据voidSaveRPS(intret) { FILE*pf=fopen("test.txt", "w"); if (pf==NULL)//判断文件是否打开成功 { perror("SaveRPS");//打印错误信息return; } //分别统计胜利、输、平局次数if (ret==0) { draw++; } elseif (ret>0) { win++; } else { lose++; } count++; //写文件fprintf(pf, "%d %d %d %d", count, win, lose, draw); //关闭文件fclose(pf); pf=NULL; } //加载上次记录voidLoadRPS() { //打开文件FILE*pf=fopen("test.txt", "r"); //文件未创建if (pf==NULL) { return; } //读文件fscanf(pf, "%d %d %d %d",&count, &win, &lose, &draw); //关闭文件fclose(pf); pf=NULL; } //查看记录voidViewRPS() { //统计胜利、输、平局次数if (count==0) { printf("无历史记录!\n"); return; } //打开文件FILE*pf=fopen("test.txt", "r"); if (pf==NULL) { perror("ViewRPS"); } //读文件fscanf(pf, "%d %d %d %d",&count, &win, &lose, &draw);; //关闭文件fclose(pf); pf=NULL; //打印printf("******************************\n"); printf("***** 游戏局数:%d *****\n",count); printf("******* 胜利:%d ********\n", win); printf("******* 输: %d ********\n", lose); printf("******* 平局:%d ********\n", draw); printf("******************************\n"); printf("\n"); } //删除所有记录voidDeleteRPS() { //查看是否有历史记录if (count==0) { printf("无历史记录,无需删除!\n"); return; } //确认是否删除所有记录intflag=0; while (1) { printf("是否确认删除所有记录?(是:1/否:0)"); scanf("%d", &flag); if (flag==0) { return; } elseif (flag==1) { //打开文件FILE*pf=fopen("test.txt", "w"); if (pf==NULL) { perror("Delete"); } //写文件win=0; lose=0; draw=0; count=0; fprintf(pf, "%d %d %d %d",count, win, lose, count); //关闭文件fclose(pf); pf=NULL; //打印提示printf("历史记录删除成功\n"); return; } else { printf("选择错误,请重新选择!\n"); continue; } } }
test.c
//主界面菜单voidmenu() { printf("******************************\n"); printf("****** 1.进入游戏 *******\n"); printf("****** 2.查看游戏记录 *******\n"); printf("****** 3.删除游戏记录 *******\n"); printf("****** 0.游戏退出 *******\n"); printf("******************************\n"); } intmain() { srand((unsignedint)time(NULL)); //加载上次数据LoadRPS(); //选择选项intinput=0; do//循环至少执行一次 { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case1: //玩游戏RPS(); break; case2: //查看比赛记录ViewRPS(); break; case3: //删除比赛记录DeleteRPS(); break; case0: printf("游戏已退出\n"); break; default: printf("选择错误,请重新选择!\n"); break; } } while (input); return0; }