贪吃蛇(C++)

server/2024/10/18 23:27:44/

使用EasyX图形库绘制,在VC中安装,EasyX官网:EasyX Graphics Library for C++

EasyX官方文档:EasyX 文档 - 使用教程

#include<iostream>
#include<easyx.h>
#include<vector>//顺序表,容器
#include<ctime>	class Sprite {
public://委托构造函数Sprite():Sprite(0,0) {}Sprite(int x, int y) :m_x(x), m_y(y),m_color(RED) {}//绘制精灵virtual void draw() {//设置填充颜色setfillcolor(m_color);//绘制矩形fillrectangle(m_x, m_y, m_x+10, m_y+10);}//移动void moveBy(int dx, int dy){m_x += dx;m_y += dy;}//碰撞检测bool collision(const Sprite& ohter){return m_x == ohter.m_x && m_y == ohter.m_y;}bool coollisionWall(){return m_x > 640 || m_x < 0 || m_y>480 || m_y < 0;}
protected:int m_y;int m_x;COLORREF m_color;//颜色};
//蛇类
class Snake:public Sprite
{
public:Snake():Snake(0,0) {}Snake(int x, int y) :Sprite(x, y),dir(VK_RIGHT){//初始化三节蛇nodes.push_back(Sprite(20, 0));nodes.push_back(Sprite(10, 0));nodes.push_back(Sprite(0, 0));}void draw() override//绘制蛇{for (int i = 0; i < nodes.size(); i++){nodes[i].draw();}}//蛇移动void bodyMove(){//身体跟蛇头移动for (size_t i = nodes.size()-1; i >0; i--){nodes[i] = nodes[i - 1];}//蛇头移动switch (dir){case VK_UP://上移nodes[0].moveBy(0, -10);break; case VK_DOWN://下移nodes[0].moveBy(0, 10);break;case VK_LEFT://左移nodes[0].moveBy(-10, 0);break;case VK_RIGHT://右移nodes[0].moveBy(10, 0);break;}}//吃食物,蛇碰撞bool collision(const Sprite& other){return nodes[0].collision(other);}//碰撞墙壁bool die(){return nodes[0].coollisionWall();}//蛇增加一节void incrment(){nodes.push_back(Sprite());}
private:std::vector<Sprite>nodes;//蛇的所有结点
public:int dir;//蛇的方向
};
//食物
class Food :public Sprite
{
public:Food():Sprite(0,0){changePos();}//绘制食物void draw()override{setfillcolor(m_color);solidellipse(m_x, m_y, m_x + 10, m_y + 10);}//产生食物的坐标void changePos(){//生成随机坐标 m_x = rand() % 64 * 10;//食物坐标为10的整数倍m_y = rand() % 48 * 10;}
};//游戏场景
class GameScene
{
public:GameScene() {}void run(){	//开启双缓冲BeginBatchDraw();//清屏cleardevice();//绘制蛇snake.draw();//绘制食物food.draw();EndBatchDraw();//移动蛇,改变蛇的坐标snake.bodyMove();//是否吃到食物snakeEatFood();//获取消息ExMessage msg = { 0 };if(peekmessage(&msg, EX_KEY)){onMsg(msg);		}}//响应消息:鼠标消息,键盘消息void onMsg(const ExMessage& msg){//如果有按键按下if (msg.message == WM_KEYDOWN){//判断具体是那个按键按下 virtual key code 虚拟键码//判断上时不能按下,左时不能按右switch (msg.vkcode){case VK_UP:if(snake.dir!=VK_DOWN)snake.dir = msg.vkcode;break;case VK_DOWN:if (snake.dir != VK_UP)snake.dir = msg.vkcode;break;case VK_LEFT:if (snake.dir != VK_RIGHT)snake.dir = msg.vkcode;break;case VK_RIGHT:if (snake.dir != VK_LEFT)snake.dir = msg.vkcode;break;}}}//判断蛇能否吃到食物void snakeEatFood(){if (snake.collision(food))//如果蛇和食物产生碰撞{//蛇的节数增加snake.incrment();//产生新的食物food.changePos();}}//判断蛇是否碰到墙壁,如果碰到了游戏结束bool snakeDie(){if (snake.die()){cleardevice();//清除屏幕outtextxy(250, 200, L"GAME OVER!");return true;}return false;}
private:Snake snake;//创建蛇Food food;//食物};int main() {//绘制窗口initgraph(640, 480);//设置随机数种子srand(time(nullptr));GameScene scene;while (true){scene.run();//是否死亡if (scene.snakeDie()){break;}Sleep(100);	}	getchar();return 0;
}


http://www.ppmy.cn/server/42106.html

相关文章

第十四节 huggingface的trainner的_inner_training_loop函数源码解读

文章目录 前言一、self.get_train_dataloader()函数1、self.get_train_dataloader()函数完整源码2、dataset与dataloadera、dataset与dataloader来源b、dataset与dataloader处理c、self._get_collator_with_removed_columns()函数获得collate_fn3、self._get_train_sampler()采…

运用MongoDB Atlas释放开发者潜能同时把控成本

在当下的商业环境中&#xff0c;不可预测性已经成为常态&#xff0c;工程团队负责人必须在把控不可预测性和优化IT成本的双重挑战下谋求平衡。 咨询公司德勤2024 MarginPLUS调查收集了300多位企业负责人的见解&#xff0c;报告中重点介绍了面对动荡的全球经济环境&#xff0c;…

uni-app安卓本地打包个推图标配置

如果什么都不配置&#xff0c;默认的就是个推小鲸鱼图标 默认效果 配置成功效果 个推图标配置 新建目录 drawable-hdpi、drawable-ldpi、drawable-mdpi、drawable-xhdpi、drawable-xxhdpi、drawable-xxxhdpi 目录中存放图标 每个目录中存放对应大小的图标&#xff0c;大图…

rocketmq的顺序消息开发注意事项

1. 参考消息重试&#xff0c;要对 MaxReconsumeTimes进行设置。之前就是因为没有进行设置&#xff0c;导致了队头阻塞问题。 rokcetmq和kafka一样&#xff0c;当顺序消息写入的多个队列中后&#xff0c;如果是顺序消息&#xff0c;当前的队列的队头一直消费失败的时候&#x…

【OceanBase 系列】—— OceanBase v4.3 特性解读:查询性能提升之利器列存储引擎

原文链接&#xff1a;OceanBase 社区 对于分析类查询&#xff0c;列存可以极大地提升查询性能&#xff0c;也是 OceanBase 做好 HTAP 和 OLAP 的一项不可缺少的特性。本文介绍 OceanBase 列存的实现特色。 OceanBase从诞生起就一直坚持LSM-Tree架构&#xff0c;不断打磨功能支…

【Qt 学习笔记】Qt常用控件 | 多元素控件 | 多元素控件介绍

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 多元素控件 | 控件介绍 文章编号&#xff1a;Qt 学习笔记…

【C -> Cpp】由C迈向Cpp (6):静态、友元和内部类

标题&#xff1a;【C -&#xff1e; Cpp】由C迈向Cpp &#xff08;6&#xff09;&#xff1a;静态、友元和内部类 水墨不写bug &#xff08;图片来源于网络&#xff09; 目录 &#xff08;一&#xff09;静态成员 &#xff08;二&#xff09;友元 &#xff08;三&#xff09…

python数据分析所需要了解的结构基础

Python语言基础——结构基础 前言一、列表列表的介绍列表的语法示例注意要点符号元素切片运算符示例 二、字典字典的介绍字典的特点字典的语法 三、元组元组的介绍元组的语法示例 四、字符串字符串的介绍字符串的语法 五、操作运算符算术运算符赋值运算符比较运算符逻辑运算符位…