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

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

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

所以我在这里就教大家使用简单的图形化工具——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;}
    推荐阅读
  • 怎么使三角梅开花不断(促使盆栽三角梅开花的5大绝招)

    促使三角梅开花的5大绝招:1、给尽量多的阳光三角梅是喜欢高温和暴晒的环境的,它特别适合养在有全日照和通风良好的环境下。养护盆栽三角梅一定要避免有霜冻,最低温度保持在5度以上是最好的。生长特别健壮的三角梅能忍受短暂的低温,但在过度低温的时候,它们也会出现落叶休眠的情况。三角梅一定要在生长季节修剪,最好是在它开完花之后进行修剪。

  • 重庆杂酱面的杂酱做法(怎样做重庆杂酱面)

    冷却后倒入塑料袋中,封好袋口。锅中倒入菜籽油,油开后,放入大葱、老姜、八角、桂皮、香叶、茴香等煸炒出香味后,捞出所有的调料。把肥瘦均匀的五花肉切丁,碎米芽菜、豆瓣酱、甜面酱备用待用。锅中倒入菜籽油,待油烧开后关火,等锅内油温降至3成热时,倒入五花肉,加入料酒用中火反复煸炒。待肉呈金黄色时,下入豆瓣酱和甜面酱,快速翻炒。再放入芽菜炒匀,调入白糖即可出锅。

  • 已婚夫妻避孕的方法(夫妻同房抚摸乳房)

    美国曾进行过一项研究,旨在了解“女性身上什么部位最令男性着迷”,结果40%的男性都回答:乳房。在性生活中,对乳房的爱抚是必不可少的。美国多名医学专家所著的《一生的性计划》一书中写道:“如果你想成为一个世界级的爱人,务必记住,调情、拥抱、爱抚、接吻、抚摸乳房、生殖器接触,最后性爱和高潮,这些都是让性爱持续的重点。其中乳房扮演着非常重要的角色。”

  • 幸勿见怪是什么意思(幸勿见怪是啥意思)

    接下来我们就一起去了解一下吧!幸勿见怪是什么意思幸勿见怪:希望(你)不要责怪(我)。指封建帝王到达某地:巡幸。

  • 名著导读朝花夕拾七年级答案(七年级上册名著导读朝花夕拾)

    初中学生有三怕,一怕文言文,二怕写作文,三怕周树人。部编版七年级上册名著导读首推鲁迅的散文作品——《朝花夕拾》,较其他小说而言,他的散文集更多了几分温情和乐趣。所以认识鲁迅,从他的散文入手,不失为一个好的切入点。“五猖会”既是大人们祈福的节日,也是孩子们率性玩乐的日子,但作者并没有感到高兴,这种沉重感深刻地压在作者的记忆中。

  • 国货十大良心洗发水(国内公认十大良心)

    国货十大良心洗发水?话说回来咱们国货洗发水真的变得超级好用,现在小编就来说说关于国货十大良心洗发水?下面内容希望能帮助到你,我们来一起看看吧!

  • 正版剧集(剧集刚收官售后)

    《人世间》的“售后”又来啦!这部于2006年首播并多次重播的经典剧集为一代又一代人带来欢乐记忆如今16年过去剧集的“售后”虽迟但到真好,他们还是记忆中的模样今年另一部无数人心目中的经典中国情景喜剧开山之作——《我爱我家》出版全120集台词书同样也燃起一场剧迷的狂欢再续30年前的“我家”情怀“问苍茫大地谁主沉浮?姆们姆们姆们!”

  • 老掉牙用什么最好(教你几招儿摆脱)

    结果让许多人认为年龄大了掉牙是正常现象,其实这是一个误解。老年人掉牙的主要原因是牙齿疾病,龋病和牙周病是最常见的导致掉牙的牙齿疾病。根据全国口腔健康流行病学调查显示,目前我国60岁以上的老年人平均缺牙10颗左右,缺牙修复率只有18%。合理饮食少吃坚硬的食物。经常吃坚硬的食物,会使牙釉质过度磨损,易使人患牙本质过敏症,严重的可能会造成牙齿崩裂从而影响牙齿的寿命。

  • 9月最值得期待的十部电影(9月份35部电影来袭)

    09月01日《敢死队3》09月05日《挑战者联盟》09月05日《一生一世》09月05日《大峰祖师》09月05日《动物也疯狂》09月05日《卧龙岗》09月05日《摩登森林之美食总动员》09月06日《龟兔再跑》09月08日《分歧者:异类觉醒》09月10日《有一天》09月12日《超体》09月12日《不惧风暴》09月12日《缘来是游戏》09月12日《0.5的爱情》09月12日《女生宿舍》09月12日《诡替

  • 华为mate30pro怎么投屏 华为mate30pro怎么投屏到汽车上

    华为mate30pro投屏的方法:1、打开手机桌面上的选项,点击进去。华为Mate30Pro是华为旗下智能手机,于2019年9月19日在德国慕尼黑发布。华为Mate30Pro搭载了88度超曲面OLED屏幕,采用圆形镜头模组,机身有星河银、翡冷绿、罗兰紫、亮黑四种配色,支持IP68防水。