栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言《猜金币》游戏(毕业设计)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言《猜金币》游戏(毕业设计)


#include 
#include 
#include 
#include 
#include 
#include 
#include 

//定义玩家结构体
typedef struct _PLAYERS
{
	char name[17];	//玩家名
	int coin;	//玩家金币数
	bool guess;	//玩家出币的正反
}Players;

//设置参数结构体
typedef struct _SETTINGS
{
	int coin;	//初始金币数
	char name0[17];	//电脑玩家的名字
	char name1[17];	//人类玩家的名字
}Settings;

void menu(char * menuch);	//菜单函数
void init(Players * player, Settings * settings);	//初始化函数
void setup(Players * player, Settings * settings);	//设置
void deenter(char * ch);	//去除字符串中的'n'
void loadsettings(Settings * settings);	//加载设置文件
void help(void);	//帮助
void display(Players * player);	//显示游戏界面
void gameplay(Players * player);	//游戏开始
bool gamejudge(Players * player);	//判断输赢

int main()
{
	char menuch;
	time_t t;
	Settings settings;

	//创建两个玩家
	Players *player;	//定义玩家指针
	//给两个玩家分配内存空间
	player = (Players *)malloc(sizeof(Players) * 2);
	srand((unsigned)time(&t));//初始化随机数种子
	init(player, &settings);	//初始化

	while(true)
	{
		menu(&menuch);	//获取玩家游戏菜单选项
		system("cls");	//控制台命令清屏
		switch(menuch)
		{
			case 'p':
				init(player, &settings);
				gameplay(player);
				break;
			case 'h':
				help();
				break;
			case 's':
				setup(player, &settings);
				break;
			case 'q':
				printf("nntBye Bye!n");
				break;
			default:
				break;
		}
		if(menuch == 'q')
			break;
	}
	free(player);	//释放内存
	Sleep(1000);	//延时1000毫秒
	return 0;
}

bool gamejudge(Players * player)	//判断输赢
{
	bool play0, play1;
	play0 = (player + 0) -> guess;
	play1 = (player + 1) -> guess;
	if(play0 && play1)	//全出正面,玩家给电脑3金币
	{
		(player + 0) -> coin += 3;
		(player + 1) -> coin -= 3;
	}

	if((!play0) && (!play1))	//全出反面,玩家给电脑1金币
	{
		(player + 0) -> coin += 1;
		(player + 1) -> coin -= 1;
	}

	if(play0 != play1)	//一正一反,电脑给玩家2金币
	{
		(player + 0) -> coin -= 2;
		(player + 1) -> coin += 2;
	}

	//查看双方金币量是否小于0,判断游戏是否结束
	if((player + 0) -> coin <= 0 || (player + 1) -> coin <= 0)
		return true;
	else
		return false;
}

void gameplay(Players * player)	//开始游戏
{
	bool guessin;
	char ch = '0';
	char guess[2][3] = {"反", "正"};
	char * game0, * game1;

	display(player);
	while(ch != 'q')
	{
		printf("nt请选择你的金币正反面...");
		printf("nt提示:按"1"出正面,按"0"出反面,按"q"退出。");
		fflush(stdin);	//清除输入缓存,以免出错。
		ch = getch();
		fflush(stdin);
		if(ch == '1'){	//玩家输入“1”,表示出正面,其它均为反面
			guessin = true;
			game1 = guess[1];
		}else{
			guessin = false;
			game1 = guess[0];
		}
		(player + 1) -> guess = guessin;
		//随机给电脑出正反面
		(player + 0) -> guess = (bool)(rand() % 2);
		if(player -> guess)
		{
			game0 = guess[1];
		}else{
			game0 = guess[0];
		}

		if(gamejudge(player))
		{
			system("cls");
			printf("nntt游戏结束!nnt");
			if(player -> coin <= 0)
			{
				printf("nt恭喜你!"%s"的金币输光了!你赢了!", player -> name);
			}else{
				printf("nt很遗憾!"%s"的金币输光了!你输了!", (player + 1) -> name);
			}
			printf("nnnt按任意键返回...");
			getch();
			break;
		}
		display(player);
		printf("nt%s:出的"%s"。    %s:出的"%s"。n",
		player -> name, game0, (player + 1) -> name, game1);
	}
}

void display(Players * player)	//显示游戏界面
{
	system("cls");
	printf("nn");
	printf("t-------------------------------------------n");
	printf("t| %-19s|%19s |n", player -> name, (player + 1) -> name);
	printf("t-------------------------------------------n");
	printf("t|                    |                    |n");
	printf("t| 金币               |               金币 |n");
	printf("t| %-15d    |    %15d |n", player -> coin, (player + 1) -> coin);
	printf("t|                    |                    |n");
	printf("t-------------------------------------------n");
}

