石头剪刀布小游戏(C语言)

目录

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.游戏规则

石头赢剪刀,剪刀赢布,布赢石头

以1代表剪刀,2代表布,3代表石头。玩家通过选择模拟出拳。

 

2.游戏思路

1.创建菜单帮助玩家进行选择

2.实现石头剪刀布游戏

  (1)玩家通过选择模拟出拳

  (2)电脑随机出拳

  (3)判断胜负

  (4)将结果写入文件

3.查看游戏记录

4.删除历史记录

 

3.代码实现

1.分别创建头文件game.h、源文件game.c和test.c

石头剪刀布小游戏(C语言)_第1张图片

game.h:存放自定义函数的声明、引用的标准库头文件等

game.c:存放函数的定义

test.c:用于程序测试

2.创建菜单并对输入的选择进行处理

//主界面菜单
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;
}

 

3.实现石头剪刀布小游戏

3.1 打印菜单帮助玩家出拳,并对玩家选择进行处理

//游戏菜单
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);
}

 

3.2电脑随机出拳

通过生成随机数,实现电脑的随机出拳

使用rand函数可以生成伪随机数,但在使用rand函数前,应使用srand函数设置随机数种子,否则每次程序运行得到的随机数序列都相同

//电脑出拳
int ComputerRPS()
{
	//产生随机数
	//在使用rand()函数时,要引用对应头文件
	//要使用srand((unsigned int)time(NULL)来进行初始化
	int num = 0;
	num = rand() % 3 + 1;
	return num;
}

石头剪刀布小游戏(C语言)_第2张图片

 

3.3判断输赢

//判断输赢
//平局返回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;
	}
}

 

 3.4 打印游戏结果

将数字转换为对应出拳

//数字对应的出拳
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");
	}
}

石头剪刀布小游戏(C语言)_第3张图片

 

3.5将结果写入文件

在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;
}

 

 4.查看游戏记录

历史记录保存在文件中,每次程序运行时,应先读取文件中的数据

//加载上次记录
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");
}

 

5.删除游戏记录


//删除所有记录
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;
		}
	}
}

 

4.完整代码

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;
}

你可能感兴趣的:(c语言)