当前位置: 首页 > news >正文

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));elsesetfillcolor(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;}elsesnack[oldTailX][oldTailY] = 0;
}

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

相关文章:

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 2…...

# 软件安装-Linux搭建nginx(单机版)

软件安装-Linux搭建nginx(单机版) 安装版本:nginx-1.24.0 文章目录 软件安装-Linux搭建nginx(单机版)一、Nginx包下载二、创建用户1.新建组和用户2.设置用户密码3.登录自己创建的目录三、安装依赖组件四、安装Nginx五、启动Nginx六、配置Nginx一、Nginx包下载 1. nginx-1.24下…...

成熟的汽车制造供应商协同平台 要具备哪些功能特性?

汽车行业是一个产业链长且“重”的行业&#xff0c;整个业务流程包括了研发、设计、采购、库存、生产、销售、售后等一系列环节&#xff0c;在每一个环节都涉及到很多信息交换的需求。对内要保证研发、采购、营销等业务环节信息流通高效安全&#xff0c;对外要与上、下游合作伙…...

React16源码: React中处理ref的核心流程源码实现

ref的实现过程 1 &#xff09;概述 在更新流程当中如何去设置ref上面的对象的过程在我们创建fiber的时候去处理ref这个属性那我们什么时候创建fiber对象? 就是我们去更新某一个节点&#xff0c;然后要去调和它的子节点的时候这个时候我们会对每一个子节点去创建这个fiber对象…...

ref和reactive

看尤雨溪说&#xff1a;为什么Vue3 中应该使用 Ref 而不是 Reactive&#xff1f;...

掌握数据预测的艺术:线性回归模型详解

线性回归是统计学中用于建模两个或多个变量之间线性关系的一种方法,广泛应用于数据分析、机器学习等领域。从数学建模的角度出发,线性回归旨在找到一个线性方程,最好地描述自变量(或称为解释变量、特征变量)和因变量(或称为目标变量)之间的关系。本文将通过Python代码示…...

STM32F407移植OpenHarmony笔记8

继上一篇笔记&#xff0c;成功开启了littlefs文件系统&#xff0c;能读写FLASH上的文件了。 今天继续研究网络功能&#xff0c;让控制台的ping命令能工作。 轻量级系统使用的是liteos_m内核lwip协议栈实现网络功能&#xff0c;需要进行配置开启lwip支持。 lwip的移植分为两部分…...

C++:输入流/输出流

C流类库简介 C为了克服C语言中的scanf和printf存在的缺点。&#xff0c;使用cin/cout控制输入/输出。 cin&#xff1a;表示标准输入的istream类对象&#xff0c;cin从终端读入数据。cout&#xff1a;表示标准输出的ostream类对象&#xff0c;cout向终端写数据。cerr&#xff…...

十、Qt三维图表

一、Data Visualization模块概述 Data Visualization的三维显示功能主要有三种三维图形来实现&#xff0c;三各类的父类都是QAbstract3DGraph&#xff0c;从QWindow继承而来。这三类分别是&#xff1a;三维柱状图Q3DBar三维空间散点Q3DScatter三维曲面Q3DSurface 1、相关类的…...

CMake官方教程中文翻译 Step 6: Adding Support for a Testing Dashboard

鉴于自己破烂的英语&#xff0c;所以把cmake的官方文档用 谷歌翻译 翻译下来方便查看。 英语好的同学建议直接去看cmake官方文档&#xff08;英文&#xff09;学习&#xff1a;地址 点这里 或复制&#xff1a;https://cmake.org/cmake/help/latest/guide/tutorial/index.html …...

【leetcode】完全背包总结

本文内容参考了代码随想录&#xff0c;并进行了自己的总结。 完全背包 关键点 ● 每件物品有若干种状态&#xff1a;不选、选 1 件、选 2 件、…、选 n 件 代码 在代码上&#xff0c;只有重量的遍历方向和 01 背包不一样&#xff1a; for(int i 0; i < nums.length; i…...

