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

EasyX实现简易贪吃蛇

在这里插入图片描述

📝个人主页:认真写博客的夏目浅石.
📣系列专栏:夏目的C语言宝藏

文章目录

  • 前言
  • 一、头文件包含
  • 二、创建蛇与食物的结构体
  • 三、游戏的初始化
  • 四、游戏的绘画事件
  • 五、蛇的移动事件
  • 六、输入方向
  • 七、生成食物
  • 八、吃食物
  • 九、游戏失败的判定
  • 十、main函数
  • 总结


前言

我们曾经都玩过贪吃蛇游戏,所以我今天学习了C语言就想学习然后写一下。


一、头文件包含

#include<stdio.h>
#include<graphics.h> //图形处理需要包含的库文件
#include<mmsystem.h> //windows多媒体接口
#include<conio.h>   //读取键盘输入
#include<time.h>    //随机数种子
#include<stdlib.h>   //内存分配

包含完头文件后进行一些预处理操作:

#pragma comment(lib,"winmm.lib")//多媒体接口
#define NUM 200;
#define SIZE 10
enum Ch{ up=72,down=80,left=75,right=77} ;   

二、创建蛇与食物的结构体

贪吃蛇是基于帧驱动,而不是事件驱动的程序。
开发者只需要处理每一帧蛇的变化,而不是处理出现的事件(用户输入,蛇吃到食物)。
easyX提供了绘制填充矩形的API fillrectangle。
我们把窗口分割成无数个小方格,蛇的身体和食物绘制在方格的点中。
贪吃蛇中的蛇,是一个集合,储存是每个方块的x和y坐标。
蛇移动的本质是 头 向当前方向移动一个单元格,然后其他的身体格坐标变成上一个格的坐标。
食物是一个点,只需要储存x和y坐标就可以表示。
只有蛇头碰到食物才算吃到食物,蛇的身体变长,实质上是蛇是吃到食物后移动时,加入一个位置,并设置成移动前最后一个位置的坐标
根据上述描述,我们可以构建对应的结构体;

struct pos   //蛇身坐标
{int x;int y;
};
struct snake  
{int n;    //初始化蛇身长度Ch ch;    //蛇前进的方向pos szb[3265];  //蛇的坐标数组
};
struct food
{int x;int y;bool iseat;  //判断食物是否被吃
};//创建一个蛇与食物snake s;
food  f;

三、游戏的初始化

代码如下(示例):

void gameinit()
{srand((unsigned int)time(NULL));//随机数种子,用于随机生成食物s.n = 2;  //蛇的初始长度,可以自己设定s.ch = right;//蛇的初始方向;s.szb[0].x=100;s.szb[0].y=100;s.szb[1].x = 90;s.szb[1].y = 100;//蛇的初始位置坐标f.iseat = true;
}

四、游戏的绘画事件

代码如下(示例):

cleardevice();  //每次绘画都要进行一次清屏setfillcolor(RED); //蛇头颜色fillrectangle(s.szb[0].x, s.szb[0].y,s.szb[0].x + SIZE, s.szb[0].y + SIZE);//SIZE在预处理是已经定义表示每个蛇身的大小for (int i = 0; i < s.n; i++) {rectangle(s.szb[i].x, s.szb[i].y,s.szb[i].x + SIZE, s.szb[i].y + SIZE);} //生成矩形蛇setfillcolor(GREEN);//食物颜色fillroundrect(f.x, f.y, f.x + SIZE, f.y + SIZE,5,5);//生成圆形食物

五、蛇的移动事件

代码如下(示例):

