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