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

封面展示

内部展示

完整代码

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++学习Day01之参数的传递方式

目录 一、程序及输出1.1 值传递1.2 地址传递1.3 引用传递1.5 引用注意事项1.5.1 引用必须引一块合法内存空间1.5.2 不要返回局部变量的引用1.5.3 当函数返回值是引用&#xff0c;那么函数的调用可以作为左值 二、分析与总结 一、程序及输出 1.1 值传递 #include<iostream&…

idea创建spring项目

一、环境 window10 IDEA 2022.2.3 maven-3.8.6 二、创建spring项目 1、新建Maven项目 File -> New -> Project 然后如下图选中Maven Archetype&#xff0c;在Archetype&#xff0c;选中maven-archetype-webapp&#xff0c;点击Create 2、配置maven 默认是使用IDEA内…

万能写作辅助器设计

为了构建一个万能写作辅助器,我们需要设计几个关键组件,每个组件都有其特定的功能和交互方式。以下是这些组件的详细设计和描述: 对话生成器(Dialogue Generator) 功能:生成对话内容。输入:可接受拖拽过来的组件,如角色名称、情感标签、场景描述等。管理:能够管理各种…

flinkcdc 3.0 架构设计学习

本文将会了解到flinkcdc3.0版本的架构设计,从一个宏观层面来学习flinkcdc3.0带来的新特性 这也是作者目前觉得学习一项技术的思路和方法,就是首先先把demo跑起来体验一下,然后整体了解一下架构设计,应用场景等,之后再去学习技术细节和源码,由浅入深的学习. 文中内容有误请多多包…

springwebflux高性能服务

场景&#xff1a; 分别使用springwebmvc 使用tomcat &#xff08;tomcat 9&#xff09;和springwebflux 做一个简单的接口 &#xff0c;该接口返回一个随机数 压测环境&#xff1a; 4C 8G ECS 使用tomcat 压测结果 Max 抖动的厉害 保持压测的参数不变 使用webflux 压测结果 …

SpringBoot注解--06--注解@Validated

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1 简述1.1 Validated作用1.2 所有参数注解含义1.3 异常处理1.4 Valid和Validated比较Valid级联校验 2.Validated 分组校验1.1为何要分组校验&#xff1f;1.2 代码案…

Leetcode—535. TinyURL 的加密与解密【中等】

2024每日刷题&#xff08;110&#xff09; Leetcode—535. TinyURL 的加密与解密 实现代码 class Solution { public:// Encodes a URL to a shortened URL.string encode(string longUrl) {while(!urlToCode.count(longUrl)) {string code;for(int i 0; i < 6; i) {code…

【EEG信号处理】时频图与时频图的观察

非常快速和松散的介绍频谱和时频分析 当我们看到一个时频图时&#xff0c;我们应该考虑什么&#xff0c;应该有什么样的问题 什么是time-frequency plots 我们知道&#xff0c;左边是在时间维度上&#xff0c;根据电极的变化来绘制的折线图&#xff0c;他在时间维度上的&#…

系统架构20 - 统一建模语言UML(上)

统一建模语言 组成要素事物关系 在目前的软件开发方法中&#xff0c;面向对象的方法占据着主导地位。面向对象方法的主导地位也决定着软件开发过程模型化技术的发展&#xff0c;面向对象的建模技术方法也就成为主导的方法。 公认的面向对象建模语言出现于20世纪70年代中期。从1…

力扣144 二叉树的前序遍历 Java版本

文章目录 题目描述递归方法代码 非递归方法代码 题目描述 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xf…

终于明白了压力/性能测试中的并发、TPS、RT及吞吐量指标

欢迎关注&#xff0c;我们专注于为IT从业者、学生和爱好者提供实用的资源和帮助。 IT开DD那点小事 互联网技术的后花园&#xff0c;更多访问&#xff1a;www.besthub.tech 一、压力测试与性能测试等同吗&#xff1f; 压力测试&#xff1a;在系统正常使用的情况下&#xff0c;能…

使用modbustcp从PLC设备取得的ushort[2] 数据转换为int32大端模式

大端模式理论参考&#xff1a;https://blog.csdn.net/u012166958/article/details/87344366 大端模式&#xff1a;是指数据的高字节保存在内存的低地址中&#xff0c;而数据的低字节保存在内存的高地址中&#xff0c;这样的存储模式有点类似于把数据当成字符串顺序处理&#x…

(杂项笔记)VS Code好用的插件推进

vs code推荐插件 1、IntelliJ IDEA Keybindings2、Chinese (Simplified) Language Pack3、Code Spell Checker4、JavaScript (ES6) code snippets5、Mithril Emmet6、Path Intellisense7、Vue 3 Snippets8、VueHelper9、Auto Close Tag10、Auto Rename Tag11、Beautify12、Brac…

Activity的启动流程

小伙伴们面试的时候是不是被问过Activity的启动流程很多啊。那我们就来看看吧。个人感觉这类文章代码细节太多&#xff0c;反而容易迷失在源码调用之中&#xff0c;从而忽略了Activity启动过程的本质。所以本文就简单地定性地对Activity启动过程进行描述&#xff0c;不会贴上大…

GPT如何在一分钟内完成论文数据分析?

数据上传 PPMAN-AI 01 由于技术限制&#xff0c;目前InfinitePaper AI仅支持上传1份文件&#xff0c;且大小不超过10M。但是&#xff0c;在强大的代码解释器面前&#xff0c;这都是小问题。我们只需要将可能用到的文件打包成压缩文件上传即可&#xff0c;之后要求GPT直接解压…

动画渲染案例 | 《舒克贝塔·五角飞碟》欢乐开年,经典IP唤醒童年回忆

《舒克贝塔五角飞碟》是由杭州童话大王影视有限公司、天津猫眼微影文化传媒有限公司出品&#xff0c;郑亚旗执导和编剧的动画电影。蓝海创意云为该片提供了渲染服务。电影于2023年12月30日正式上映&#xff0c;上映不到一个月时间累计票房突破5000万大关&#xff0c;并被评为“…

css1基础选择器

大纲 一.标签选择器 比较简单&#xff0c;前面直接写目标标签 二.类选择器 应用 例子 三.多类名选择器&#xff08;调用时中间用空格隔开&#xff09; 四.id选择器 应用 五.通配符选择器 应用 六.总结

大模型日报-20240204

刚刚&#xff0c;字节版GPTs「扣子」上线了 https://mp.weixin.qq.com/s/efNjbeK8Zul39nLzQuawCg 在持续一年的大模型热潮之后&#xff0c;「智能体」成为了科技公司们新的押注方向之一。近日&#xff0c;字节跳动正式推出「Coze 扣子」AI Bot 开发平台。任何用户都可以快速、…

数据孤岛是什么?企业如何应对?

数据孤岛指的是数据在组织内部无法自由流通和共享的状态&#xff0c;这种现象不仅影响了业务的高效运作&#xff0c;也威胁着企业的创新和竞争力。本文将深入探讨数据孤岛问题&#xff0c;分析其产生的原因以及对企业的影响&#xff0c;最后提出有效的应对策略。 一、数据孤岛…

npm---设置淘宝镜像时报“certificate has expired“的错误

今天使用vue create my-app 创建项目时&#xff0c;竟然报错&#xff1a; Error: Command failed: npm info vue-cli-version-marker --json --registryhttps://registry.npm.taobao.org npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request t…