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

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

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

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

相关文章

ubuntu22.04安装部署02:禁用显卡更新

一、查看可用显卡驱动 ubuntu-drivers devices 二、查看显卡信息 # -i表示不区分大小写 lspci | grep -i nvidia nvidia-smi 三、查看已安装显卡驱动 cat /proc/driver/nvidia/version 四、锁定显卡升级 使用cuda自带额显卡驱动&#xff0c;居然无法&#xff0c;找到如何锁…

TRUNCATE TABLE和DELETE FROM对比

相同点:用于删除数据,同时保留表结构. 不同点: TRUNCATE比DELETE更快(数据量小可能体现不出来,单数据量大就很明显了) 原因:TRUNCATE是DDL(数据定义语言)DELETE是逐行删除属于(DML) TRUNCATE 不会产生大量日志,但DELETE删除会产生大量日志 DELETE FROM 可以加WHERE子句指定…

AI-数学-高中-17-三角函数的定义

原作者视频&#xff1a;三角函数】4三角函数的定义&#xff08;易&#xff09;_哔哩哔哩_bilibili 初中&#xff1a; 高中&#xff1a;三角函数就是单位圆上的点的横纵坐标(x0,y0)。 示例1&#xff1a; 规则&#xff1a; 示例2&#xff1a; 示例3.1&#xff1a; 示例3.2 示例4…

【异常检测复现】【DeSTSeg】在虚拟环境中完成配置

文章目录 1.在虚拟环境中安装git2.更改虚拟环境中包的安装位置3.安装anomalib4.安装虚拟环境5.根据requirements.txt安装包6.选择所建立的虚拟环境&#xff0c;并设置解释器7.查看文件夹的内容8.下载数据集9.引用 记录复现过程中安装各种包的命令 下载数据集到本地 1.在虚拟环境…

MySQL误操作数据后闪回恢复——Binlog2sql使用详解

Binlog2sql的用途 数据快速回滚(闪回)主从切换后新master丢数据的修复从binlog生成标准SQL&#xff0c;带来的衍生功能 Binlog2sql的安装步骤 首先&#xff0c;确保系统安装了git和pip。 安装binlog2sql。可以通过以下命令进行&#xff1a; shell> git clone https://g…

(十二)springboot实战——SSE服务推送事件案例实现

前言 SSE&#xff08;Server-Sent Events&#xff0c;服务器推送事件&#xff09;是一种基于HTTP协议的服务器推送技术。它允许服务器向客户端发送异步的、无限长的数据流&#xff0c;而无需客户端不断地轮询或发起请求。这种技术可以用来实现实时通信、在线聊天、即时更新等功…

格力软件设计岗位2024春招一面记录

本文介绍2024届秋招中&#xff0c;格力的软件开发岗位一面的面试基本情况、提问问题等。 2024年01月投递了格力的电控软件设计岗位&#xff0c;但是后来简历似乎因为被调剂&#xff0c;被送到了另一个部门&#xff1b;具体部门叫什么我也没听清楚&#xff0c;但岗位就也还是软件…

C++并发编程 -2.线程间共享数据

本章就以在C中进行安全的数据共享为主题。避免上述及其他潜在问题的发生的同时&#xff0c;将共享数据的优势发挥到最大。 一. 锁分类和使用 按照用途分为互斥、递归、读写、自旋、条件变量。本章节着重介绍前四种&#xff0c;条件变量后续章节单独介绍。 由于锁无法进行拷贝…

Day 17------C语言收尾之链表的删除、位运算、预处理、宏定义

链表 空链表&#xff1a; 注意&#xff1a;函数不能返回局部变量的地址 操作&#xff1a; 1.创建空链表 2.头插 3.尾插 4.链表遍历 5.链表的长度 free&#xff1a;释放 删除&#xff1a; 头删 void popFront(struct Node *head) { //1.p指针变量指向首节点 //2.断…

ubuntu22.04 安装部署01:禁用内核更新

