小樱知识 > 生活常识贪吃蛇c++代码详解(最浪漫的编程代码)

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

提问时间:2022-03-10 14:35:09来源:小樱知识网


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>#defineWIN_WIDTH640//窗口宽高#defineWIN_HEIGHT480#defineMAX_SNAKE10000//蛇的最大节数enumDIR//蛇的方向{UP,DOWN,LEFT,RIGHT,};//每一节蛇的位置信息typedefstruct_Pos{intx;inty;DWORDcolor;}Pos;typedefstructSnake_tlg//蛇的结构体{intnum;intdir;//蛇的方向intscore;//分数intsize;//蛇的宽度和高度intspeed;//移动速度Poscoor[MAX_SNAKE];}Snake;typedefstructFood_tlg{intx;inty;intr;intflag;DWORDcolor;}Food;//画眼睛函数voidDrawEye(intx,inty);//初始化数据voidGameInit();//游戏的绘制voidGameDraw();//蛇的移动voidSnakeMove();//控制方向voidKeyControl();//吃食物voidEatFood();//暂停游戏按空格暂停和继续voidstop();//定时器boolTimer(clock_tms);#endif

4.2 实现文件snake.cpp

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

#include"snake.h"Snakesnake;Foodfood;//画眼睛函数voidDrawEye(intx,inty){setfillcolor(WHITE);solidcircle(x,y,3);setfillcolor(BLACK);solidcircle(x,y,2);}voidGameInit(){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(inti=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);}voidGameDraw(){//设置背景颜色setbkcolor(RGB(191,215,215));cleardevice();//画蛇for(inti=0;i<snake.num;i++){setfillcolor(snake.coor[i].color);solidcircle(snake.coor[i].x,snake.coor[i].y,snake.size/2);}//画眼睛inteyewidth=5;switch(snake.dir){caseUP:caseDOWN:DrawEye(snake.coor[0].x-eyewidth,snake.coor[0].y);DrawEye(snake.coor[0].x+eyewidth,snake.coor[0].y);break;caseLEFT:caseRIGHT: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);}//显示分数chartemp[20]="";sprintf(temp,"分数:%d",snake.score);setbkmode(TRANSPARENT);outtextxy(20,20,temp);}voidSnakeMove(){for(inti=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){caseUP:snake.coor[0].y-=snake.speed;if(snake.coor[0].y+10<=0){snake.coor[0].y=WIN_HEIGHT;}break;caseDOWN:snake.coor[0].y+=snake.speed;if(snake.coor[0].y-10>=WIN_HEIGHT){snake.coor[0].y=0;}break;caseLEFT:snake.coor[0].x-=snake.speed;if(snake.coor[0].x+10<=0){snake.coor[0].x=WIN_WIDTH;}break;caseRIGHT:snake.coor[0].x+=snake.speed;if(snake.coor[0].x-10>=WIN_WIDTH){snake.coor[0].x=0;}break;}}voidKeyControl(){//使用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;}elseif(snake.speed==5){snake.speed=1;}}voidEatFood(){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(inti=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);}}voidstop(){if(_kbhit()&&_getch()==32){while(getch()!=32);}}boolTimer(clock_tms){staticclock_tt=clock();if(clock()-t>ms){t=clock();returntrue;}returnfalse;}

4.3 测试文件main.cpp

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

#include"snake.h"intmain(){//创建一个图形窗口initgraph(WIN_WIDTH,WIN_HEIGHT);GameInit();BeginBatchDraw();//①while(1){if(Timer(10)){SnakeMove();}GameDraw();FlushBatchDraw();//②EatFood();KeyControl();stop();}EndBatchDraw();//③①②③为双缓冲绘图防止闪屏代码//关闭图形窗口closegraph();return0;}

以上内容就是为大家推荐的贪吃蛇c++代码详解(最浪漫的编程代码)最佳回答,如果还想搜索其他问题,请收藏本网站或点击搜索更多问题

内容来源于网络仅供参考
二维码

扫一扫关注我们

版权声明:所有来源标注为小樱知识网www.xiaoyin02.com的内容版权均为本站所有,若您需要引用、转载,只需要注明来源及原文链接即可。

本文标题:贪吃蛇c++代码详解(最浪漫的编程代码)

本文地址:https://www.xiaoyin02.com/shcs/96948.html

相关文章