C语言搭配EasyX实现贪吃蛇小游戏

news2024/12/27 11:36:28

封面展示

内部展示

完整代码

#define _CRT_SECURE_NO_WARNINGS
#include<easyx.h>
#include<stdio.h>
#include<mmsystem.h>
#pragma comment (lib,"winmm.lib")
#define width 40//宽有40个格子
#define height 30//长有40个格子
#define size 25//每个正方形格子的边长为20
int snack[width][height] = { 0 };//蛇
char direction='w';//初始方向向上
int foodx, foody;//食物刷新位置
int isover = 0;//游戏是否结束
int result = 0;//得分
int speed = 5;//速度
int maxscore;//历史最高分
char title1[] = "开始游戏",title2[] = "退出游戏",title3[] = "查看历史最高分",title4[] = "游戏帮助",title5[]="选择难度模式";//主页文字
int x = width * size / 2, y = height * size / 2;//提前用于文字居中
void getmaxscore();//获得历史最高分
void Remembermaxscore();//记住最高分
void menu();//菜单
void choose();//选择指令
void choosespeed();//选择蛇的移动速度
void Look_maxscore();//查看最高分,重新打印封面
void BGM();//这么刺激的游戏,没有点音乐可不行
void game();//游戏实现
void gamehelp();//游戏帮助
void gamemap();//绘制游戏地图
void Initialize();//绘制初始蛇以及食物
void draw();//每次蛇不同,重新绘制
void movespeed();//控制蛇的移动速度
void operate();//控制蛇的操作
void move();//蛇的运动
int main()
{
	getmaxscore();
	initgraph(width * size, height * size);//地图尺寸
	choose();
	return 0;
}
void getmaxscore()
{
	FILE* fp = fopen("历史最高分.txt", "r");
	fscanf(fp, "%d", &maxscore);
	fclose(fp);
}
void Remembermaxscore()
{
	if (result > maxscore)
	{
		FILE* fp = fopen("历史最高分.txt", "w");
		fprintf(fp, "%d", result);
		fclose(fp);
	}
	
}
void menu()
{
	IMAGE img;
	loadimage(&img, "./贪吃蛇封面.jpg", width * size, height * size);
	putimage(0, 0, &img);
	setfillcolor(YELLOW);
	setlinecolor(BLACK);
	setbkmode(TRANSPARENT);
	settextstyle(20, 0, "黑体");
	settextcolor(BLACK);
	fillrectangle(x - 100, y - 60, x + 100, y - 20);//打印四个按钮,按钮居中
	outtextxy(x - 100 + (200 - textwidth(title1))/2, y - 60 + (40 - textheight(title1))/2, title1);
	fillrectangle(x - 100, y - 20, x + 100, y + 20);
	outtextxy(x - 100 + (200 - textwidth(title2)) / 2, y - 20 + (40 - textheight(title2)) / 2, title2);
	fillrectangle(x - 100, y + 20, x + 100, y + 60);
	outtextxy(x - 100 + (200 - textwidth(title3)) / 2, y + 20 + (40 - textheight(title3)) / 2, title3);
	fillrectangle(x - 100, y + 60, x + 100, y + 100);
	outtextxy(x - 100 + (200 - textwidth(title4)) / 2, y + 60 + (40 - textheight(title4)) / 2, title4);
	fillrectangle(x - 100, y + 100, x + 100, y + 140);
	outtextxy(x - 100 + (200 - textwidth(title5)) / 2, y + 100 + (40 - textheight(title5)) / 2, title5);
}
void choose()
{
	menu();
	int f = 0;
	while (1)
	{
		ExMessage msg;
		if (f) break;
		while (peekmessage(&msg, EX_MOUSE))
		{
			switch (msg.message)
			{
			case WM_LBUTTONDOWN:
				if (msg.x > x - 100 && msg.x<x + 100 && msg.y>y - 60 && msg.y < y - 20)
				{
					game();
					menu();
				}
				else if (msg.x > x - 100 && msg.x<x + 100 && msg.y>y - 20 && msg.y < y + 20)
					f = 1;
				else if (msg.x > x - 100 && msg.x<x + 100 && msg.y>y + 20 && msg.y < y + 60)
				{
					Look_maxscore();
					menu();
				}
				else if (msg.x > x - 100 && msg.x<x + 100 && msg.y>y + 60 && msg.y < y + 100)
				{
					gamehelp();
					menu();
				}
				else if (msg.x > x - 100 && msg.x<x + 100 && msg.y>y + 100 && msg.y < y + 140)
				{
					choosespeed();
					menu();
				}
				break;
			default:
				break;
			}
		}
		
	}
}
void choosespeed()
{
	IMAGE img;
	loadimage(&img, "./01.jpg", width * size, height * size);
	putimage(0, 0, &img);
	char back[] = "<<===";
	settextstyle(30, 0, "宋体");
	setfillcolor(BROWN);
	fillrectangle(10, 10, 100, 50);
	outtextxy(10 + (90 - textwidth(back)) / 2, 10 + (40 - textheight(back)) / 2, back);
	setfillcolor(GREEN);
	fillrectangle(200, 305, 400, 445);
	outtextxy(200 + (200 - textwidth("老年人模式")) / 2, 305 + (140 - textheight("老年人模式")) / 2, "老年人模式");
	setfillcolor(YELLOW);
	fillrectangle(420, 305, 620, 445);
	outtextxy(420 + (200 - textwidth("儿童模式")) / 2, 305 + (140 - textheight("儿童模式")) / 2, "儿童模式");
	setfillcolor(RED);
	fillrectangle(640, 305, 840, 445);
	outtextxy(640 + (200 - textwidth("大学生模式")) / 2, 305 + (140 - textheight("大学生模式")) / 2, "大学生模式");
	int f = 0;
	while (1)
	{
		ExMessage msg;
		while (peekmessage(&msg, EX_MOUSE))
		{
			switch (msg.message)
			{
			case WM_LBUTTONDOWN:
				if (msg.x > 200 && msg.x < 400 && msg.y>305 && msg.y < 445)
				{
					speed = 10;
				}
				else if (msg.x > 420 && msg.x < 620 && msg.y>305 && msg.y < 445)
				{
					speed = 5;
				}
				else if (msg.x > 640 && msg.x < 840 && msg.y>305 && msg.y < 445)
				{
					speed = 3;
				}
				else if (msg.x > 10 && msg.x < 100 && msg.y>10 && msg.y < 50)
				{
					f = 1;
				}
				break;
			default:
				break;
			}
		}
	  if (f) break;
	}
}
void Look_maxscore()
{
	IMAGE img;
	loadimage(&img, "./01.jpg", width * size, height * size);
	putimage(0, 0, &img);
	char score[100];
	char back[] = "<<===";
	settextstyle(30, 0, "宋体");
	sprintf_s(score, "历史最高分:%d", maxscore);
	outtextxy(width*size/2-120, height*size/2, score);
	setfillcolor(BROWN);
	fillrectangle(10, 10, 100, 50);
	outtextxy(10 + (90 - textwidth(back)) / 2, 10 + (40 - textheight(back)) / 2,back);
	int f = 0;
	while (1)
	{
		ExMessage msg;
		if (f) break;
		while(peekmessage(&msg, EX_MOUSE))
		{
			switch (msg.message)
			{
			case WM_LBUTTONDOWN:
				if (msg.x > 10 && msg.x < 100 && msg.y>10 && msg.y < 50)
				f = 1;
				break;
			default:
				break;
			}
		}
		
	}
}
void gamehelp()
{
	IMAGE img;
	loadimage(&img, "./01.jpg", width * size, height * size);
	putimage(0, 0, &img);
	char back[] = "<<===";
	settextstyle(30, 0, "宋体");
	setfillcolor(BROWN);
	fillrectangle(10, 10, 100, 50);
	outtextxy(10 + (90 - textwidth(back)) / 2, 10 + (40 - textheight(back)) / 2, back);
	outtextxy(50, 100, "帮助:");
	outtextxy(200, 200, "按键操作:");
	outtextxy(200, 250, "w:向上");
	outtextxy(200, 300, "s:向下");
	outtextxy(200, 350, "a:向左");
	outtextxy(200, 400, "d:向右"); 
	outtextxy(200, 450, "尽量吃更多的食物获得更高的分数。");
	outtextxy(200, 500, "注意:蛇头不能撞上地图边缘和自己身体!");
	int f = 0;
	while (1)
	{
		ExMessage msg;
		if (f) break;
		while (peekmessage(&msg, EX_MOUSE))
		{
			switch (msg.message)
			{
			case WM_LBUTTONDOWN:
				if (msg.x > 10 && msg.x < 100 && msg.y>10 && msg.y < 50)
					f = 1;
				break;
			default:
				break;
			}
		}

	}
}
void BGM()
{
	mciSendString("open ./level.mp3 alias s1", 0, 0, 0);
	mciSendString("play s1 repeat", 0, 0, 0);
}
void game()
{
	gamemap();
	Initialize();
	BGM();
	while (1)
	{
		draw();
		movespeed();
		operate();
	}
}
void gamemap()
{
	setbkmode(BLUE);
	cleardevice();
	BeginBatchDraw();
	setlinecolor(WHITE);//网格颜色
	for (int i = size; i < width * size; i += size)//打印网格
		line(i, 0, i, height * size);
	for (int i = size; i < height * size; i += size)
		line(0, i, width * size,i);
}
void Initialize()
{
	snack[width / 2][height / 2] = 1;//初始蛇头
	for (int i = 1; i <= 4; i++)
		snack[width / 2][height / 2 + i] = i + 1;//初始蛇身
	foodx = rand() % (width - 2) + 1;//随机刷出食物位置
	foody = rand() % (height - 2) + 1;
}
void draw()
{
	for (int i = 0; i < width; i++) {
		for (int j = 0; j < height; j++) {
			if (snack[i][j] != 0)
				setfillcolor(HSVtoRGB(snack[i][j] * 10, 0.9, 1));
			else
				setfillcolor(LIGHTGRAY);
			fillrectangle(i * size, j * size, (i + 1) * size, (j + 1) * size);
		}
	}
	setfillcolor(LIGHTMAGENTA);
	fillrectangle(foodx * size, foody * size, (foodx + 1) * size, (foody + 1) * size);
	if (isover)
	{
		Remembermaxscore();
		char a[100];
		sprintf_s(a, "最后得分:%d", result);
		settextcolor(RED);
		settextstyle(40, 0, "宋体");
		setbkmode(TRANSPARENT);
		outtextxy(200, 150, "游戏结束");
		outtextxy(200, 200, a);
	}
	FlushBatchDraw();
}
void operate()
{
	if (GetAsyncKeyState('W'))
	{
		if (direction == 's')
			direction = 's';
		else direction = 'w';
	}
	if (GetAsyncKeyState('S'))
	{
		if (direction == 'w')
			direction = 'w';
		else direction = 's';
	}
	if (GetAsyncKeyState('A'))
	{
		if (direction == 'd')
			direction = 'd';
		else direction = 'a';
	}
	if (GetAsyncKeyState('D'))
	{
		if (direction == 'a')
			direction = 'a';
		else direction = 'd';
	}
}
void movespeed()
{
	if (isover) return;
	static int wait = 1;
	wait++;
	if (wait == speed)
	{
		move();
		wait = 1;
	}
}
void move()
{
	for (int i = 0; i < width; i++)
		for (int j = 0; j < height; j++)
			if (snack[i][j] != 0) snack[i][j]++;

	int oldHeadX, oldHeadY, oldTailX, oldTailY;
	int tailsnacks = 0;
	for (int i = 0; i < width; i++) {
		for (int j = 0; j < height; j++) {
			if (tailsnacks < snack[i][j]) {
				tailsnacks = snack[i][j];
				oldTailX = i;
				oldTailY = j;
			}
			if (snack[i][j] == 2) {
				oldHeadX = i;
				oldHeadY = j;
			}
		}
	}
	int newHeadX = oldHeadX, newHeadY = oldHeadY;
	switch (direction) {
	case'a':
		newHeadX -= 1;
		break;
	case 's':
		newHeadY += 1;
		break;
	case 'd':
		newHeadX += 1;
		break;
	case 'w':
		newHeadY -= 1;
		break;
	}
	if (newHeadX >= width || newHeadX < 0 || newHeadY >= height || newHeadY < 0 || snack[newHeadX][newHeadY] != 0) {
		isover = 1;//判断是否失败
		return;
	}
	snack[newHeadX][newHeadY] = 1;
	if (newHeadX == foodx && newHeadY == foody) {
		result++;//重新刷新食物
		foodx = rand() % (width - 2) + 1;
		foody = rand() % (height - 2) + 1;
	}
	else
		snack[oldTailX][oldTailY] = 0;
}

音乐和背景图大家可以自定义添加

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1428697.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1.27马尔科夫链,抽样蒙特卡洛模拟(逆转化方法,接受拒绝矩阵),马尔科夫链蒙特卡洛MCMC,隐马尔科夫(HMM(V算法剪枝优化),NLP)

马尔科夫链 蒙特卡洛法模拟 抽样&#xff0c;逆转换方法 就是说由系统自带的随机函数RANDOM&#xff0c;通过下面这个方法&#xff0c;可以变为对应的随机模拟函数 就是说要实现蒙特卡洛模拟&#xff0c;是要先有一个概率表达式&#xff0c;然后基于这个概率表达式&#xff0…

Leetcode2855. 使数组成为递增数组的最少右移次数

Every day a Leetcode 题目来源&#xff1a;2855. 使数组成为递增数组的最少右移次数 解法1&#xff1a;暴力 由于右移 n 次就变回原数组了&#xff0c;所以答案至多为 n−1。 枚举右移次数&#xff08;1~n-1&#xff09;&#xff0c;每次右移一个元素后判断数组是否有序&…

react 之 zustand

zustand可以说是redux的平替 官网地址&#xff1a;https://zustand-demo.pmnd.rs/ 1.安装 npm i zustand2.基础使用 // zustand import { create } from zustand// 1. 创建store // 语法容易出错 // 1. 函数参数必须返回一个对象 对象内部编写状态数据和方法 // 2. set是用来…

