百摩网
当前位置: 首页 生活百科

贪吃蛇c++代码详解(最浪漫的编程代码)

时间:2023-06-01 作者: 小编 阅读量: 8 栏目名: 生活百科

所以我在这里就教大家使用简单的图形化工具——easyx图形界面库,做一些好玩的,超丝滑的贪吃蛇2背景知识开发贪吃蛇小游戏,让初学者也能感受界面的魅力。3错误及决绝方案此程序使用Vs209+easyx开发。刚开始学习C语言或者没接触过easyx的伙伴,拿到代码之后肯定有很多的错误,这就是所谓的给了源码也不能运行,所以配置环境和查看报错也是作为编程学习者,必须要掌握的技能。

1 贪吃蛇效果展示

前言:C语言初学者都是在控制台上开发一些小游戏什么,由于没有界面(比如图片、音乐,不能做出拥有自己风格的程序)学起来比较乏味,很难坚持下去。所以我在这里就教大家使用简单的图形化工具——easyx图形界面库,做一些好玩的,超丝滑的贪吃蛇

2 背景知识

开发贪吃蛇小游戏,让初学者也能感受界面的魅力。做的不是很完善,希望大家可以自己动手完善它表白程序设计原理:

第一步,我们需要一张地图,图形库初始化的窗口是自带坐标的(左上角为0,0)。

第二步,我们需要一条蛇,这条蛇由蛇头和蛇身组成(这里我们初始化三节蛇)。

第三步,我们需要食物,并且在蛇吃掉食物之后将蛇的身体变长,而且重新生成一个食物。

第四步,蛇需要移动,这应该是最难实现的(实现蛇身坐标的传值,除蛇头以外,每一节蛇的坐标都是上节蛇的上一次运动之前的坐标,有点绕~)。

第五步,我们需要能用键盘控制蛇的运动方向,这个会和蛇的移动有一些联系。

第六步,蛇撞到墙或者撞到自己的身体就会死亡(判断坐标是否重合就可以)。

3 错误及决绝方案

此程序使用Vs209+easyx开发。刚开始学习C语言或者没接触过easyx的伙伴,拿到代码之后肯定有很多的错误,这就是所谓的给了源码也不能运行,所以配置环境和查看报错也是作为编程学习者,必须要掌握的技能。相关知识的基础讲解可观看专栏教程:

4. 话不多说上代码

4.1 头文件snake.h

我们把一些函数的声明,和结构体的定义放在头文件中:

#ifndef _SNAKE_H_#define _SNAKE_H_#include<graphics.h>#include<conio.h>#include<stdio.h>#include<time.h>#define WIN_WIDTH 640 //窗口宽高#define WIN_HEIGHT 480#define MAX_SNAKE 10000 //蛇的最大节数enum DIR //蛇的方向{ UP, DOWN, LEFT, RIGHT,};//每一节蛇的位置信息typedef struct _Pos{ int x; int y; DWORD color;}Pos;typedef struct Snake_tlg //蛇的结构体{ int num; int dir;//蛇的方向 int score;//分数 int size;//蛇的宽度和高度 int speed;//移动速度 Pos coor[MAX_SNAKE];}Snake;typedef struct Food_tlg{ int x; int y; int r; int flag; DWORD color;}Food;//画眼睛函数void DrawEye(int x, int y);//初始化数据void GameInit();//游戏的绘制void GameDraw();//蛇的移动void SnakeMove();//控制方向void KeyControl();//吃食物void EatFood();//暂停游戏 按空格暂停和继续void stop();//定时器bool Timer(clock_t ms);#endif

4.2 实现文件snake.cpp

OK,头文件部分完毕,接下来进入snake.cpp代码编写环节。