【Linux】理解系统中一个被打开的文件

文件系统 前言一、C语言文件接口二、系统文件接口三、文件描述符四、struct file 对象五、stdin、stdout、stderr六、文件描述符的分配规则七、重定向1. 重定向的原理2. dup23. 重谈 stderr 八、缓冲区1. 缓冲区基础2. 深入理解缓冲区3. 用户缓冲区和内核缓冲区4. FILE 前言 首…...

k8s kubeadm部署安装详解

目录 kubeadm部署流程简述 环境准备 步骤简述 关闭 防火墙规则、selinux、swap交换 修改主机名 配置节点之间的主机名解析 调整内核参数 所有节点安装docker 安装依赖组件 配置Docker 所有节点安装kubeadm&#xff0c;kubelet和kubectl 定义kubernetes源并指定版本…...

RT-DETR算法优化改进: 下采样系列 | 一种新颖的基于 Haar 小波的下采样HWD,有效涨点系列

💡💡💡本文独家改进:HWD的核心思想是应用Haar小波变换来降低特征图的空间分辨率,同时保留尽可能多的信息,与传统的下采样方法相比,有效降低信息不确定性。 💡💡💡使用方法:代替原始网络的conv,下采样过程中尽可能包括更多信息,从而提升检测精度。 RT-DET…...

CocosCreator3.8源码分析

Cocos Creator架构 Cocos Creator 拥有两套引擎内核&#xff0c;C 内核 和 TypeScript 内核。C 内核用于原生平台&#xff0c;TypeScript 内核用于 Web 和小游戏平台。 在引擎内核之上&#xff0c;是用 TypeScript 编写的引擎框架层&#xff0c;用以统一两套内核的差异&#xf…...

(已解决)spingboot 后端发送QQ邮箱验证码

打开QQ邮箱pop3请求服务&#xff1a;&#xff08;按照QQ邮箱引导操作&#xff09; 导入依赖&#xff08;不是maven项目就自己添加jar包&#xff09;&#xff1a; <!-- 邮件发送--><dependency><groupId>org.springframework.boot</groupId><…...

【蓝桥杯冲冲冲】[NOIP2001 普及组] 装箱问题

蓝桥杯备赛 | 洛谷做题打卡day26 文章目录 蓝桥杯备赛 | 洛谷做题打卡day26题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示思路 题解代码我的一些话 [NOIP2001 普及组] 装箱问题 题目描述 有一个箱子容量为 V V V&#xff0c;同时有 n n n 个物品&#xff0c;每…...

2024牛客寒假算法基础集训营1

文章目录 A DFS搜索M牛客老粉才知道的秘密G why外卖E 本题又主要考察了贪心B 关鸡C 按闹分配 今天的牛客&#xff0c;说是都是基础题&#xff0c;头昏昏的&#xff0c;感觉真不会写&#xff0c;只能赛后补题了 A DFS搜索 写的时候刚开始以为还是比较难的&#xff0c;和dfs有关…...

元素的显示与隐藏,精灵图,字体图标,CSSC三角

元素的显示与隐藏 类似网站广告&#xff0c;当我们点击关闭就不见了&#xff0c;但是我们重新刷新页面&#xff0c;会重新出现 本质&#xff1a;让元素在页面中隐藏或者显示出来。 1.display显示隐藏 2.visibility显示隐藏 3.overflow溢出显示隐藏 1.display属性&#xff08;…...

最新!2024顶级SCI优化!TTAO-CNN-BiGRU-MSA三角拓扑聚合优化、双向GRU融合注意力的多变量回归预测程序!

适用平台&#xff1a;Matlab 2023版及以上 TTOA三角聚合优化算法&#xff0c;将在2024年3月正式发表在中科院1区顶级SCI期刊《Expert Systems with Applications》上。 该算法提出时间极短&#xff0c;目前以及近期内不会有套用这个算法的文献。新年伊始&#xff0c;尽快拿下…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...