void help(void)	//帮助
{
	printf("nn");
	printf("t--帮助------------------------------------n");
	printf("t|             猜金币游戏规则             |n");
	printf("t|                                        |n");
	printf("t|  双方同时各放一枚金币桌面上,          |n");
	printf("t|  如果双方都为正面,玩家给电脑3枚金币   |n");
	printf("t|  如果双方都为反面,玩家给电脑1枚金币   |n");
	printf("t|  如果双方正反面不同,电脑给玩家2枚金币 |n");
	printf("t|                                        |n");
	printf("t|  按数字1表示出正面,数字0表示出反面    |n");
	printf("t|                                        |n");
	printf("t|  程序制作:ysl                         |n");
	printf("t|  联系QQ:                              |n");
	printf("t------------------------------------------n");
	printf("nnt按任意键继续...");
	getch();
}
void setup(Players * player, Settings * settings)	//设置参数
{
	FILE * fp = NULL;
	char buff[255];
	char * ret;
	char ch;
	bool test;
	
	loadsettings(settings);

	system("cls");
	printf("nn");
	printf("t--游戏设置----------------------------n");
	printf("t|                                    |n");
	printf("t|  当前设置信息如下:                |n");
	printf("t|                                    |n");
	printf("t|  初始金币数:%20d  |n", settings -> coin);
	printf("t|  电脑玩家的名字:%16s  |n", settings -> name0);
	printf("t|  人类玩家的名字:%16s  |n", settings -> name1);
	printf("t|                                    |n");
	printf("t--------------------------------------n");
	printf("nt你要重新设置吗?y/n");
	ch = getch();
	if(ch == 'y')
	{
		printf("n请输入初始金币数(直接回车设置默认值100):");
		fgets(buff, 17, stdin);
		fflush(stdin);
		deenter(buff);
		if(*buff == '')
			strcpy(buff, "100");
		settings -> coin = atoi(buff);
		if(settings -> coin < 0)
			settings -> coin = 0;

		printf("n请输入电脑玩家的名字(直接回车设置默认值):");
		fgets(buff, 17, stdin);
		fflush(stdin);
		deenter(buff);
		if(*buff == '')
			strcpy(buff, "电脑");
		strncpy(settings -> name0, buff, 16);

		printf("n请输入人类玩家的名字(直接回车设置默认值):");
		fgets(buff, 17, stdin);
		fflush(stdin);
		deenter(buff);
		if(*buff == '')
			strcpy(buff, "玩家");
		strncpy(settings -> name1, buff, 16);

		fp = fopen("setup.txt", "w");
		if(fp ==NULL)
		{
			printf("n打开设置文件失败");
			exit;
		}
		fprintf(fp, "%dn", settings -> coin);
		fprintf(fp, "%sn", settings -> name0);
		fprintf(fp, "%sn", settings -> name1);

		fclose(fp);
	}
}

void deenter(char * ch)	//删除字符串中的回车符
{
	char * ret;
	ret = strchr(ch, 'n');
	if(ret)
		*ret = '';
}

void loadsettings(Settings * settings)	//读取设置文件中的参数
{
	FILE * fp = NULL;
	char buff[255];

	while(fp == NULL){
		fp = fopen("setup.txt", "r");	//检测文件是否存在
		if(fp == NULL)
		{	
			//文件不存在就创建一个,并赋初值
			fp = fopen("setup.txt", "w");
			if(fp == NULL)
			{
				printf("n设置文件打开失败n");
				exit;
			}
			fprintf(fp, "%dn", 100);
			fprintf(fp, "%sn", "电脑");
			fprintf(fp, "%sn", "玩家");
			fclose(fp);
		}
	}

	fgets(buff, 255, fp);
	//读取文件中的数值字符串,并转换成整型值赋值给参数变量
	settings -> coin = atoi(buff);

	fgets(buff, 255, fp);
	deenter(buff);	//去除读取字符串中的换行符
	strncpy(settings -> name0, buff, 16);

	fgets(buff, 255, fp);
	deenter(buff);	//去除读取字符串中的换行符
	strncpy(settings -> name1, buff, 16);

	fclose(fp);	
}

void init(Players * player, Settings * settings)
{
	//初始化函数,读取参数变量中的值赋值给玩家变量
	loadsettings(settings);
	(player + 0) -> coin = settings -> coin;
	(player + 1) -> coin = settings -> coin;

	strncpy((player + 0) -> name, settings -> name0, 16);
	strncpy((player + 1) -> name, settings -> name1, 16);

	(player + 0) -> guess = true;
	(player + 1) -> guess = true;
}

void menu(char * menuch)
{
	while(true)
	{
		system("cls");
		printf("n");
		printf("t               猜金币nn");
		printf("t------------------------------------n");
		printf("t|           开始游戏(p)            |n");
		printf("t|           帮助(h)                |n");
		printf("t|           设置(s)                |n");
		printf("t|                                  |n");
		printf("t|           退出(q)                |n");
		printf("t------------------------------------n");
		printf("t请选择:");
		*menuch = getch();
		if(*menuch == 'p' || *menuch == 'h' ||
				*menuch == 's' || *menuch == 'q'){
			break;
		}else{
			printf("nn您的输入有误,请选择");
			printf(""p、h、s、q"四个选项,");
			printf("n并请注意大小写。n");
			printf("n按任意键继续...");
			getch();
		}
	}
}

代码如上

MinGw 8.1编译通过,Win7 64完美运行。

前前后断断续续学了几个月,花两天完成以上源码,

不到之处欢迎高手指点一二,在下虚心请教。

也欢迎同为小白的朋友们互相讨论,共同进步。

本想完全用C标准库实现的,无赖,限制太多。

猜金币游戏本身没什么可玩性,双方赢金币的概率相等,

但是,玩家可以通过出正面和反面的不同数量比例(大概1/3~2/5)就能赢

可以在现实生活中赢别人钱哦,规则简单,暗藏玄机。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/664844.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号