#include"snake.h"Snake snake;Food food;//画眼睛函数void DrawEye(int x, int y){ setfillcolor(WHITE); solidcircle(x, y, 3); setfillcolor(BLACK); solidcircle(x, y, 2);}void GameInit(){ srand(GetTickCount()); //初始化蛇 snake.num = 10; snake.dir = RIGHT; snake.score = 0; snake.size = 10; snake.speed = 1; snake.coor[0].x = 20; snake.coor[0].y = 10; for (int i = 0; i < snake.num; i++) {snake.coor[i].color = GREEN; } //初始化食物 food.x = rand() % (WIN_WIDTH - 10); food.y = rand() % (WIN_HEIGHT - 10); food.flag = 1; food.r = rand() % 3 + 2; food.color = RGB(rand() % 256, rand() % 256, rand() % 256);}void GameDraw(){ //设置背景颜色 setbkcolor(RGB(191, 215, 215)); cleardevice(); //画蛇for (int i = 0; i < snake.num; i++) {setfillcolor(snake.coor[i].color);solidcircle(snake.coor[i].x, snake.coor[i].y, snake.size / 2); } //画眼睛 int eyewidth = 5; switch (snake.dir) { case UP: case DOWN:DrawEye(snake.coor[0].x - eyewidth, snake.coor[0].y);DrawEye(snake.coor[0].x + eyewidth, snake.coor[0].y);break; case LEFT: case RIGHT:DrawEye(snake.coor[0].x, snake.coor[0].y - eyewidth);DrawEye(snake.coor[0].x, snake.coor[0].y + eyewidth);break; } //画食物 if (food.flag == 1) {setfillcolor(food.color);solidcircle(food.x, food.y, food.r); } //显示分数 char temp[20] = "; sprintf(temp, "分数:%d", snake.score); setbkmode(TRANSPARENT); outtextxy(20, 20, temp);}void SnakeMove(){ for (int i = snake.num - 1; i > 0; i--)//从最后一节蛇开始,每一节蛇都等于前一节蛇的上一次坐标 {snake.coor[i].x = snake.coor[i - 1].x;snake.coor[i].y = snake.coor[i - 1].y; } //根据方向移动 switch (snake.dir) { case UP:snake.coor[0].y -= snake.speed;if (snake.coor[0].y + 10 <= 0){snake.coor[0].y = WIN_HEIGHT;}break; case DOWN:snake.coor[0].y += snake.speed;if (snake.coor[0].y - 10 >= WIN_HEIGHT){snake.coor[0].y = 0;}break; case LEFT:snake.coor[0].x -= snake.speed;if (snake.coor[0].x + 10 <= 0){snake.coor[0].x = WIN_WIDTH;}break; case RIGHT:snake.coor[0].x += snake.speed;if (snake.coor[0].x - 10 >= WIN_WIDTH){snake.coor[0].x = 0;}break; }}void KeyControl(){ //使用win32API获取键盘消息 if (GetAsyncKeyState(VK_UP) && snake.dir != DOWN) {snake.dir = UP; } if (GetAsyncKeyState(VK_DOWN) && snake.dir != UP) {snake.dir = DOWN; } if (GetAsyncKeyState(VK_LEFT) && snake.dir != RIGHT) {snake.dir = LEFT; } if (GetAsyncKeyState(VK_RIGHT) && snake.dir != LEFT) {snake.dir = RIGHT; } //按A键加速,不按回复初始状态 if (GetAsyncKeyState('A') && snake.speed == 1) {snake.speed = 5; } else if (snake.speed == 5) {snake.speed = 1; }}void EatFood(){ if (snake.coor[0].x >= food.x - food.r && snake.coor[0].x <= food.x + food.r &&snake.coor[0].y >= food.y - food.r && snake.coor[0].y <= food.y + food.r &&food.flag == 1) {snake.num += 5;snake.score += 10;food.flag = 0;//每一节的颜色都要初始化for (int i = snake.num - 5; i < snake.num; i++){snake.coor[i].color = food.color;} } if (food.flag == 0) {food.x = rand() % (WIN_WIDTH - 10);food.y = rand() % (WIN_HEIGHT - 10);food.flag = 1;food.r = rand() % 10 + 3;food.color = RGB(rand() % 256, rand() % 256, rand() % 256); }}void stop(){ if (_kbhit() && _getch() == 32) {while (getch() != 32); }}bool Timer(clock_t ms){ static clock_t t = clock(); if (clock() - t > ms) {t = clock();return true; } return false;}

