easyx图形库基础4:贪吃蛇

贪吃蛇

  • 一实现贪吃蛇:
    • 1.绘制网格:
    • 1.绘制蛇:
    • 3.控制蛇的默认移动向右:
    • 4.控制蛇的移动方向:
    • 5.生成食物
    • 6.判断蛇吃到食物并且长大。
    • 7.判断游戏结束:
    • 8.重置函数:
  • 二整体代码:

一实现贪吃蛇:

1.绘制网格:

请添加图片描述

#define wide 800
#define high 600#define Frame 20//1.绘制边框
void DrawFrame()
{setlinecolor(BLACK);setlinestyle(PS_SOLID, 1);for (int i = 1; i < wide / Frame; i++){line(Frame * i, 0, Frame * i, 600);}for (int i = 1; i < high / Frame; i++){line(0, Frame * i,800 , Frame * i);}
}

1.绘制蛇:

请添加图片描述

int main()
{initgraph(wide,high);setbkcolor(RGB(188, 227, 245));cleardevice();//初始化蛇的长度int length = 5;//初始化蛇的坐标:sn snake[5] = { {7,6} ,{6,6}, {5,6},{4,6},{3,6} };while (1){cleardevice();BeginBatchDraw();//1.绘制边框DrawFrame();//2.绘制蛇DrawSnake(snake,length);FlushBatchDraw();Sleep(40);}EndBatchDraw();getchar();closegraph();return 0;
}
//2.绘制蛇
void DrawSnake(sn* snake,int length)
{setfillcolor(GREEN);for (int i = 0; i < length; i++){//先绘制头int x1 = snake[i].x;int y1 = snake[i].y;solidrectangle(x1 * Frame, y1 * Frame, (x1 + 1) * Frame, (y1 + 1) * Frame);}
}

3.控制蛇的默认移动向右:

请添加图片描述

void SnakeMove(sn* snake, int length)
{//默认蛇一开始是一直向右移动的;sn newsnake = { (snake->x)+1,(snake->y)};//2.绘制蛇DrawSnake(snake, length);FlushBatchDraw();//进行蛇的移动;for (int i = length - 1; i >= 1; i--){snake[i] = snake[i - 1];}snake[0] = newsnake;
}

4.控制蛇的移动方向:

void SnakeMove(sn* snake, int length,int* vx,int* vy)
{//默认蛇一开始是一直向右移动的;//2.绘制蛇DrawSnake(snake, length);FlushBatchDraw();//进行蛇的移动;if (_kbhit()){char ch = _getch();//蛇是不可以直接走回头路的:switch (ch){case'A':case'a':if (*vx == 1 && vy == 0)break;*vx = -1;*vy = 0;break;case'W':case'w':if (*vx == 0 && *vy == 1)break;*vx = 0;*vy = -1;break;case'D':case'd':if (*vx == -1 && *vy == 0)break;*vx = 1;*vy = 0;break;case'S':case's':if (*vx == 0 && *vy == -1)break;*vx = 0;*vy = 1;break;}}//控制蛇节点变化sn newsnake = { (snake->x)+(*vx) ,(snake->y)+(*vy)};for (int i = length - 1; i >= 1; i--){snake[i] = snake[i - 1];}snake[0] = newsnake;
}

5.生成食物

1.食物不可以生成到画布的外面;
2.不可以生成在蛇的身体上面;
3.食物是随机生成的;

//4.生成食物:
void DrawFeeFood(sn* snake, int length, FD* food)
{		int fx = 0;int fy = 0;int flag = 0;while (1){//食物坐标的随机生成:food->x = rand() % (wide / Frame);food->y= rand() % (high / Frame);//2.不可以生成在蛇的身体上面,遍历蛇的身体。for (int i = 0; i < length; i++){if (((food->x) == (snake[i].x)) && ((food->y) == (snake[i].y))){flag++;}}if (flag == 0){break;}}
}
//3.控制蛇的移动
void SnakeMove(sn* snake, int length,FD* food,int* vx,int* vy)
{//默认蛇一开始是一直向右移动的;//2.绘制蛇DrawSnake(snake, length);//2.绘制食物:if (food->x == 0 && food->y == 0){DrawFeeFood(snake, length, food);}setfillcolor(YELLOW);solidrectangle((food->x) * Frame, (food->y) * Frame, (food->x+1) * Frame, (food->y+1) * Frame);FlushBatchDraw();//进行蛇的移动;if (_kbhit()){char ch = _getch();//蛇是不可以直接走回头路的:switch (ch){case'A':case'a':if (*vx == 1 && vy == 0)break;*vx = -1;*vy = 0;break;case'W':case'w':if (*vx == 0 && *vy == 1)break;*vx = 0;*vy = -1;break;case'D':case'd':if (*vx == -1 && *vy == 0)break;*vx = 1;*vy = 0;break;case'S':case's':if (*vx == 0 && *vy == -1)break;*vx = 0;*vy = 1;break;}}//控制蛇节点变化sn newsnake = { (snake->x)+(*vx) ,(snake->y)+(*vy)};for (int i = length - 1; i >= 1; i--){snake[i] = snake[i - 1];}snake[0] = newsnake;
}

6.判断蛇吃到食物并且长大。

请添加图片描述

//3.控制蛇的移动
void SnakeMove(sn* snake, int* length,FD* food,int* vx,int* vy)
{//默认蛇一开始是一直向右移动的;//2.绘制蛇DrawSnake(snake, *length);//3.绘制食物:if (food->x == 0 && food->y == 0){DrawFeeFood(snake, length, food);}setfillcolor(YELLOW);solidrectangle((food->x) * Frame, (food->y) * Frame, (food->x+1) * Frame, (food->y+1) * Frame);FlushBatchDraw();//进行蛇的移动;if (_kbhit()){char ch = _getch();//蛇是不可以直接走回头路的:switch (ch){case'A':case'a':if (*vx == 1 && vy == 0)break;*vx = -1;*vy = 0;break;case'W':case'w':if (*vx == 0 && *vy == 1)break;*vx = 0;*vy = -1;break;case'D':case'd':if (*vx == -1 && *vy == 0)break;*vx = 1;*vy = 0;break;case'S':case's':if (*vx == 0 && *vy == -1)break;*vx = 0;*vy = 1;break;}}//控制蛇节点变化sn newsnake = { (snake->x)+(*vx) ,(snake->y)+(*vy)};for (int i = *length - 1; i >= 1; i--){snake[i] = snake[i - 1];}snake[0] = newsnake;//判断蛇是否吃到了食物和生长:Grow(snake, length, food);
}
void Grow(sn* snake, int* length, FD* food)
{//保存一下尾的数值sn end = snake[(*length) - 1];if ((snake[0].x == food->x) && (snake[0].y == food->y)){//重置食物数值food->x = 0;food->y = 0;//添加尾节点;*length = (*length) + 1;snake[*length] = end;}
}

7.判断游戏结束:

1.蛇头碰到墙壁:
2.蛇头碰到蛇身体:

//5.判断游戏结束
bool Gameover(sn* snake, int* length)
{//1.碰到墙壁if ((snake[0].x >= wide / Frame) || (snake[0].x < 0) || (snake[0].y >= high / Frame) || (snake[0].y < 0)){return true;}else{//2.碰到身体for (int i = 1; i < (*length); i++){if (((snake[0].x)==(snake[i].x))&&((snake[0].y) == (snake[i].y)))return true;}}return false;
}

8.重置函数:

//初始化函数
void initgame(int* length,int* vx,int* vy,sn* snake,FD* food)
{//初始化蛇的长度*length = 5;//初始化蛇的水平初始速度*vx = 1;*vy = 0;//初始化蛇的坐标:snake[0] = { 7,6 };snake[0] = { 6,6 };snake[0] = { 5,6 };snake[0] = { 4,6 };snake[0] = { 3,6 };//初始化食物的坐标;*food = { 0,0 };
}

二整体代码:

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<easyx.h>
#include<math.h>
#include<stdbool.h>
#include<conio.h>
#include<time.h>#define wide 800
#define high 600
#define Frame 20typedef struct snake {int x;int y;
}sn;
typedef struct Food {int x;int y;
}FD;
//1.绘制边框
void DrawFrame()
{setlinecolor(BLACK);setlinestyle(PS_SOLID, 1);for (int i = 1; i < wide / Frame; i++){line(Frame * i, 0, Frame * i, 600);}for (int i = 1; i < high / Frame; i++){line(0, Frame * i,800 , Frame * i);}
}//2.绘制蛇
void DrawSnake(sn* snake,int length)
{setfillcolor(GREEN);for (int i = 0; i < length; i++){//先绘制头int x1 = snake[i].x;int y1 = snake[i].y;solidrectangle(x1 * Frame, y1 * Frame, (x1 + 1) * Frame, (y1 + 1) * Frame);}
}//3.生成食物:
void DrawFeeFood(sn* snake, int *length, FD* food)
{		int fx = 0;int fy = 0;int flag = 0;while (1){//食物坐标的随机生成:food->x = rand() % (wide / Frame);food->y= rand() % (high / Frame);//2.不可以生成在蛇的身体上面,遍历蛇的身体。for (int i = 0; i < *length; i++){if (((food->x) == (snake[i].x)) && ((food->y) == (snake[i].y))){flag++;}}if (flag == 0){break;}}
}//4判断蛇吃到食物并且长大。
void Grow(sn* snake, int* length, FD* food)
{//保存一下尾的数值sn end = snake[(*length) - 1];if ((snake[0].x == food->x) && (snake[0].y == food->y)){//重置食物数值food->x = 0;food->y = 0;//添加尾节点;*length = (*length) + 1;snake[*length] = end;}
}//初始化函数
void initgame(int* length,int* vx,int* vy,sn* snake,FD* food)
{//初始化蛇的长度*length = 5;//初始化蛇的水平初始速度*vx = 1;*vy = 0;//初始化蛇的坐标:snake[0] = { 7,6 };snake[0] = { 6,6 };snake[0] = { 5,6 };snake[0] = { 4,6 };snake[0] = { 3,6 };//初始化食物的坐标;*food = { 0,0 };
}
//5.判断游戏结束
bool Gameover(sn* snake, int* length)
{//1.碰到墙壁if ((snake[0].x >= wide / Frame) || (snake[0].x < 0) || (snake[0].y >= high / Frame) || (snake[0].y < 0)){return true;}else{//2.碰到身体for (int i = 1; i < (*length); i++){if (((snake[0].x)==(snake[i].x))&&((snake[0].y) == (snake[i].y)))return true;}}return false;
}//6.控制蛇的移动
void SnakeMove(sn* snake, int* length,FD* food,int* vx,int* vy)
{//默认蛇一开始是一直向右移动的;//2.绘制蛇DrawSnake(snake, *length);//3.绘制食物:if (food->x == 0 && food->y == 0){DrawFeeFood(snake, length, food);}setfillcolor(YELLOW);solidrectangle((food->x) * Frame, (food->y) * Frame, (food->x+1) * Frame, (food->y+1) * Frame);FlushBatchDraw();//进行蛇的移动;if (_kbhit()){char ch = _getch();//蛇是不可以直接走回头路的:switch (ch){case'A':case'a':if (*vx == 1 && vy == 0)break;*vx = -1;*vy = 0;break;case'W':case'w':if (*vx == 0 && *vy == 1)break;*vx = 0;*vy = -1;break;case'D':case'd':if (*vx == -1 && *vy == 0)break;*vx = 1;*vy = 0;break;case'S':case's':if (*vx == 0 && *vy == -1)break;*vx = 0;*vy = 1;break;}}//控制蛇节点变化sn newsnake = { (snake->x)+(*vx) ,(snake->y)+(*vy)};for (int i = *length - 1; i >= 1; i--){snake[i] = snake[i - 1];}snake[0] = newsnake;//判断蛇是否吃到了食物和生长:Grow(snake, length, food);//判断蛇是否碰到了墙壁和自己if (Gameover(snake, length)){initgame(length, vx, vy, snake, food);//Sleep(100);}}int main()
{initgraph(wide,high);setbkcolor(RGB(188, 227, 245));//获取当前时间作为随机数种子:srand((unsigned int)time(NULL));cleardevice();//初始化蛇的长度int length = 5;//初始化蛇的水平初始速度int vx = 1;int vy = 0;//初始化蛇的坐标:sn snake[100] = { {7,6} ,{6,6}, {5,6},{4,6},{3,6} };//初始化食物的坐标;FD food = {0,0};while (1){cleardevice();BeginBatchDraw();//1.绘制边框DrawFrame();//2.控制蛇的移动和节点的变化;SnakeMove(snake, &length,&food,&vx,&vy);Sleep(150);}EndBatchDraw();getchar();closegraph();return 0;
}

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

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

相关文章

【0基础学爬虫】爬虫基础之网络请求库的使用

大数据时代&#xff0c;各行各业对数据采集的需求日益增多&#xff0c;网络爬虫的运用也更为广泛&#xff0c;越来越多的人开始学习网络爬虫这项技术&#xff0c;K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章&#xff0c;为实现从易到难全方位覆盖&#xff0c;特设【0基础学…

安卓13解决链接问题

作为Android用户&#xff0c;你可能已经注意到了一个问题——Android 13不再支持PPTP协议。但请别担心&#xff0c;作为一家专业的代理供应商&#xff0c;我们将与你分享解决方案&#xff0c;让你轻松解决L2TP问题&#xff0c;享受到高水平的连接体验。本文将为你提供实用的操作…

什么是浮动(float)?如何清除浮动?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 浮动&#xff08;Float&#xff09;和清除浮动⭐ 浮动的使用⭐ 清除浮动1. 空元素法&#xff08;Empty Element Method&#xff09;2. 使用 Clearfix Hack3. 使用 Overflow ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发…

微服务与Nacos概述-5

引入OpenFeign 添加依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency><groupId>com.alibaba.cloud</groupId>…

山东布谷科技直播软件开发WebRTC技术:建立实时通信优质平台

在数字化的时代&#xff0c;实时通信成为了人们远程交流的主要方式&#xff0c;目前市场上也出现了很多带有实时通信交流的软件&#xff0c;实时通信符合人们现在的需求&#xff0c;所以在直播软件开发过程中&#xff0c;开发者也运用了实时通信技术为直播软件加入了实时通信的…

【芯片前端】auto_testbench的大版本升级——加入简单预期与自动比对

前言 前文提要&#xff1a; 【芯片前端】一键生成简易版本定向RTL验证环境的脚本——auto_verification_rtl脚本_尼德兰的喵的博客-CSDN博客 【芯片前端】可能是定向验证的巅峰之作——auto_testbench_autotestbench_尼德兰的喵的博客-CSDN博客 工具路径&#xff1a; auto…

Vue.js2+Cesium1.103.0 九、淹没分析效果

Vue.js2Cesium1.103.0 九、淹没分析效果 Demo <template><divid"cesium-container"style"width: 100%; height: 100%;"><spanid"button"style"position: absolute; right: 50px; top: 50px; z-index: 999; font-size: 24px…

Gitlab-第四天-CD到k8s集群的坑

一、.gitlab-ci.yml #CD到k8s集群的 stages: - deploy-test build-image-deploy-test: stage: deploy-test image: bitnami/kubectl:latest # 使用一个包含 kubectl 工具的镜像 tags: - k8s script: - ls -al - kubectl apply -f deployment.yaml # 根据实际情况替换…

SpringBoot请求响应

简单参数 1. 原始方式获取请求参数 Controller方法形参中声明httpServletRequest对象 调用对象的getParameter参数名 RestController public class RequestController {RequestMapping("/simpleParam")public String simpleParam(HttpServletRequest request){Strin…

理解 Go 中的切片:append 操作的深入分析(篇2)

理解 Go 语言中 slice 的性质对于编程非常有益。下面&#xff0c;我将通过代码示例来解释切片在不同函数之间传递并执行 append 操作时的具体表现。 本篇为第 2 篇&#xff0c;当切片的容量 cap 不够时 func main() {// slice1 当前长度为 3&#xff0c;容量大小也为 3slice1 :…

学习笔记整理-面向对象-05-内置对象

一、内置对象 1. 什么是包装类 Number()、String()和Boolean()分别是数字、字符串、布尔值的"包装类"。包装类的目的就是为了让基本类型值可以从它们的构造函数的prototype上获得方法。Number()、String()和Boolean()的实例都是object类型&#xff0c;它们的Primit…

Python是什么?它有什么用途?

Python是什么&#xff1f; Python是一门具有优雅和简洁语法的高级编程语言。它由荷兰程序员Guido van Rossum创造并于上世纪90年代初发布。Python的设计理念强调可读性和清晰性&#xff0c;使得代码编写变得轻松且容易理解。这门语言以其独特的缩进方式来标记代码块&#xff0…

7.利用matlab完成 符号方阵的特征值分解和 符号矩阵的奇异值分解 (matlab程序)

1.简述 &#xff08;1&#xff09;特征值分解&#xff1a;函数eig 格式&#xff1a;[V,D] eig(A) %计算A的特征值对角阵D和特征向量V&#xff0c;使AVVD成立。 注意&#xff1a;特征值分解时&#xff0c;使用eig&#xff0c;矩阵A必须是方阵。 A [0 1;1 1]; [V,D] ei…

【javaweb】学习日记Day1 - HTML CSS入门

目录 一、图片标签 ① 绝对路径 1.绝对磁盘路径 2.绝对网络路径 ② 相对路径 &#xff08;推荐&#xff09; 二、标题标签 三、水平线标签 四、标题样式 1、CSS引入样式 ① 行内样式 ② 内嵌样式 ③ 外嵌样式 2、CSS选择器 ① 元素选择器 ② id选择器 ③…

06 - 文件的差异和恢复

查看所有文章链接&#xff1a;&#xff08;更新中&#xff09;GIT常用场景- 目录 文章目录 1. 文件的差异2. 文件的恢复 工作区&#xff1a;本地进行修改的code 暂存区&#xff1a;执行了 git add <filename> 命令之后 版本库&#xff1a;执行了 git commit <...>…

写给 Android 应用工程师的 Binder 原理剖析

一. 前言 这篇文章我酝酿了很久&#xff0c;参考了很多学习文档&#xff0c;读了很多源码&#xff0c;却依旧不敢下笔。生怕自己理解上还有偏差&#xff0c;对大家造成误解&#xff0c;贻笑大方。又怕自己理解不够透彻&#xff0c;无法用清晰直白的文字准确的表达出 Binder 的…

【量化课程】08_2.深度学习量化策略基础实战

文章目录 1. 深度学习简介2. 常用深度学习模型架构2.1 LSTM 介绍2.2 LSTM在股票预测中的应用 3. 模块分类3.1 卷积层3.2 池化层3.3 全连接层3.4 Dropout层 4. 深度学习模型构建5. 策略实现 1. 深度学习简介 深度学习是模拟人脑进行分析学习的神经网络。 2. 常用深度学习模型架…

金蝶软件实现导入Excel数据分录行信息到单据体分录行中

>>>适合KIS云专业版V16.0|KIS云旗舰版V7.0|K/3 WISE 14.0等版本<<< 金蝶软件中实现[导入Excel数据业务分录行]信息到[金蝶单据体分录]中,在采购订单|采购入库单|销售订单|销售出库单等类型单据中,以少量的必要字段在excel表格中按模板填列好,很方便快捷地从…

学习笔记十四:K8S最小调度单元POD概述

K8S最小调度单元POD概述 k8s核心资源Pod介绍Pod是什么Pod如何管理多个容器Pod网络Pod存储代码自动发版更新收集业务日志 Pod工作方式自主式Pod控制器管理的Pod(防误删除) 如何基于Pod运行应用 k8s核心资源Pod介绍 K8s官方文档&#xff1a;https://kubernetes.io/ K8s中文官方文…

YOLOv5白皮书-第Y6周:模型改进

&#x1f4cc;本周任务&#xff1a;模型改进&#x1f4cc; 注&#xff1a;对yolov5l.yaml文件中的backbone模块和head模块进行改进。 任务结构图&#xff1a; YOLOv5s网络结构图: 原始模型代码&#xff1a; # YOLOv5 v6.0 backbone backbone:# [from, number, module, args]…