一、前言 ubunut22.04系统安装以后&#xff0c;内核更新会导致各种各样的问题&#xff0c;因此锁定初始安装环境特别重要&#xff0c;下面介绍如何锁定内核更新。 二、操作方法 2.1 查看可用内核 dpkg --list | grep linux-image dpkg --list | grep linux-headers dpkg --…

NLP_NLP技术的演进史

文章目录 起源: NLP 的起源可以追溯到阿兰图灵在20 世纪50年代提出的图灵测试。图灵测试的基本思想是&#xff0c;如果一个计算机程序能在自然语言对话中表现得像一个人&#xff0c;那么我们可以说它具有智能。从这里我们可以看出&#xff0c;AI最早的愿景与自然语言处理息息相…

Multisim14.0仿真(四十二)基于74LS183的8位表决器设计

一、74LS183简介&#xff1a; 74LS183是一种4位高速全加器&#xff0c;用于数字电路中的加法运算。74LS183输入端包括两个4位二进制数和一个进位信号&#xff0c;输出端包括1个4位二进制数和一个进位信号。 74LS138具有快速响应、低功耗灯特点&#xff0c;能实现高校的数字匀速…

MySQL的备份与恢复

目录 一、MySQL日志管理 1.1 MySQL日志类型 1.2 错误日志 1.3 通用查询日志 1.4 慢查询日志 1.5 二进制日志 日志滚动&#xff1a; 二、MySQL备份 2.1 备份类型 2.2 MySQL自带的备份工具 基于DBMS> mysqldump 一、MySQL日志管理 在数据库保存数据时&#xff0c;有…

计算huggingface模型占用硬盘空间的实战代码

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

贪心 向上取整 1898 B. Milena and Admirer

感觉要用差分来做&#xff0c;但是不知道咋做 #include<bits/stdc.h>using namespace std;const int N2e510;int a[N];int get(int x,int y) {if(x%y0) return x/y;return x/y1; }void solve() {int n;cin>>n;for(int i0;i<n;i) cin>>a[i];long long ans…

ChatGPT的探索与实践-应用篇

这篇文章主要介绍在实际的开发过程当中&#xff0c;如何使用GPT帮助开发&#xff0c;优化流程&#xff0c;文末会介绍如何与618大促实际的业务相结合&#xff0c;来提升应用价值。全是干货&#xff0c;且本文所有代码和脚本都是利用GPT生成的&#xff0c;请放心食用。 场景一&…

哨兵1号回波数据(L0级)提取与SAR成像(全网首发)

本专栏目录:全球SAR卫星大盘点与回波数据处理专栏目录 本文先展示提取出的回波结果,然后使用RD算法进行成像,展示成像结果,最后附上哨兵1号回波提取的MATLAB代码。 1. 回波提取 回波提取得到二维复矩阵数据,对其求模值后绘图如下(横轴为距离向采样点,纵轴为方位向采样…

【Go语言成长之路】Hello Go

文章目录 Hello Go一、建立工程目录二、开启代码追踪三、编写代码四、测试代码 Hello Go 一、建立工程目录 pzspzs-ubuntu22:~$ mkdir go_study/hello -p pzspzs-ubuntu22:~$ cd go_study/hello​ 在hello目录下&#xff0c;我们会编写属于自己的第一个Go demo例子&#xff0…

Linux实验记录:使用vsftpd服务传输文件

前言&#xff1a; 本文是一篇关于Linux系统初学者的实验记录。 参考书籍&#xff1a;《Linux就该这么学》 实验环境&#xff1a; VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 备注&#xff1a; 为了解决在多样复杂的设备之间解决传…

openmax

通过EmptyThisBuffer传递未解码的buffer给component&#xff0c;component收到该命令后会去读取input port buffer中的数据&#xff0c;将其组装为帧之后进行解码&#xff0c;buffer处理完成后会通过EmptyBufferDone通知上层输入使用完成&#xff0c;上层收到命令可以继续送输入…