{for (int i = s.n - 1; i > 0; i--){s.szb[i].x = s.szb[i - 1].x;s.szb[i].y = s.szb[i - 1].y;  //通过数组的变换来实现蛇的移动}switch (s.ch)//ch枚举类型在预处理时已经定义{case up:s.szb[0].y -= SIZE;//由于在窗口坐标系中y方向是向下的所以向上移动需要减去一个sizebreak;case down:s.szb[0].y += SIZE;break;case left:s.szb[0].x -= SIZE;break;case right:s.szb[0].x += SIZE;break;}
}

六、输入方向

代码如下(示例):

void changech()
{char key;key = _getch();switch (key){case up:if (s.ch != down)s.ch = up;break;case down:if (s.ch != up)s.ch = down;break;case left:if (s.ch != right)s.ch = left;case right:if (s.ch != left)s.ch = right;}
}

七、生成食物

代码如下(示例):

void creatfood()
{bool flag = false;if (f.iseat == true) {while (1){flag = false;//设定flag判断食物是否与蛇身重合f.x = rand() % 68*10;f.y = rand() % 48*10;//食物的随机生成for (int i = 0; i < s.n; i++){if (f.x == s.szb[i].x && f.y == s.szb[i].y){flag = true;break;}}if (!flag){f.iseat = false;break;}//上面部分为判断食物是否与蛇身重合}}
}

八、吃食物

代码如下(示例):

void eatfood()
{if (s.szb[0].x == f.x && s.szb[0].y == f.y)//如果蛇头与食物重合那么食物就被吃掉了{f.iseat = true;s.n++;}
}

九、游戏失败的判定

代码如下(示例):
因为我初始化的窗口为640*480,if判断的范围打击可以根据自己窗口大小设定。

int gameover()
{if (s.szb[0].x < 0 || s.szb[0].x>640 || s.szb[0].y < 0 || s.szb[0].y>480){return 1;}for (int i = 1; i < s.n; i++){if (s.szb[0].x == s.szb[i].x && s.szb[0].y == s.szb[i].y){return 1;}}return 0;
}

十、main函数

代码如下(示例):

int main()
{initgraph(680,480);mciSendString(L"open 7895.mp3", 0, 0, 0);mciSendString(L"play 7895.mp3", 0, 0, 0);//添加音乐必须加上这个预处理指令#pragma comment(lib,"winmm.lib")int n = 0;gameinit();while (1) {while (!_kbhit()){snakemove();drawgame();creatfood();eatfood();n = gameover();if (n)break;Sleep(100);}if (n)break;changech();}closegraph();getchar();return 0;
}

总结

贪吃蛇游戏的难点就在于蛇身的变化与移动,只要这两个问题解决后其他的都很好想。封面就是运行后的结果。

http://www.lryc.cn/news/92740.html

相关文章:

  • Linux下ElasticSearch7.9.2安装配置(包含服务器配置、启动停止脚本、开放端口和elasticsearch-head插件的使用)
  • JS 之 事件Event对象详解(属性、方法、自定义事件)
  • 65寸电视长宽多少厘米
  • Python爬取影评并进行情感分析和数据可视化
  • ubuntu22.04.2安装onlyoffice(不更改默认端口版)
  • 企业如何有效制定企业信息化发展规划?(附信息化模板)
  • 计算机网络填空题
  • 【HashMap】为什么用自定义的类做HashMap的Key时需要重写hashcode方法和equals方法
  • Flutter自定义对话框返回相关问题汇总
  • 002docker 安装
  • 软件工程师,全面思考问题很重要
  • 1.Apollo部署-linux
  • 【HTML】form标签
  • 基于SPAD / SiPM技术的激光雷达方案
  • 使用MATLAB工具模拟单/双频GPS和载波相位差分GPS
  • 当社恐成为技术面试官
  • Jetpack Compose:使用PagerIndicator和Infinity实现滚动的HorizontalPager
  • 2023年杭州/广州/东莞/深圳软考(中/高级)认证,618报名特惠
  • springboot项目外卖管理 day03-公共字段填充与新增删除分类
  • Nginx:Tomcat部署及优化(一)
  • Docker Swarm 集群搭建和使用 —— 筑梦之路
  • 是否需要更换CRM系统如何评估?如何确保更换成功?
  • CSDN竞赛57期题解
  • springboot+vue.js大学生竞赛报名作品评分管理系统
  • Python爱好者的自我修养(1):简单输入与输出
  • java SSM 摄影作品网站myeclipse开发mysql数据库springMVC模式java编程计算机网页设计
  • [Maven高级]->近万字文章带你深入了解Maven
  • 物联网Lora模块从入门到精通(五)光照与温湿度传感器
  • 【网络编程】计算机网络基础知识总结 | 运输层 |TCP协议
  • python关键知识点