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

贪吃蛇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;}
    推荐阅读
  • 全国最出名的凉皮(全国哪的凉皮最好吃)

    陕西凉皮陕西凉皮起源于唐代,是陕西特有的美食之一。陕西凉皮的口味特别,老少皆喜欢。这才使得陕西凉皮受到大众的欢迎。陕西凉皮大多数是用小麦面粉制作的,做出来的凉皮具有浓郁的面香味。但要使凉皮更好吃,料汁是关键。在凉皮中加入蒜泥、醋、黄瓜丝和芝麻,再淋上辣椒油,这才是陕西凉皮的灵魂。汉中面皮最令人着迷的是它软糯香辣的口感及主要味型。濮阳裹凉皮濮阳裹凉皮是河南濮阳的一种特色小吃。

  • 2022年伊犁河谷杏花花期预报(2020伊犁杏花花期)

    以新源县吐尔根乡杏树发育情况及当地气象条件为依据进行计算,预计2022年伊犁河谷杏树开花期接近常年,详细情况见下列图表。

  • 甲沟炎严重了没事吧(问题不大但伤害性极强)

    甲沟炎主要形成的病因有甲沟部位组织出现了刺伤或者是出现擦伤等。甲沟炎有什么症状甲沟炎常发生在一侧甲沟皮下,表现红肿、疼痛,一般无全身症状。甲沟炎要及时处理甲沟炎、嵌甲不治疗不会自行痊愈,时间长了以后就会出现化脓。甲沟炎如何预防及时治疗如果趾甲旁出现了细小的损伤,应及时用碘伏等消毒外敷,保持伤口清洁卫生,防止伤口感染而引起甲沟炎发生。

  • 佛山哪里看儿科比较好(家长不用到处打听)

    最近,有自媒体通过网络搜集,把据说是佛山最受网民喜欢的医生名单列出来。再开药给我们,说吃完药还要再复查一次。不过在佛山的各大网络论坛上,也有很多人对她不满,说她动不动就吊针,或要求小朋友住院。佛山市中医院:邓丽莎:小儿积食网民评价:良好网民1:有段时间睿睿胃口差,要哄很久才吃一口饭。每次宝宝感冒或发烧都会找这两个医生看的。

  • 七鲜超市购物指南(七鲜超市中秋专场来袭)

    数据显示,截至8月28日,京东自营超市七鲜的月饼销售额同比去年农历同期增长52%。为满足多元化的口味享受,七鲜超市准备多品牌、多口味月饼,让消费者一饱口福。国潮当道,融入中华传统文化元素的京式月饼“代言人”,中华老字号品牌稻香村同样深受喜爱。即日起至9月12日,来七鲜中秋会场,选购爆款好食好礼,共庆中秋佳节。

  • 粉丝怎么炒不粘在一起(粉丝如何炒不粘在一起)

    粉丝怎么炒不粘在一起烹饪技巧:粉丝在泡的时候切记要用冷水,不管一年四季天气如何,都是用冷水,而且泡粉丝的时间不能太久,一般只需要20分钟即可漏出沥水炒粉丝想要不粘锅,锅中的油就不能太多,粉丝不能有太多水分。粉丝在切的时候尽量切短一点,这样在炒的时候就不会成坨,不会粘在一起。食材:粉丝350克(水泡)、肉末50克、葱花少许、青红椒少许。

  • word如何看全部页码(设置一下就可以)

    以下内容希望对你有帮助!word如何看全部页码首先,我们打开一个多页的word文档,然后选择。一般情况下我们会选择把页码设置在页面底端,选择“1/1”的页码样式或者“第几页共几页”的页码样式。点击后,选择上方的关闭页眉和页脚。最后,再去页面中看,就可以在下方位置处看到页码的信息了。当然,如果只是想知道当前文档有几页的话也可以看左下角的信息栏,那里也有显示。

  • 风起陇西有演技吗(风起陇西定档央八)

    4月14日,电视剧《风起陇西》终于曝出了定档消息,预期4月27日上线央八。不出意外地话,《风起陇西》有望成为热度赶超《风起洛阳》,口碑突破《长安十二时辰》的出圈之作。在人物设定上,剧中的陈恭与荀诩是强强联合,高智商联手。这危机重重的情节,就是《风起陇西》上线之后成为爆款的基础条件。至于郭京飞和董子健,则是因为两人是继《刺杀小说家》之后再次合作的路阳。

  • 驾校行业竞争分析(学车平台猪兼强)

    7月31日,猪兼强给出了态度,承诺在签订合同解除协议后30个工作日内退还款项。不过,深圳猪兼强退款难事件爆出后,天猫上的相关产品已经下架。训练场门口还被贴了一张公告,称深圳猪兼强已拖欠该场地租金1个月以上,物业多次催讨后也未有积极回应。猪兼强相关负责人在此进行了公开回应,并组织想要退款的学员签订合同解除协议书。猪兼强工作人员表示需要30个工作日左右。

  • 洛克王国摩羯星辰塔怎么打(奥特兰克山谷第五关BOSS冰雪之王洛克霍拉数据)

    #炉石传说佣兵战纪#冰雪之王洛克霍拉,现在小编就来说说关于洛克王国摩羯星辰塔怎么打?洛克王国摩羯星辰塔怎么打#炉石传说佣兵战纪#冰雪之王洛克霍拉一、属性:冰雪之王洛克霍拉在一个角色死亡后,获得3/10及3冰霜伤害。目标的下一个技能会使其在该回合获得4冰霜虚弱。随机攻击一个敌人。