文件已经上传
https://download.csdn.net/download/weixin_45755332/85616589

计算机图形学大作业 贪吃蛇

设计思路

画布

首先画布应该是由一个一个的小格子组成的,可以用矩阵的形式表示。
画布初始化时可以全为0,蛇和食物设为其他数值,这样就将画布与蛇身、食物区分开了。

蛇的移动

可以先将现在的蛇身都加1,然后让蛇尾变成0,蛇头的前一个变成1。比如蛇向右移动,就蛇头的右边一个位置变为1,通过矩阵中的数字变化进行蛇身移动

碰撞检测

自身碰撞

蛇的身体是非0的,如果蛇头与非0数字相遇就是相撞。

和食物的碰撞

将食物的位置设成全局变量,如果蛇头的x y位置与食物的x y相同了,蛇长就+1,食物自动随机更新。(这里要设一下不能更新到蛇身上,在矩阵为0的位置更新就行)

和墙的碰撞

判断蛇头x,y值有没有超过先前设置的边界就行。

画布刷新

蛇的长度,蛇和食物的位置都是时刻变化的,所以要不断刷新画布上的内容,以保持动态展示。

综上,考虑程序主体函数。

  • 初始化函数——应该包括初始时蛇的位置,颜色,食物的位置等等
  • 蛇的移动函数——就是上下左右移动蛇身
  • 画布展示函数

全局常量与变量

这三个常量是最基本的,用宏定义,程序中无法更改

#define BLOCK_SIZE 20//每个小格子的长宽大小
#define HEIGHT 30// 高度上一共30个小格子
#define WIDTH 40// 宽度上一共40个小格子

这几个变量是在不断更新的,必须设为全局变量

int blocks[HEIGHT][WIDTH] = { 0 }; // 初始化一个全0的矩阵,用来记录蛇身体的颜色,这里用HSV颜色空间
char move_direction; // 用w a s d控制小蛇移动方向
int food_i, food_j; // 食物的位置
int is_failure = 0; // 是否游戏失败

初始化函数

需要先初始化画布,再初始化蛇身

void start_up() {// 程序初始化函数// 初始化画布大小,蛇身大小乘长宽,就是宽度上能放30个蛇身,高度上能放40个蛇身initgraph(WIDTH*BLOCK_SIZE, HEIGHT*BLOCK_SIZE);randomize(); // 初始化随机数发生器setcolor(EGERGB(200, 200, 200)); // 设置默认背景颜色setrendermode(RENDER_MANUAL);  // 设置为非自动刷新 (只有delay/delay_fps/getch 才刷新屏幕)blocks[HEIGHT / 2][WIDTH / 2] = 1; //在画面正中间画蛇头for (int i = 1; i <= 4; i++) { // 从正中间向左依次4个方块,数值依次为2,3,4,5blocks[HEIGHT / 2][WIDTH / 2 - i] = i + 1;}move_direction = 'd'; // 初始向右移动food_i = random(HEIGHT - 1) ; // 随机初始化食物位置food_j = random(WIDTH - 1);
}

展示函数

蛇的长度,蛇和食物的位置都是时刻变化的,所以要不断刷新画布上的内容,必须不断调用这个函数

//绘制函数
void show() { color_t color;cleardevice(); // 绘制下一帧时要将上一帧的内容清屏for (int i = 0; i < HEIGHT; i++) {for (int j = 0; j < WIDTH; j++) {if (blocks[i][j]) {// 如果矩阵该位置数值大于0 将HSV颜色空间转化为RGB形式来展示蛇身颜色color = HSVtoRGB(blocks[i][j] * 10, 0.8, 1);}else {// 普通格子color = EGERGB(150, 150, 150);}// 不同填充不同的颜色setfillcolor(color);//i是行(y),j是列(x),双重for循环就都填充了bar(j*BLOCK_SIZE, i*BLOCK_SIZE, (j + 1)*BLOCK_SIZE, (i + 1)*BLOCK_SIZE);}}// 食物默认颜色为绿色GREENsetfillcolor(GREEN);// 食物位置为全局变量,在更新蛇的长度和位置时,食物位置也随之更新bar(food_j*BLOCK_SIZE, food_i*BLOCK_SIZE, (food_j + 1)*BLOCK_SIZE, (food_i + 1)*BLOCK_SIZE);// 如果游戏失败就展示失败,is_failure是在其他函数传值过来的if (is_failure) {setcolor(RED);setfont(80, 0, "宋体");xyprintf(240, 220, "GAME OVER");}
}