4.3 测试文件main.cpp

最后我们一起来测试一下吧

#include"snake.h"int main(){ //创建一个图形窗口 initgraph(WIN_WIDTH, WIN_HEIGHT); GameInit(); BeginBatchDraw();//① while (1) {if(Timer(10)){SnakeMove();}GameDraw();FlushBatchDraw();//②EatFood();KeyControl();stop(); } EndBatchDraw();//③①②③为双缓冲绘图防止闪屏代码 //关闭图形窗口 closegraph(); return 0;}
    推荐阅读
  • 蟑螂是如何进入家里的(蟑螂怎么进屋子里的)

    蟑螂大部分是从外面来的,有很多渠道来到家中。比如通过门窗缝隙、墙洞、管线穿墙缝隙、下水道等从室外或邻居家爬进家里,或者会通过购物回来随货物携带进入家庭。发现家里有蟑螂的时候,需将家里打扫个干净,不能有垃圾的存在。因在干净的环境里,这种虫类很难生存。

  • 省考行测逻辑判断学霸总结(判断推理速记考点)

    判断推理速记考点今天图图为大家整理好了:判断推理考前速记知识点包含图形推理、定义判断、类比推理、逻辑判断、科学推理考前再过一遍!判断推理(一)图形推理【速记一】组成相同考位置题干图形元素组成相同时,优先看位置有框架或。

  • 佛跳墙电视剧剧情(佛跳墙电视剧剧情介绍)

    佛跳墙电视剧剧情宫廷举行“御厨评鉴大赛”,由太后和皇帝请自品尝遴选。曹达顺理成章的成为首席御厨。使奉朝廷颁布令全国各省推派代表献菜,总督熊彰为此举办斗菜比赛,福州知府鲍余尽心竭力的网罗名厨,陈佳瑶当然是第一人选。福州有个洋人买办查士弥奉密令到福州监视斗菜,却看上了知府千金鲍凤盏。成为名传千古的佳肴,夺回郑家历代名厨的美名。

  • 历经八十六载风霜(八十春秋八十月)

    历经八十六载风霜《八十中秋八十月》父亲躺在正房堂屋东侧靠墙一边的塌铺上,已经差不多一年了。他受不了棉被直接覆盖在胸部因心脏剧烈跳动而产生的共颤。入秋时节天渐清凉,接近中秋,每日的夜晚仿佛也明亮了许多。父亲的病日见好转。赶在中秋月满之前,还有希望。八月十五中秋依约而临。再又十年的中秋,那年父亲40岁。父亲50岁那年的中秋。父亲80岁那年,他咳嗽了一段时间,入春不久,忽然说想吃月饼。

  • 洗牙齿有什么好处和坏处(盘点洗牙的好处和坏处)

    洗牙齿有什么好处和坏处没有了牙结石,也就没有致病菌地感染,这时刷牙是不会牙龈出血,也就是说牙周炎会逐渐缓解,遗憾的是牙结石导致的牙龈萎缩不可逆,牙龈是不能恢复到正常的高度。另外消毒安全也要重视!

  • 刚刚出生的宝宝有蒙古斑怎么回事(出生就带着蒙古斑的小孩子身体上健康的吗)

    蒙古斑可能发生于身体的任何部位,臀部和腰骶部比较多见。这是人体残留的一种体质特征,每个种族都有蒙古斑,不过出现的概率有所不同。蒙古斑一般是新生儿最常见的胎记,是先天性的,发生率也比较高。值得注意的是,如果在成年期蒙古斑仍无法消退,就要及时到正规的医院接受治疗,以免错过最佳治疗时间。

  • 求大神推荐几本好看的虐心小说(五本虐心类小说推荐)

    最后空华向桑陌下跪,舍弃了天上地下独一只的麒麟角,丢了冥王的位子,换得桑陌醒来,最后一家三口相守,求仁得仁,最终圆满。封面那道伤痕,看来小小的,但在白色的心脏上显得触目惊心。孙嘉遇对着赵玫声声说着的话始终响彻耳边。最终,剩下一地悲怆。刚出生,父遭贬谪。储位之争,太子落败,她与他订立终生,远行永州。二十九岁成为帝妃。曾怀抱少女梦想,与一人执手偕老,死生契阔。不得不说《活着》这书题很好!

  • 婚假丧假等国家规定几天(婚假丧假有几天呢)

    接下来我们就一起去研究一下吧!婚假丧假等国家规定几天根据广东省企业职工假期待遇死亡抚恤暂行规定,职工本人结婚,可享受婚假3天。职工的直系亲属死亡,可以给予3天内的丧假。假期的工资按照正常工作时间工资计算。如果想知道更多咨询,记得关注我!

  • 聚乙烯和聚丙烯的区别(聚乙烯和聚丙烯的区别是什么)

    聚乙烯是乙烯经聚合制得的一种热塑性树脂。甲基排列在分子主链的同一侧称等规聚丙烯,若甲基无秩序的排列在分子主链的两侧称无规聚丙烯,当甲基交替排列在分子主链的两侧称间规聚丙烯。这种条件下聚合的聚乙烯分子是线性的,且分子链很长,分子量高达几十万。聚丙烯也包括丙烯与少量乙烯的共聚物在内。由于结构规整而高度结晶化,故熔点可高达167℃。缺点是耐低温冲击性差,较易老化,但可分别通过改性予以克服。

  • 苗圃个人资料 苗圃个人资料简介飞机

    父亲苗德发是陕西省戏曲研究院演员,也是国家二级演员,代表作品有《送亲娘》、《古城会》和《瘦马记》等。1995年,苗圃获得了全国第二届影视表演推新人大赛第一名。如今苗圃和老公感情不错,育有一子一女,儿女双全。

