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

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

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

注:要运行该代码需要正确配置,连接好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->x<900&&head->y>0&&head->y<900)

{

setfillcolor(EGERGB(255,0,0));

bar(p->x-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)outtextxy(250,460,"菜鸟水平");

if(sum>=20&&sum<40)outtextxy(250,460,"高手水平");

setfont(70,0,"宋体");

if(sum>=40&&sum<60)outtextxy(100,460,"你骨骼精奇,是个奇才");

if(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)outtextxy(250,460,"菜鸟水平");

if(sum>=20&&sum<40)outtextxy(250,460,"高手水平");

setfont(70,0,"宋体");

if(sum>=40&&sum<60)outtextxy(100,460,"你骨骼精奇,是个奇才");

if(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);

}

}

运行效果截图:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值