HSV和RGB两种颜色表示的联系

RGB 是我们接触最多的颜色空间,由三个通道表示一幅图像,分别为红色®,绿色(G)和蓝色(B)。这三种颜色的不同组合可以形成几乎所有的其他颜色。

在 HSV 颜色空间下,比 BGR 更容易跟踪某种颜色的物体,常用于分割指定颜色的物体。
HSV 表达彩色图像的方式由三个部分组成:

  • Hue(色调、色相)
  • Saturation(饱和度、色彩纯净度)
  • Value(明度)

蛇的移动

// 移动小蛇及相关处理函数
void move_snake() {/*移动蛇,可以将矩阵中所有非0数的位置都加1,蛇头的向哪移动,蛇头的前一个位置元素就变成1,  最后一个元素变成0*/for (int i = 0; i < HEIGHT; i++) {for (int j = 0; j < WIDTH; j++) {if (blocks[i][j] > 0)  // 是小蛇身体blocks[i][j]++;}}// 标记旧蛇头、蛇尾坐标int old_head_i, old_head_j, old_tail_i, old_tail_j; //int max = 0;for (int i = 0; i < HEIGHT; i++) {for (int j = 0; j < WIDTH; j++) {if (max < blocks[i][j]) { //旧蛇头位置的值最大max = blocks[i][j];old_tail_i = i;old_tail_j = j;}if (2 == blocks[i][j]) { //旧蛇头位置的值为2old_head_i = i;old_head_j = j;}}}int new_head_i = old_head_i; //新蛇头位置int new_head_j = old_head_j;switch (move_direction) {case 'w': // 向上移动new_head_i = old_head_i - 1;break;case 's': //向下移动new_head_i = old_head_i + 1;break;case 'a': //向左移动new_head_j = old_head_j - 1;break;case 'd': //向右移动new_head_j = old_head_j + 1;break;}// 如果蛇头超出边界,或者碰到蛇身,游戏失败if ((new_head_i >= HEIGHT) || (new_head_i < 0)|| (new_head_j >= WIDTH) || (new_head_j < 0)|| (blocks[new_head_i][new_head_j] > 0)) {is_failure = 1; //游戏失败return;}blocks[new_head_i][new_head_j] = 1; //新蛇头位置数值为1if ((new_head_i == food_i) && (new_head_j == food_j)) {//如果新蛇头正好碰到食物food_i = random(HEIGHT - 5) + 2; //重新随机食物位置food_j = random(WIDTH - 5) + 2;//不对旧蛇尾处理,相当于蛇的长度+1}else {//没有碰到食物blocks[old_tail_i][old_tail_j] = 0;}
}
#include <graphics.h>
#define BLOCK_SIZE 20//每个小格子的长宽大小
#define HEIGHT 30// 高度上一共30个小格子
#define WIDTH 40// 宽度上一共40个小格子//全局变量定义
int blocks[HEIGHT][WIDTH] = { 0 }; // 初始化一个全0的矩阵,用来记录蛇身体的颜色,这里用HSV颜色空间
char move_direction; // 用w a s d控制小蛇移动方向
int food_i, food_j; // 食物的位置
int is_failure = 0; // 是否游戏失败// 移动小蛇及相关处理函数
void move_snake() {/*移动蛇,可以将矩阵中所有非0数的位置都加1,蛇头的前一个位置元素变成1,最后一个元素变成0 */for (int i = 0; i < HEIGHT; i++) {for (int j = 0; j < WIDTH; j++) {if (blocks[i][j] > 0)  // 是小蛇身体blocks[i][j]++;}}int old_head_i, old_head_j, old_tail_i, old_tail_j;  // 旧蛇头、蛇尾坐标int max = 0;for (int i = 0; i < HEIGHT; i++) {for (int j = 0; j < WIDTH; j++) {if (max < blocks[i][j]) { //旧蛇头位置的值最大max = blocks[i][j];old_tail_i = i;old_tail_j = j;}if (2 == blocks[i][j]) { //旧蛇头位置的值为2old_head_i = i;old_head_j = j;}}}int new_head_i = old_head_i; //新蛇头位置int new_head_j = old_head_j;switch (move_direction) {case 'w': // 向上移动new_head_i = old_head_i - 1;break;case 's': //向下移动new_head_i = old_head_i + 1;break;case 'a': //向左移动new_head_j = old_head_j - 1;break;case 'd': //向右移动new_head_j = old_head_j + 1;break;}// 如果蛇头超出边界,或者碰到蛇身,游戏失败if ((new_head_i >= HEIGHT) || (new_head_i < 0)|| (new_head_j >= WIDTH) || (new_head_j < 0)|| (blocks[new_head_i][new_head_j] > 0)) {is_failure = 1; //游戏失败return;}blocks[new_head_i][new_head_j] = 1; //新蛇头位置数值为1if ((new_head_i == food_i) && (new_head_j == food_j)) {//如果新蛇头正好碰到食物food_i = random(HEIGHT - 5) + 2; //重新随机食物位置food_j = random(WIDTH - 5) + 2;//不对旧蛇尾处理,相当于蛇的长度+1}else {//没有碰到食物blocks[old_tail_i][old_tail_j] = 0;}
}void start_up() {// 程序初始化函数// 初始化画布大小initgraph(WIDTH*BLOCK_SIZE, HEIGHT*BLOCK_SIZE);randomize(); //初始化随机数发生器setcolor(EGERGB(200, 200, 200));// 设置默认背景颜色setrendermode(RENDER_MANUAL); //设置为非自动刷新 (只有delay/delay_fps/getch 才刷新屏幕)blocks[HEIGHT / 2][WIDTH / 2] = 1; //画面中间画蛇头for (int i = 1; i <= 4; i++) { // 向左依次4个方块,数值依次为2,3,4,5blocks[HEIGHT / 2][WIDTH / 2 - i] = i + 1;}move_direction = 'd'; // 初始向右移动food_i = random(HEIGHT - 1) ; // 随机初始化食物位置food_j = random(WIDTH - 1);
}void show() { //绘制函数color_t color;cleardevice();// 清屏for (int i = 0; i < HEIGHT; i++) {for (int j = 0; j < WIDTH; j++) {if (blocks[i][j]) {// 蛇身颜色,将HSV颜色空间转化为RGB形式color = HSVtoRGB(blocks[i][j] * 10, 0.8, 1);}else {//普通格子color = EGERGB(150, 150, 150);}setfillcolor(color);//i是行(y),j是列(x)bar(j*BLOCK_SIZE, i*BLOCK_SIZE, (j + 1)*BLOCK_SIZE, (i + 1)*BLOCK_SIZE);}}// 食物setfillcolor(GREEN);bar(food_j*BLOCK_SIZE, food_i*BLOCK_SIZE, (food_j + 1)*BLOCK_SIZE, (food_i + 1)*BLOCK_SIZE);if (is_failure) {//如果游戏失败setcolor(RED);setfont(80, 0, "宋体");xyprintf(240, 220, "GAME OVER");}
}//与输入无关的更新函数
void update_without_input() {// 如果游戏失败,返回if (is_failure)return;static int wait_index = 1;wait_index++;if (wait_index == 10) { //每10帧 执行一次,用这个控制小蛇移动速度move_snake();wait_index = 1;}
}void update_with_input() {if (kbhit()) {char input = getch();switch (input) {case 'w':case 'd':case 's':case 'a':move_direction = input;}}
}int main() {start_up();while (is_run()) {show();update_without_input();update_with_input();delay_fps(60);}closegraph();return 0;
}

ege实现简易版贪吃蛇相关推荐

  1. C/C++制作简易版贪吃蛇游戏

    文章目录 C/C++制作简易版贪吃蛇游戏 一.开发环境 二.设计逻辑 三.代码块 3.1 使用initgraph()函数 3.2定义蛇和食物的结构体 3.3随机产生食物的坐标以及定义初始化的蛇的数据 ...

  2. 用Python做一个游戏——简易版贪吃蛇

    前言 今天,我来分享个中等级的简易版贪吃蛇,这次不是用turtle库,而是用pygame库和sys库. 1.导入库 我们需要把游戏所用的库导入进来: import pygame import sys ...

  3. JavaGUI简易版贪吃蛇小游戏

    做这个小游戏,主要是学习一下游戏制作的基本逻辑,加深对面向对象的理解. 游戏引擎: /*** 大牛程序员写的游戏的公共类 * 使用Game.init()方法初始化游戏* 使用Game.gameOver ...

  4. 简易贪吃蛇小游戏java版_用GUI实现java版贪吃蛇小游戏

    本文实例为大家分享了java版贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 项目结构 新建一个JFrame窗口,作为程序入口 public class GameStart{ public stat ...

  5. c语言小游戏 精简_一个简易的贪吃蛇小游戏C语言源码

    /* *程序名称:贪吃蛇v2.1 *程序描述:一个简易的贪吃蛇小游戏 *版本信息:v2.1 *v1.1版本更新:1:加入菜单选择项 *v1.2版本更新:1:修复菜单选择bug *v1.3班本更新:1: ...

  6. 基于JavaScript实现的网页版贪吃蛇

    效果截图 实现原理 通过div布局来实现贪吃蛇小游戏,html+JavaScript实现, 通过方向键的上下左右实现蛇的移动 首先,地图为一个二维数组 Map[*][*] 蛇的坐标分为X轴和Y轴 即 ...

  7. 软件实习项目2——贪吃喵(猫吃鱼版贪吃蛇)(代码实现)

    软件实习项目2--贪吃喵(猫吃鱼版贪吃蛇)(代码实现) 类变量的定义以及类的初始化__init__ 一.游戏的逻辑 1.猫头的生成 2.鱼的生成 3.猫头和鱼骨的移动 4.按下键盘,改变方向 二.主窗 ...

  8. 软件实习项目2——贪吃喵(猫吃鱼版贪吃蛇)(实验准备与设计)

    软件实习项目2--贪吃喵(猫吃鱼版贪吃蛇)(实验准备与设计) 实验内容 编程语言以及开发环境的选择 实验思路(游戏设计) 一.游戏的逻辑设计 1.猫头的生成 2.鱼的生成 3.猫头和鱼骨的移动 4.按 ...

  9. 软件实习项目2——贪吃喵(猫吃鱼版贪吃蛇)(成品展示)

    软件实习项目2--贪吃喵(猫吃鱼版贪吃蛇)(成品展示) 成品展示 1.开始游戏界面 2.游戏主界面 3.结束游戏界面 视频演示 成品展示 1.开始游戏界面 速度选择: 猫咪类型选择: 2.游戏主界面 ...

  10. 网页版贪吃蛇(HTML 5)

    (文字描述太繁琐了, 贪吃蛇算法很经典不多说, 那个伪播放器,不值一提.) 源码: 网页版贪吃蛇 [http://files.cnblogs.com/crystalplus/%E4%B8%A4%E4% ...

最新文章

  1. 为什么选择数据分析师这个职业?
  2. R语言ggplot2可视化使用ggsave将可视化图像结果保存为SVG文件实战
  3. jquery Ajax 通过jsonp的方式跨域提交表单
  4. -Wl,-rpath=
  5. 证券回购市场repo market
  6. location 拦截所有_让它帮你干掉所有流氓软件,还你一个清静系统
  7. java泛型视频教程_Java泛型快速教程
  8. java递归统计一个文件夹含子文件夹里文件不同后缀的出现次数
  9. linux 管道非阻塞,linux – 管道上的非阻塞读取
  10. 重量级 | 重量级!Maven史上最全教程,看了必懂
  11. webstorm 配置sass
  12. UNIX 环境高级编程(六)—— 程序和进程
  13. java寻路算法_具有指定距离/节点数的寻路算法
  14. 在gfs2中关闭selinux
  15. 华为新机Mate30参数解析,这些参数你都知道是什么意思吗?
  16. 制作一个简单HTML公司官网网页设计(HTML+CSS)
  17. Unity3D视频教程-传智-专题视频课程
  18. 【图像处理】【图像去模糊】 总结
  19. react-router v4 路由改变页面不刷新
  20. 天没有塌下来,这里有GitHub之外的五个最佳选择

热门文章

  1. 职场小白之隐藏或显示按钮
  2. 楚留香手游服务器维护,楚留香手游维护公告,更新部分玩法功能
  3. linux硬盘启动错误代码,解决由于 fstab 错误而出现 Linux VM 启动 - Virtual Machines | Microsoft Docs...
  4. 面经:MobileNetV123特点汇总
  5. 气象信息化:看大数据如何拨云见日
  6. dvt高危患者的护理措施_LC 术后 VTE 发生的原因及护理干预措施
  7. 看完这篇文章,你就能掌握机器学习了——从线性回归到深度学习
  8. 如何给别人介绍一个你做过的项目
  9. 综合应用能力一 计算机类题库,事业单位综合应用能力试题(C类):题型早知道——科技应用...
  10. 休闲食品品牌行业研究报告-面朝-202102.pdf(附下载地址)