【Python-环境搭建】

Python-环境搭建 ▼ Python安装► 进入Python官网 地址如下 [Python官网](https://www.python.org/)► Python安装向导对话框► 测试是否安装成功 ▼ PyCharm 安装► Pycharm的下载和安装 ▼► 开始在 Windows 上使用 Python&#xff08;初学者&#xff09; ▼ Python安装 ► …

查看docker服务的IP地址

要查看Docker容器服务的IP地址&#xff0c;可以使用以下命令&#xff1a; 如果你知道容器名称或容器ID&#xff0c;直接通过容器ID或容器名称来获取IP地址&#xff1a; # 使用容器ID获取IP地址 docker inspect -f {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} …

django+flask+python高校教材管理系统47nia

本.4论文结构 绪论&#xff1a;剖析项目可行性&#xff0c;表明研究方向。 开发技术&#xff1a;系统关键运用了Python技术性、Django框架、B/S架构和myspl数据库查询&#xff0c;并进行了详细介绍[6]。 系统分析&#xff1a;包含系统的总体构造&#xff0c;用例图和结构图。 系…

Mac电脑连接linux远程桌面

起因 家庭中的内网下有一台ubuntu虚拟机&#xff0c;只能通过ssh终端操作或者通过实体机进行操作实在有些不方便。所以便想着通过linux远程桌面的方式进行连接&#xff0c;由于家庭内网&#xff0c;延迟还是非常低的。 步骤 首先在ubuntu虚拟机上安装xrdp&#xff08;可能已…

【Python实战】Python多线程批量采集图片

前言 本文来介绍如何多线程采集图片&#xff0c;多线程效率更快&#xff0c;但是&#xff0c;我们单一IP请求过于频繁&#xff0c;可能会被反爬&#xff0c;被封IP&#xff0c;所以&#xff0c;我们就要用到IP代理池&#xff0c;这里&#xff0c;我给大家推荐一个&#xff0c;可…

​(四)hive的搭建2

在&#xff08;三&#xff09;hive的搭建1中我们搭建好了hive环境&#xff0c;但是只能本地访问&#xff0c;在本节中配置Hive的访问方式。 1.元数据服务的方式 1.1 编辑hive-site.xml sudo vi hive-site.xml 在文件最后增加以下内容 <!– 指定存储元数据要连接的地址 –…

MySQL进阶45讲【11】怎么更好地给字符串字段加索引?

1 前言 现在&#xff0c;几乎所有的系统都支持邮箱登录&#xff0c;如何在邮箱这样的字段上建立合理的索引&#xff0c;是我们今天要讨论的问题。 假设&#xff0c;现在维护一个支持邮箱登录的系统&#xff0c;用户表是这么定义的&#xff1a; mysql> create table SUser…

用VScode写Latex

主要内容可以直接导到这里 A Fast Guide on Writing LaTeX with LaTeX Workshop in VS Code - Jia Jia Math 其中关于TexLive安装完成之后的路径设置有一些迷惑&#xff0c;win11下测试是不需要手动去添加的&#xff0c;去系统变量里检查一下就可以了&#xff0c;应该点开path…

STM32--USART串口(3)数据包

一、前言 在实际的工程中肯会有同时发送多种数据的情况&#xff0c;比如要不停的发送x、y、z分别对应三种不同的数据。xyzxyzxyz&#xff0c;但接收方可能是从中间某个地方开始接收的&#xff0c;这就导致数据错位。所以我们就需要将数据进行分割&#xff0c;打包成一个一个的…

个人网站如何让搜索引擎收录

当我们花费功夫搭建好个人网站&#xff0c;如何能让搜索引擎搜索到个人网站呢&#xff1f;比如百度&#xff0c;根本百度不到自己网站的内容。这时候就要使用到搜索引擎提供的站点收录功能了&#xff0c;但是点开百度的搜索资源平台&#xff0c;添加自己的站点时&#xff0c;就…

Docker进阶篇-Docker网络

一、描述 1、docker不启动&#xff0c;默认网络情况 查看网卡情况使用&#xff0c;ifconfig或者ip addr ens33&#xff1a;本机网卡 lo&#xff1a;本机回环网络网卡 virbr0:在CentoS 7的安装过程中如果有选择相关虚拟化的的服务安装系统后&#xff0c;启动网卡时会发现 …

BUU刷题[WUSTCTF2020]朴实无华

[WUSTCTF2020]朴实无华 打开之后显示hack me&#xff0c;并且浏览器的头部是乱码 可以用浏览器插件Charset将编码改为UTF-8&#xff0c;edge浏览器可以下载扩展 https://microsoftedge.microsoft.com/addons/search/charset?hlen-US 写着人家极乐bot&#xff0c;不知道什么…

3dmatch-toolbox详细安装教程-Ubuntu14.04

3dmatch-toolbox详细安装教程-Ubuntu14.04 前言docker搭建Ubuntu14.04安装第三方库安装cuda/cundnn安装OpenCV安装Matlab 安装以及运行3dmatch-toolbox1.安装测试3dmatch-toolbox(对齐两个点云) 总结 前言 paper:3DMatch: Learning Local Geometric Descriptors from RGB-D Re…

vcruntime140.dll怎么下载安装,vcruntime140.dll详细安装教程

vcruntime140.dll’&#xff0c;这个看似陌生而又技术性的文件名&#xff0c;实际上是计算机系统中一个至关重要的动态链接库文件。它是Visual C Redistributable运行时组件的一部分&#xff0c;由微软公司开发并维护&#xff0c;对于许多基于Windows操作系统的软件正常运行起着…

Flink实时数仓同步:流水表实战详解

一、背景 在大数据领域&#xff0c;初始阶段业务数据通常被存储于关系型数据库&#xff0c;如MySQL。然而&#xff0c;为满足日常分析和报表等需求&#xff0c;大数据平台采用多种同步方式&#xff0c;以适应这些业务数据的不同存储需求。这些同步存储方式包括离线仓库和实时仓…

蓝桥杯---垒骰子

赌圣atm晚年迷恋上了垒骰子&#xff0c;就是把骰子一个垒在另一个上边&#xff0c;不能歪歪扭扭&#xff0c;要垒成方柱体。经过长期观察&#xff0c;atm 发现了稳定骰子的奥秘&#xff1a;有些数字的面贴着会互相排斥&#xff01;我们先来规范一下骰子&#xff1a;1的对面是4&…

【BIAI】Lecture 9-Motor system 1

Motor System 专业词汇 skeletal muscle 骨骼肌 smooth muscle 平滑肌 cardiac muscle 心肌 flexor reflex 屈曲反射 central pattern generators 中央模式生成器 bio-inspired bipedal robots 仿生双足机器人 myotatic stretch reflex 肌肉自伸展反射 Cortex optic nerve 视皮…