热门推荐

野生蒲公英几月份开花(你知道吗) 波斯菊什么时候开花(波斯菊哪个时候开花) 泰捷电视盒子好用么(这款泰捷电视盒子仍然能激起你的购买欲望) 紫藤种子种植方法(紫藤种子如何种植) 牛肉和鹅肉能一起吃吗(牛肉的营养价值) 海岸线最长的国家是哪个国家 哪个国家有最长的海岸线 宝宝吐奶什么时候会好转(宝宝吐奶的情况什么时候开始有改善) 为什么春天容易犯困(为什么春天容易犯困且全身乏力,脸色不好) 羊羔绒外套可以用洗衣机洗吗(羊绒外套可以用洗衣机洗吗?) 车辆续保应该注意什么(车子第二年续保) 高考满分议论作文大全(高考作文当代青年的理想获满分) 苹果手机的各种秘密功能(苹果手机隐藏的小技巧) 炸蘑菇怎么做不软还酥脆的做法分享(炸蘑菇怎么做不软还酥脆的做法分享) 东航客机降落时爆胎(致危险品在航班落地后发生90度倒置并泄漏) 苏州昆曲博物馆参观时没带身份证可以吗? 2022下半年桂林教师资格考试准考证打印时间 swatch集团进行内部贸易的动因(Swatch集团40年来首次出现亏损) 公共营养师属于国家职业资格证吗(考个公共营养师职业技能等级证书) 马来西亚的人文风情(你不知道的国家冷知识) 智能门锁的销售市场趋势数据(2022年8月美国电商市场智能门锁品牌销量TOP10)