ege图形库之简单贪吃蛇(c++)

您所在的位置:网站首页 ege图形界面 ege图形库之简单贪吃蛇(c++)

ege图形库之简单贪吃蛇(c++)

2023-01-24 08:31| 来源: 网络整理| 查看: 265

第二次做动画显示效果的小程序,心血来潮想做下儿时的经典游戏----贪吃蛇。由于时间有限,只是简单地做了基本功能,有时间后再完善更多功能。

由于个人水平有限,可能代码有些地方可以改进。不足之处敬请指出。

注:要运行该代码需要正确配置,连接好ege图形库的头文件,做好准备工作。具体教程请看http://jingyan.baidu.com/article/4b07be3c40d35f48b380f3c7.html

编程环境:codeblocks   windows10  corei5 cpu

源代码:

 

#include#include#include#include#define Random(x) (rand() % x)struct position{ int x;int y; position* next;};class snake{private: int direction;public: position *tail; position *head; position* gettail(){return tail;} void settail(position* p){tail=p;} position* gethead(){return head;} void sethead(position* p){head=p;} snake() { tail=new position;head=new position; head->x=75;head->y=15; tail->x=15;tail->y=15; tail->next=new position; tail->next->x=45;tail->next->y=15; tail->next->next=head; direction=4; } void setdirection(int a){direction=a;} int getdirection(){return direction;} void move(int x0,int y0,bool &newfood) { switch(direction) {position*p;int xt;int yt; case 1:{head->next=new position;xt=head->x;yt=head->y;head=head->next;head->x=xt;head->y=yt-30;p=tail->next;delete tail;tail=p;break;} case 2:{head->next=new position;xt=head->x;yt=head->y;head=head->next;head->x=xt;head->y=yt+30;p=tail->next;delete tail;tail=p;break;} case 3:{head->next=new position;xt=head->x;yt=head->y;head=head->next;head->x=xt-30;head->y=yt;p=tail->next;delete tail;tail=p;break;} case 4:{head->next=new position;xt=head->x;yt=head->y;head=head->next;head->x=xt+30;head->y=yt;p=tail->next;delete tail;tail=p;break;} } if(head->x==x0&&head->y==y0) { newfood=1; switch(direction) {int xt;int yt; case 1:{head->next=new position;xt=head->x;yt=head->y;head=head->next;head->x=xt;head->y=yt-30;break;} case 2:{head->next=new position;xt=head->x;yt=head->y;head=head->next;head->x=xt;head->y=yt+30;break;} case 3:{head->next=new position;xt=head->x;yt=head->y;head=head->next;head->x=xt-30;head->y=yt;break;} case 4:{head->next=new position;xt=head->x;yt=head->y;head=head->next;head->x=xt+30;head->y=yt;break;} } } } void show() { position *p=gettail();int sum=0; while(p!=gethead()->next) {sum++; if(head->x>0&&head->xy>0&&head->yx-15,p->y-15,p->x+15,p->y+15); setfillcolor(EGERGB(0,0,255)); bar(p->x-13,p->y-13,p->x+13,p->y+13); p=p->next; } else { setcolor(EGERGB(255,0,0)); setfontbkcolor(EGERGB(0x80,0x00,0x80)); setfont(100,0,"宋体"); outtextxy(250,360,"GAMEOVER"); if(sum=20&&sum=40&&sum=60)outtextxy(200,360,"你已经成仙了"); Sleep(1000); getch(); } int hx,hy; hx=head->x;hy=head->y; position *p2=gettail(); while(p2!=gethead()) { if(hx==p2->x&&hy==p2->y) { setcolor(EGERGB(255,0,0)); setfontbkcolor(EGERGB(0x80,0x00,0x80)); setfont(100,0,"宋体"); outtextxy(250,360,"GAMEOVER"); if(sum=20&&sum=40&&sum=60)outtextxy(200,360,"你已经成仙了"); Sleep(1000); getch(); } p2=p2->next; } } }};int main(){ INITGRAPH(900,900); setfillcolor(EGERGB(255,0,0)); snake s1; char k; bool newfood=1; for(;;) { delay_fps(8); int fx;int fy; if(newfood) { //下面的代码是食物的显示 L:fx=Random(30)+1;fy=Random(30)+1;//贪吃蛇的食物产生位置是随机的 fx=fx*30-15;fy=fy*30-15; bool bo=1; position *p=s1.gettail(); while(p!=s1.gethead()->next) { if(p->x==fx&&p->y==fy){bo=0;break;}//食物不能产生在蛇身体的位置; p=p->next; } if(!bo)goto L; newfood=0; } //手动模式: if(kbhit()) {k=getch(); switch(k) { case 38:if(s1.getdirection()!=2)s1.setdirection(1);break;//根据键值修改对应的方向 case 40:if(s1.getdirection()!=1)s1.setdirection(2);break; case 37:if(s1.getdirection()!=4)s1.setdirection(3);break; case 39:if(s1.getdirection()!=3)s1.setdirection(4);break; } } s1.move(fx,fy,newfood); cleardevice(); s1.show(); setfillcolor(EGERGB(0,0,255)); bar(fx-15,fy-15,fx+15,fy+15); setfillcolor(EGERGB(0,255,0)); bar(fx-15,fy-15,fx+15,fy+15); //Sleep(80); }}

运行效果截图:

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3