/* 我的想法是,在各个身体部位的运动当中,后一个方块的下一个位置坐标,总是前一个方块的x1,y1,
也就是说后面的方块总是按前面的方块的轨迹运动 .
而且第一个方块是不能回头的,所以用到if((a[0].x0!=(a[1].x0-dx))).......这一句。
我也想编类似贪吃蛇的游戏.....别人写的没有没有注释,看不太懂..所以我先依自已的想法,写了
一个小实验品,写得差不多了,但是很多细节处理不好!!如:我没有写假如蛇碰到自已会死;还有
就是食物随机出现的位置有可能出现在身体正在的位置,这样的话就看不见它了。。等等。
*/
#include"stdio.h"
#include"graphics.h"
#include"stdlib.h"
#define RIGHT 0x4d00
#define LEFT 0x4b00
#define UP 0x4800
#define DOWN 0x5000
#define ESC 0x011b
int dx; /*移动时X轴身体变化距离*/
int dy; /*移动时Y轴身体变化距离*/
int N=4; /*身体节数*/
/*存放身体每一部份的信息*/
struct body
{
int x0,y0; /*每个方块的左上角的坐标,当物体移动时它最先改变*/
int x1,y1; /*每个块的左上角坐标,但主要是为了给它后面的方块指定他下一位置的坐标*/
}a[80]={{300,100,300,100},
{290,100,290,100}, /*定义了四块身体*/
{280,100,280,100},
{270,100,270,100}
};
/*存放每一块食物的信息*/
struct boX
{
int x; /*食物左上角横坐标*/
int y; /*食物左上角纵坐标*/
int live; /*食物是否存在,1:存在,0:不存在*/
}box; /*定义一个食物变量*/
/*初始化图形*/
void initgr()
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"");
setcolor(YELLOW);
setlinestyle(0,0,3);
rectangle(200,150,440,200);
setcolor(7);
settextstyle(0,0,4);
setcolor(9);
outtextxy(240,160,"SNAKE");
settextstyle(0,0,1);
setcolor(7);
outtextxy(280,220,"By UFOZH");
outtextxy(230,240,"press any key to continue...");
getch();
cleardevice();
setfillstyle(1,BLUE);
bar(150,80,450,380);
}
/*****************************************************************************/
main()
{
int n,i;
int key; /*存放按键值*/
dx=10; /*每个方块每次移动长度*/
dy=10;
initgr();
setlinestyle(0,0,1);
setcolor(WHITE);
randomize(); /*游戏开始前画出第一个要吃掉的方块*/
box.x=300+10*(rand()%14+1);
box.y=100+10*(rand()%26+1);
box.live=1;
rectangle(box.x,box.y,box.x+10,box.y+10);
/*默认刚开始条形是向右移动*/
while(!kbhit())
{
a[0].x0=a[0].x0+dx;
for(i=1;i<N;i++)
{
a[i].x0=a[i-1].x1;
a[i].y0=a[i-1].y1;
}
setcolor(BLUE);
for(n=0;n<4;n++)
rectangle(a[n].x1,a[n].y1,a[n].x1+dx,a[n].y1+dy);
setcolor(WHITE);
delay(3000);
for(n=0;n<4;n++)
rectangle(a[n].x0,a[n].y0,a[n].x0+dx,a[n].y0+dy);
for(i=0;i<N;i++)
{
a[i].x1=a[i].x0;
a[i].y1=a[i].y0;
}
delay(50000);
}
key=bioskey(0);
while(1)
{
switch(key)
{
case RIGHT:if((a[0].x0!=(a[1].x0-dx))) /*当第一个方块不是在第二个的正左边时,条形向右移,否则执行case LEFT*/
{
while(!kbhit())
{
if(a[0].x0<150||a[0].x0>450||a[0].y0<80||a[0].y0>380) /*当第一个方块出个任四个界时,退出*/
exit(0);
if(box.live==0) /*当食物不存在时,随机位置增加一食物*/
{
box.x=10*(rand()%30+15);
box.y=10*(rand()%30+8);
rectangle(box.x,box.y,box.x+10,box.y+10);
box.live=1; /*食物变为存在*/
}
/*当蛇头在食物的正左方且食物存在时,食物被吃掉*/
if(((a[0].x0==(box.x-10))&&(a[0].y0==box.y))&&(box.live==1))
{
for(i=N;i>=1;i--) /*把现有的身体统一向后移一个单位*/
{
a[i].x0=a[i-1].x0;
a[i].x1=a[i-1].x1;
a[i].y0=a[i-1].y0;
a[i].y1=a[i-1].y1;
}
a[0].x0=box.x; /*把食物当做身体加入蛇头*/
a[0].y0=box.y;
a[0].x1=a[0].x0;
a[0].y1=a[0].y0;
N++; /*身体节数加1*/
box.live=0; /*食物消失*/
}
a[0].x0+=dx;
for(i=1;i<N;i++)
{
a[i].x0=a[i-1].x1;
a[i].y0=a[i-1].y1;
}
setcolor(BLUE);
for(n=0;n<N;n++)
rectangle(a[n].x1,a[n].y1,a[n].x1+dx,a[n].y1+dy);
setcolor(WHITE);
delay(3000);
for(n=0;n<N;n++)
rectangle(a[n].x0,a[n].y0,a[n].x0+dx,a[n].y0+dy);
for(i=0;i<N;i++)
{
a[i].x1=a[i].x0;
a[i].y1=a[i].y0;
}
delay(50000);
}
key=bioskey(0);
break;
}
case LEFT:if((a[0].x0!=(a[1].x0+dx))) /*当第一个方块不是在第二个的正右边时,条形向左移*/
{
while(!kbhit())
{
if(a[0].x0<150||a[0].x0>450||a[0].y0<80||a[0].y0>380)
exit(0);
if(box.live==0)
{
box.x=10*(rand()%30+15);
box.y=10*(rand()%30+8);
rectangle(box.x,box.y,box.x+10,box.y+10);
box.live=1;
}
if(((a[0].x0==(box.x+10))&&(a[0].y0==box.y))&&(box.live==1))
{
for(i=N;i>=1;i--)
{
a[i].x0=a[i-1].x0;
a[i].x1=a[i-1].x1;
a[i].y0=a[i-1].y0;
a[i].y1=a[i-1].y1;
}
a[0].x0=box.x;
a[0].y0=box.y;
a[0].x1=a[0].x0;
a[0].y1=a[0].y0;
N++;
box.live=0;
}
a[0].x0-=dx;
for(i=1;i<N;i++)
{
a[i].x0=a[i-1].x1;
a[i].y0=a[i-1].y1;
}
setcolor(BLUE);
for(n=0;n<N;n++)
rectangle(a[n].x1,a[n].y1,a[n].x1+dx,a[n].y1+dy);
setcolor(WHITE);
delay(3000);
for(n=0;n<N;n++)
rectangle(a[n].x0,a[n].y0,a[n].x0+dx,a[n].y0+dy);
for(i=0;i<N;i++)
{
a[i].x1=a[i].x0;
a[i].y1=a[i].y0;
}
delay(50000);
}
key=bioskey(0);
break;
}
key=RIGHT; /*否则执行case RIGHT*/
break;
case UP:if((a[0].y0!=(a[1].y0+dx))) /*当第一个方块不是在第二个的正下方时,条形向上移,否则执行case DOWN*/
{
while(!kbhit())
{
if(a[0].x0<150||a[0].x0>450||a[0].y0<80||a[0].y0>380)
exit(0);
if(box.live==0)
{
box.x=10*(rand()%30+15);
box.y=10*(rand()%30+8);
rectangle(box.x,box.y,box.x+10,box.y+10);
box.live=1;
}
if(((a[0].y0==(box.y+10))&&(a[0].x0==box.x))&&(box.live==1))
{
for(i=N;i>=1;i--)
{
a[i].x0=a[i-1].x0;
a[i].x1=a[i-1].x1;
a[i].y0=a[i-1].y0;
a[i].y1=a[i-1].y1;
}
a[0].x0=box.x;
a[0].y0=box.y;
a[0].x1=a[0].x0;
a[0].y1=a[0].y0;
N++;
b
ox.live=0;
}
a[0].y0-=dy;
for(i=1;i<N;i++)
{
a[i].x0=a[i-1].x1;
a[i].y0=a[i-1].y1;
}
setcolor(BLUE);
for(n=0;n<N;n++)
rectangle(a[n].x1,a[n].y1,a[n].x1+dx,a[n].y1+dy);
setcolor(WHITE);
delay(3000);
for(n=0;n<N;n++)
rectangle(a[n].x0,a[n].y0,a[n].x0+dx,a[n].y0+dy);
for(i=0;i<N;i++)
{
a[i].x1=a[i].x0;
a[i].y1=a[i].y0;
}
delay(50000);
}
key=bioskey(0);
break;
}
case DOWN:if((a[0].y0!=(a[1].y0-dx))) /*当第一个方块不是在第二个的正上方时,条形向下移*/
{
while(!kbhit())
{
if(a[0].x0<150||a[0].x0>450||a[0].y0<80||a[0].y0>380)
exit(0);
if(box.live==0)
{
box.x=10*(rand()%30+15);
box.y=10*(rand()%30+8);
rectangle(box.x,box.y,box.x+10,box.y+10);
box.live=1;
}
if(((a[0].y0==(box.y-10))&&(a[0].x0==box.x))&&(box.live==1))
{
for(i=N;i>=1;i--)
{
a[i].x0=a[i-1].x0;
a[i].x1=a[i-1].x1;
a[i].y0=a[i-1].y0;
a[i].y1=a[i-1].y1;
}
a[0].x0=box.x;
a[0].y0=box.y;
a[0].x1=a[0].x0;
a[0].y1=a[0].y0;
N++;
box.live=0;
}
a[0].y0+=dy;
for(i=1;i<N;i++)
{
a[i].x0=a[i-1].x1;
a[i].y0=a[i-1].y1;
}
setcolor(BLUE);
for(n=0;n<N;n++)
rectangle(a[n].x1,a[n].y1,a[n].x1+dx,a[n].y1+dy);
setcolor(WHITE);
delay(3000);
for(n=0;n<N;n++)
rectangle(a[n].x0,a[n].y0,a[n].x0+dx,a[n].y0+dy);
for(i=0;i<N;i++)
{
a[i].x1=a[i].x0;
a[i].y1=a[i].y0;
}
delay(50000);
}
key=bioskey(0);
break;
}
key=UP; /*否则执行case UP*/
break;
case ESC:exit(0); /*按ESC键退出游戏*/
default:exit(0); /*按其它键也退出游戏*/
}
}
closegraph();
}
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |