
#include<graphicsh>
#include<stdlibh>
#define N 200
#define up 0x4800
#define down 0x5000
#define left 0x4b00
#define right 0x4d00
#define esc 0x011b
#define Y 0x1579
#define n 0x316e
int gamespeed; / 游戏速度 /
int i,key,color;
int score=0; / 游戏分数 /
char cai48H[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x04,0x00,0x18,0x00,0x00,0x00,0x0E,0x00,
0x1C,0x00,0x00,0x00,0x1C,0x00,0x1C,0x00,
0x00,0x00,0x20,0x00,0x38,0x00,0x00,0x00,
0x40,0x00,0x78,0x00,0x00,0x01,0x80,0x40,
0x70,0x00,0x00,0x03,0x80,0xC0,0xE0,0x00,
0x00,0x07,0x80,0x80,0xC0,0x00,0x00,0x0E,
0x11,0x81,0xC0,0x00,0x00,0x08,0x61,0x01,
0x80,0x00,0x00,0x00,0x23,0x03,0x04,0x00,
0x00,0x02,0x02,0x00,0x06,0x00,0x00,0x1E,
0x04,0x00,0x0F,0x00,0x00,0x1C,0x1F,0x80,
0x1E,0x00,0x00,0x08,0x3F,0x80,0x3C,0x00,
0x00,0x00,0xFF,0x80,0x38,0x00,0x00,0x03,
0xFF,0x80,0x78,0x00,0x00,0x0F,0xF8,0x00,
0xF0,0x00,0x00,0x7F,0xF0,0x00,0xE0,0x00,
0x03,0xFF,0xFC,0x01,0x80,0x00,0x03,0xC0,
0xFF,0x01,0x03,0x80,0x01,0x01,0xFF,0x00,
0x03,0x80,0x00,0x01,0x3F,0x00,0x07,0x80,
0x00,0x02,0x11,0x00,0x07,0x00,0x00,0x00,
0x10,0x00,0x07,0x00,0x00,0x00,0x10,0x00,
0x0E,0x00,0x00,0x08,0x10,0x00,0x1C,0x00,
0x00,0x30,0x10,0x00,0x18,0x00,0x00,0x70,
0x10,0x00,0x30,0x00,0x01,0xE0,0x10,0x00,
0x70,0x00,0x03,0x80,0x10,0x00,0x60,0x00,
0x00,0x00,0x30,0x00,0xE0,0x00,0x00,0x00,
0xF0,0x01,0xC0,0x00,0x00,0x00,0x70,0x03,
0xC0,0x00,0x00,0x00,0x10,0x07,0x80,0x00,
0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,
0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x3C,
0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,
0x00,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
char she48H[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,
0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x00,
0x00,0x0E,0x00,0x00,0x00,0x03,0x00,0x07,
0x00,0x00,0x00,0x02,0x00,0x03,0x00,0x00,
0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x02,
0x00,0x00,0xF8,0x00,0x00,0x02,0x00,0x07,
0x86,0x00,0x00,0x02,0x00,0x18,0x03,0x00,
0x00,0x02,0x00,0x00,0x07,0x80,0x00,0x03,
0xF0,0x00,0x07,0x80,0x00,0x0F,0xFC,0x00,
0x0C,0x00,0x00,0x7E,0x3F,0x80,0x00,0x00,
0x01,0xFE,0x1F,0x80,0x00,0x00,0x01,0xE2,
0x39,0x8C,0x00,0x00,0x00,0xC2,0x30,0x08,
0x00,0x00,0x00,0xC2,0x60,0x08,0x00,0x00,
0x00,0xC3,0xE0,0x08,0x60,0x00,0x00,0x7F,
0xE0,0x01,0xE0,0x00,0x00,0x3F,0x80,0x1F,
0xE0,0x00,0x00,0x1E,0x00,0x1F,0x80,0x00,
0x00,0x1E,0x00,0x1F,0x00,0x00,0x00,0x02,
0x38,0x1E,0x00,0x00,0x00,0x07,0xFC,0x1C,
0x00,0x20,0x00,0x07,0xFC,0x18,0x00,0x20,
0x00,0x1F,0x0C,0x10,0x00,0x20,0x00,0x7C,
0x04,0x10,0x00,0x60,0x01,0xF0,0x00,0x10,
0x00,0x60,0x01,0xE0,0x00,0x08,0x00,0xF0,
0x00,0x80,0x00,0x08,0x03,0xF0,0x00,0x00,
0x00,0x07,0xFF,0xF0,0x00,0x00,0x00,0x07,
0xFF,0xF0,0x00,0x00,0x00,0x03,0xFF,0xE0,
0x00,0x00,0x00,0x01,0xFF,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
char tun48H[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x3E,
0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,
0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,
0x03,0xC0,0x00,0x00,0x00,0x00,0x1F,0x00,
0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,
0x00,0x01,0xF8,0x00,0x00,0x00,0x00,0x03,
0xF8,0x00,0x40,0x00,0x00,0x00,0x06,0x07,
0xC0,0x00,0x00,0x00,0x07,0xFF,0xE0,0x00,
0x00,0x00,0x07,0xFF,0xE0,0x00,0x00,0x00,
0x0F,0xFF,0x80,0x00,0x00,0x00,0x7F,0xF8,
0x00,0x00,0x00,0x1F,0xFF,0xF8,0x00,0x00,
0x00,0x1F,0xFF,0xF8,0x00,0x00,0x00,0x1F,
0xFC,0x3C,0x00,0x00,0x00,0x0F,0xF8,0x0E,
0x00,0x00,0x00,0x04,0x70,0x07,0x00,0x00,
0x00,0x00,0x60,0x03,0x80,0x00,0x00,0x00,
0xC0,0x00,0xC0,0x00,0x00,0x01,0x80,0x00,
0x30,0x00,0x00,0x01,0x00,0x3C,0x18,0x00,
0x00,0x02,0x03,0xFF,0x0C,0x00,0x00,0x0C,
0x7F,0xFF,0x8E,0x00,0x00,0x18,0xFF,0xFF,
0xC7,0x80,0x00,0x78,0xFE,0x07,0x87,0xE0,
0x01,0xF0,0x70,0x07,0x03,0xF8,0x07,0xE0,
0x70,0x0E,0x03,0xFE,0x00,0x00,0x38,0x1E,
0x01,0xFE,0x00,0x00,0x3F,0xFE,0x00,0x0C,
0x00,0x00,0x1F,0xFE,0x00,0x00,0x00,0x00,
0x1F,0xFE,0x00,0x00,0x00,0x00,0x0F,0xFE,
0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
char dan48H[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xFC,0x00,0x00,0x00,0x00,0x07,0xFF,
0x00,0x00,0x00,0x00,0x7F,0xC0,0x80,0x00,
0x00,0x03,0xFF,0x80,0x40,0x00,0x00,0x01,
0xF1,0x80,0x40,0x00,0x00,0x01,0x81,0x80,
0xE0,0x00,0x00,0x00,0x01,0x93,0xF0,0x00,
0x00,0x00,0x01,0xFF,0xF0,0x00,0x00,0x00,
0x21,0xFF,0xF0,0x00,0x00,0x00,0x21,0xF8,
0x00,0x00,0x00,0x00,0x61,0xC0,0x00,0x00,
0x00,0x00,0x61,0x80,0x00,0x00,0x00,0x00,
0xF3,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,
0x00,0x00,0x00,0x01,0xFF,0xC0,0x00,0x00,
0x00,0x03,0xFF,0xF8,0x00,0x00,0x00,0x02,
0x00,0xFC,0x00,0x00,0x00,0x04,0x02,0x1F,
0x00,0x00,0x00,0x08,0x03,0x01,0xC0,0x00,
0x00,0x38,0x03,0x00,0x7C,0x00,0x00,0xF8,
0x07,0xF8,0x3F,0xC0,0x01,0xF0,0x3F,0xFE,
0x3F,0xF8,0x03,0xC1,0xFF,0x0F,0x1F,0xF8,
0x00,0x01,0xE3,0x0F,0x0F,0xF0,0x00,0x01,
0xC3,0x0E,0x00,0x00,0x00,0x01,0x83,0xFC,
0x00,0x00,0x00,0x00,0xC7,0xF8,0x00,0x00,
0x00,0x00,0xFF,0xF8,0x00,0x00,0x00,0x00,
0x7F,0xF0,0x00,0x00,0x00,0x00,0x3F,0x03,
0x80,0x00,0x00,0x00,0x03,0x04,0x00,0x00,
0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0x00,
0x1F,0xF8,0x20,0x00,0x00,0x00,0xFF,0xFF,
0xE0,0x00,0x00,0x07,0xFF,0x81,0xE0,0x00,
0x00,0x07,0xE0,0x00,0xE0,0x00,0x00,0x03,
0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
char zuo16H[]={
0x18,0xC0,0x18,0xC0,0x19,0x80,0x31,0xFE,
0x33,0xFE,0x76,0xC0,0xF0,0xFC,0xB0,0xFC,
0x30,0xC0,0x30,0xC0,0x30,0xFE,0x30,0xFE,
0x30,0xC0,0x30,0xC0,0x30,0xC0,0x00,0x00,
};
char zhe16H[]={
0x03,0x00,0x03,0x0C,0x1F,0xCC,0x1F,0xD8,
0x03,0x30,0xFF,0xFE,0xFF,0xFE,0x03,0x00,
0x0F,0xF8,0x3F,0xF8,0xEC,0x18,0xCF,0xF8,
0x0C,0x18,0x0F,0xF8,0x0F,0xF8,0x00,0x00,
};
char tian16H[]={
0x00,0x00,0x3F,0xFC,0x3F,0xFC,0x31,0x8C,
0x31,0x8C,0x31,0x8C,0x3F,0xFC,0x3F,0xFC,
0x31,0x8C,0x31,0x8C,0x31,0x8C,0x3F,0xFC,
0x3F,0xFC,0x30,0x0C,0x00,0x00,0x00,0x00,
};
char xue16H[]={
0x33,0x18,0x19,0x98,0x08,0xB0,0x7F,0xFC,
0x7F,0xFC,0x60,0x0C,0x1F,0xF0,0x1F,0xF0,
0x00,0xC0,0x7F,0xFC,0x7F,0xFC,0x01,0x80,
0x01,0x80,0x07,0x80,0x03,0x00,0x00,0x00,
};
char ke16H[]={
0x00,0x00,0x0C,0x18,0xFD,0x98,0xF8,0xD8,
0x18,0x58,0xFE,0x18,0xFE,0x98,0x18,0xD8,
0x3C,0x58,0x7E,0x1E,0xDB,0xFE,0x9B,0xF8,
0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,
};
struct Food/定义结构体存储食物的属性/
{
int x; / 食物的坐标 /
int y;
int yes; / 值为0表示屏幕上没有食物,值为1表示屏幕上有食物 /
int color; / 食物颜色 /
}food;
struct Snake/定义结构体存储蛇的属性/
{
int x[N]; / 每一节蛇的坐标 /
int y[N];
int color[N];/存储每一节蛇的颜色/
int node; / 蛇的节数 /
int direction; / 蛇移动的方向 /
int life; / 蛇的生命,如果为1,蛇死,游戏结束 /
}snake;
void init(void)/图形驱动/
{
int driver=DETECT,mode=0;
registerbgidriver(EGAVGA_driver);
initgraph(&driver,&mode,"");
}
void drawmat(char mat,int matsize,int x,int y,int color)/汉字点阵/
{
int i,j,k,m;
m=(matsize-1)/8+1;
for(j=0;j<matsize;j++)
for(i=0;i<m;i++)
for(k=0;k<8;k++)
if(mat[jm+i]&(0x80>>k))
putpixel(x+i8+k,y+j,color);
}
void showword(void)
{/ 调用汉字点阵输出程序,显示标题和作者信息 /
drawmat(cai48H,48,249,-4,7);
drawmat(she48H,48,329,-4,7);
drawmat(tun48H,48,409,-4,7);
drawmat(dan48H,48,489,-4,7);
drawmat(cai48H,48,250,-5,4);
drawmat(she48H,48,330,-5,4);
drawmat(tun48H,48,410,-5,4);
drawmat(dan48H,48,490,-5,4);
/作者 田学科/
drawmat(zuo16H,16,515,465,7);
drawmat(zhe16H,16,530,465,7);
drawmat(tian16H,16,550,465,7);
drawmat(xue16H,16,565,465,7);
drawmat(ke16H,16,580,465,7);
}
void draw(void)/画出四周的墙/
{
if(color==15)
color=0;
setcolor(++color);
setlinestyle(SOLID_LINE,0,1);
for(i=30;i<=600;i+=10)
{
rectangle(i,40,i+10,49);
rectangle(i,451,i+10,460);
}
for(i=40;i<450;i+=10)
{
rectangle(30,i,39,i+10);
rectangle(601,i,610,i+10);
}
}
void prscore(void)
{/ 打印游戏分数 /
char str[10];
setfillstyle(SOLID_FILL,YELLOW);
bar(50,10,200,30);
setcolor(6);
settextstyle(0,0,2);
sprintf(str,"score:%d",score);
outtextxy(55,15,str);
}
void gameover(void)
{
cleardevice(); / 清屏函数 /
for(i=0;i<snakenode;i++)/ 画出蛇死时的位置 /
{
setcolor(snakecolor[i]);
rectangle(snakex[i],snakey[i],snakex[i]+10,snakey[i]+10);
}
prscore(); / 显示分数 /
draw();
showword();
settextstyle(0,0,6);
setcolor(7);
outtextxy(103,203,"GAME OVER");
setcolor(RED);
outtextxy(100,200,"GAME OVER");
}
void gameplay(void)/ 玩游戏的具体过程 /
{
int flag,flag1;
randomize();
prscore();
gamespeed=50000;
foodyes=0;/ foodyes=0表示屏幕上没有食物 /
snakelife=1;/ snakelife=1表示蛇是活着的 /
snakedirection=4;/ 表示蛇的初始方向为向右 /
snakenode=2; / 蛇的初始化为两节 /
snakecolor[0]=2; /两节蛇头初始化为绿色/
snakecolor[1]=2;
snakex[0]=100;snakey[0]=100;
snakex[1]=110;snakey[1]=100;
foodcolor=random(15)+1;
while(1)
{
while(1)
{
if(foodyes==0) / 如果蛇活着 /
{
while(1)
{
flag=1;
foodyes=1;
foodx=random(56)10+40;
foody=random(40)10+50;
for(i=0;i<snakenode;i++)
{
if(foodx==snakex[i]&&foody==snakey[i])
flag=0;
}
if(flag) break;
}
}
if(foodyes)
{
setcolor(foodcolor);
rectangle(foodx,foody,foodx+10,foody+10);
}
for(i=snakenode-1;i>0;i--)
{
snakex[i]=snakex[i-1];
snakey[i]=snakey[i-1];
}
switch(snakedirection)
{
case 1: snakey[0]-=10;break;
case 2: snakey[0]+=10;break;
case 3: snakex[0]-=10;break;
case 4: snakex[0]+=10;break;
}
for(i=3;i<snakenode;i++)
{
if(snakex[i]==snakex[0]&&snakey[i]==snakey[0])
{
gameover();
snakelife=0;
break;
}
}
if(snakex[0]<40||snakex[0]>590||snakey[0]<50||snakey[0]>440)
{
gameover();
snakelife=0;
}
if(snakelife==0)
break;
if(snakex[0]==foodx&&snakey[0]==foody)/蛇吃掉食物/
{
setcolor(0);
rectangle(foodx,foody,foodx+10,foody+10);
snakex[snakenode]=-20;
snakey[snakenode]=-20;
snakecolor[snakenode]=foodcolor;
snakenode++;
foodyes=0;
foodcolor=random(15)+1;
score+=10;
prscore();
if(score%100==0&&score!=0)
{
for(i=0;i<snakenode;i++)/ 画出蛇 /
{
setcolor(snakecolor[i]);
rectangle(snakex[i],snakey[i],snakex[i]+10,snakey[i]+10);
}
sound(200);
delay(50000);delay(50000);delay(50000);
delay(50000);delay(50000);delay(50000);
nosound();
gamespeed-=5000;
draw();
}
else
{
sound(500);
delay(500);
nosound();
}
}
for(i=0;i<snakenode;i++)/ 画出蛇 /
{
setcolor(snakecolor[i]);
rectangle(snakex[i],snakey[i],snakex[i]+10,snakey[i]+10);
}
delay(gamespeed);
delay(gamespeed);
flag1=1;
setcolor(0);
rectangle(snakex[snakenode-1],snakey[snakenode-1],
snakex[snakenode-1]+10,snakey[snakenode-1]+10);
if(kbhit()&&flag1==1)/如果没按有效键就重新开始循环/
{
flag1=0;
key=bioskey(0);
if(key==esc)
exit(0);
else if(key==up&&snakedirection!=2)
snakedirection=1;
else if(key==down&&snakedirection!=1)
snakedirection=2;
else if(key==left&&snakedirection!=4)
snakedirection=3;
else if(key==right&&snakedirection!=3)
snakedirection=4;
}
}
if(snakelife==0)/如果蛇死了就退出循环/
break;
}
}
void main(void)
{
while(1)
{
color=0;
init();
cleardevice();
showword();
draw();
gameplay();
setcolor(15);
settextstyle(0,0,2);
outtextxy(200,400,"CONTINUE(Y/N)");
while(1)
{
key=bioskey(0);
if(key==Y||key==n||key==esc)
break;
}
if(key==n||key==esc)
break;
}
closegraph();
}
21程序功能介绍
贪吃蛇游戏是一个经典小游戏,一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。
22程序整体设计说明
一个游戏要有开始部分,运行部分,结束部分(实际上开始部分与运行部分是一体的)。
221设计思路
这个程序的关键是表示蛇的图形以及蛇的移动。用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用两节表示。移动时必须从蛇头开始,所以蛇不能向相反方向移动,也就是蛇尾不能改作蛇头。如果不按任何键,蛇自行在当前方向上前移,当游戏者按了有效的方向键后,蛇头朝着指定的方向移动,一步移动一节身体,所以当按了有效的方向键后,先确定蛇头的位置,然后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇,这时由于没有庆平的原因,原来蛇的位置和新蛇的位置差一个单位,所以看起来社会多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现和消失也是画矩形块和覆盖矩形块
222数据结构设计及用法说明
开始部分:
游戏是运行在图形模式下的,所以第一步一定是初始化图形模式,接着要有开始的界面,就像书有封面一样,我设置了一个游戏的标题画面,除了游戏标题画面我还设置了一个欢迎画面。标题画面以后,还要为游戏的运行部分作初始化,包括绘制游戏运行时的背景,对游戏某些重 要变量的初始化。
运行部分:
作为游戏的核心部分,这里包括的函数比较多,也就是模块比较多,首先让我模拟一下贪吃蛇的游戏模式:某个世界上突然出现一条蛇,它很短,它的运动神经异常,它没法停止自己的多动症在它的世界里就只有食物,它很饿,也很贪吃;同样在不明原因的情况下,食物从天而降,可惜的是没有落到嘴边;饥饿的主人公,不管它有没有毒,也不问食物的来历,径直向食物爬去;它吃到食物啦,它超出想象的同化能力让食物很快的成为自己身体的一部分,它的身子变长啦。当它吃到第一颗食物时,上帝有给它第二颗,于是它吃了第二颗,于是又变长了,于是又有第三颗……它的身子是一直的加长,它不管自己过长身体的麻烦——转身不便,继续吃下去,现在它是直接把巴张大,好让食物有个绿色通道。但是在某天的下午,它咬到了自己,它才想起自己是一条毒蛇,于是晕死过去(不是毒死);又或者它往食物冲锋的时候,它失去控制,撞到了墙上。
第一轮循环:第一步,出现食物;第二步,蛇不停运动;第三步,检查蛇是撞到自己或墙壁;由第四步起游戏有两条支线(A、B):
A :第四步,蛇没有碰到自己或墙壁,蛇继续前进,绘制蛇的动作;第五步,判断蛇是否吃到食物,如果蛇吃到食物,身子变长,原来的食物消失;第六步,让玩家输入控制指令,让蛇在下一轮循环的第二步改变运动方向;第七步,第二轮循环的第一步,重复第一轮的步骤;
B:第四步,蛇碰到自己或墙壁,终止游戏。
结束部分:
游戏结束时,显示“GAME OVER”,已经是约定俗成的规律了,我的游戏也不例外。除了游戏结束画面外,我还设置了一个游戏退出画面,“善始善终”嘛。
有了上述的大致划分,我把整个程序划分成(13+2)个模块(其实就是函数)
223程序结构(流程图)
图21流程图
依据所需要处理的任务要求,规划输入数据和输出结果,决定存放数据的数据结构。
C语言中数据结构集中体现在数据类型上,因此在进行C语言程序设计时,应统筹规划程序中所使用的变量,数组,指针等,以及它们的类型等。这点是很重要的,如果在此期间选择不合适的变量或者数组,将来修改就十分困难。
现在分析一下贪吃蛇游戏中的元素,继而得出与它们对应的在程序中的描述:
蛇:
基本描述:长度,颜色,位置。
对应数据与数据类型:长度—虽然可以用坐标表示,但是这样的话,运算量将很大,所以换算成较大的单位—节数,以固定长度的每节描述;坐标--整型;颜色--整型; 位置--X,Y坐标。
增加的描述:蛇运动的方向,蛇的生命。
对应数据与数据类型:这些描述是为了与程序的按键的输入部分与判断游戏结束部分相联系而设的。方向只有四个方向:上下左右。可以设置与之对应的四个整型数:3、4、2、1。生命就只有两种情况:死或生,对应0或1。
食物:
基本描述:颜色,位置。
对应数据与数据类型:由于颜色设成固定的,所以不再讨论。位置—X、Y坐标。
增加的描述:食物的存在。
对应数据与数据类型:这是为了避免重复出现食物而设置的,与绘制食物的函数有联系。只有两个值:0或1(没有食物或有食物)
其他的元素:墙,由于它在显示上是作为背景而存在的,所以并没有什么说明实际的墙壁就是四条直线组成的边框,由坐标描述。
还需要的变量:键盘键入的键值(作为全局变量,整型);经常要使用的循环变量;自定义的填充图案;说明文字的字符数组;游戏的记分;游戏的速度(蛇的速度)。
图22蛇的不停运动的关键算法的流程图
224各模块的功能及程序说明
主要模块的实现思路和算法的流程图说明:
关键所在——蛇不停移动的Snakemove():
蛇的不停移动,就是蛇的下一节取代前一节的位置,在计算机中就是蛇下一节的位置坐标变成前一节的位置坐标。在上文中,已定义蛇的位置坐标为数组类型,一组坐标对应一节的位置,假设有i+1节,由0到i节,第i节的坐标取第i-1节的坐标,第i-1节的坐标取第i-2节的坐标……直到第1节取第0节的坐标。而第0节的坐标,即蛇头的坐标要往某个方向变化,变化量为蛇每节的长度。蛇的这种坐标轮换需要循环语句使其继续下去。
225程序结果
运行程序得到如下初始界面图:
图23程序结果图
用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用两节表示:
图24程序结果图
蛇没有碰到自己或墙壁,蛇继续前进:
图25程序结果图
游戏结束时,显示“GAME OVER”
图26程序结果图
23程序源代码及注释
#define N 200
#include <graphicsh>
#include <stdlibh>
#include <dosh>
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
int i,key;
int score=0;/得分/
int gamespeed=50000;/游戏速度自己调整/
struct Food{
int x;/食物的横坐标/
int y;/食物的纵坐标/
int yes;/判断是否要出现食物的变量/
}food;/食物的结构体/
struct Snake{
int x[N];
int y[N];
int node;/蛇的节数/
int direction;/蛇移动方向/
int life;/ 蛇的生命,0活着,1死亡/
}snake;
void Init(void);/图形驱动/
void Close(void);/图形结束/
void DrawK(void);/开始画面/
void GameOver(void);/结束游戏/
void GamePlay(void);/玩游戏具体过程/
void PrScore(void);/输出成绩/
/主函数/
void main(void){
Init();/图形驱动/
DrawK();/开始画面/
GamePlay();/玩游戏具体过程/
Close();/图形结束/}
/图形驱动/
void Init(void){
int gd=DETECT,gm;
registerbgidriver(EGAVGA_driver);
initgraph(&gd,&gm,"c:\\program files\\winyes\\tc20h\\bgi");
cleardevice();}
/开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙/
void DrawK(void){
/setbkcolor(LIGHTGREEN);/
setcolor(11);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/设置线型/
for(i=50;i<=600;i+=10)/画围墙/ {
rectangle(i,40,i+10,49); /上边/
rectangle(i,451,i+10,460);/下边/ }
for(i=40;i<=450;i+=10) {
rectangle(50,i,59,i+10); /左边/
rectangle(601,i,610,i+10);/右边/ }}
/玩游戏具体过程/
void GamePlay(void){
randomize();/随机数发生器/
foodyes=1;/1表示需要出现新食物,0表示已经存在食物/
snakelife=0;/活着/
snakedirection=1;/方向往右/
snakex[0]=100;snakey[0]=100;/蛇头/
snakex[1]=110;snakey[1]=100;
snakenode=2;/节数/
PrScore();/输出得分/
while(1)/可以重复玩游戏,压ESC键结束/ {
while(!kbhit())/在没有按键的情况下,蛇自己移动身体/ {
if(foodyes==1)/需要出现新食物/ {
foodx=rand()%400+60;
foody=rand()%350+60;
while(foodx%10!=0)/食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到/
foodx++;
while(foody%10!=0)
foody++;
foodyes=0;/画面上有食物了/ }
if(foodyes==0)/画面上有食物了就要显示/ {
setcolor(GREEN);
rectangle(foodx,foody,foodx+10,foody-10); }
for(i=snakenode-1;i>0;i--)/蛇的每个环节往前移动,也就是贪吃蛇的关键算法/ {
snakex[i]=snakex[i-1];
snakey[i]=snakey[i-1]; }
/1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头/
switch(snakedirection) {
case 1:snakex[0]+=10;break;
case 2: snakex[0]-=10;break;
case 3: snakey[0]-=10;break;
case 4: snakey[0]+=10;break; }
for(i=3;i<snakenode;i++)/从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来/ {
if(snakex[i]==snakex[0]&&snakey[i]==snakey[0]) {
GameOver();/显示失败/
snakelife=1;
break; } }
if(snakex[0]<55||snakex[0]>595||snakey[0]<55||
snakey[0]>455)/蛇是否撞到墙壁/ {
GameOver();/本次游戏结束/
snakelife=1; /蛇死/ }
if(snakelife==1)/以上两种判断以后,如果蛇死就跳出内循环,重新开始/
break;
if(snakex[0]==foodx&&snakey[0]==foody)/吃到食物以后/ {
setcolor(0);/把画面上的食物东西去掉/
rectangle(foodx,foody,foodx+10,foody-10);
snakex[snakenode]=-20;snakey[snakenode]=-20;
/新的一节先放在看不见的位置,下次循环就取前一节的位置/
snakenode++;/蛇的身体长一节/
foodyes=1;/画面上需要出现新的食物/
score+=10;
PrScore();/输出新得分/ }
setcolor(4);/画出蛇/
for(i=0;i<snakenode;i++)
rectangle(snakex[i],snakey[i],snakex[i]+10,
snakey[i]-10);
delay(gamespeed);
setcolor(0);/用黑色去除蛇的的最后一节/
rectangle(snakex[snakenode-1],snakey[snakenode-1],
snakex[snakenode-1]+10,snakey[snakenode-1]-10); } /endwhile(!kbhit)/
if(snakelife==1)/如果蛇死就跳出循环/
break;
key=bioskey(0);/接收按键/
if(key==ESC)/按ESC键退出/
break;
else
if(key==UP&&snakedirection!=4)
/判断是否往相反的方向移动/
snakedirection=3;
else
if(key==RIGHT&&snakedirection!=2)
snakedirection=1;
else
if(key==LEFT&&snakedirection!=1)
snakedirection=2;
else
if(key==DOWN&&snakedirection!=3)
snakedirection=4;
}/endwhile(1)/}
/游戏结束/
void GameOver(void){
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0,0,4);
outtextxy(200,200,"GAME OVER");
getch();}
/输出成绩/
void PrScore(void){
char str[10];
setfillstyle(SOLID_FILL,YELLOW);
bar(50,15,220,35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str,"score:%d",score);
outtextxy(55,20,str);}
/图形结束/
void Close(void){
getch();
closegraph();
}
/ C语言
program by wlfryq 71693456@qqcom
/
#include <stdioh>
#include <stdlibh>
#include <conioh>
#include <windowsh>
#include <timeh>
#include <directh>
#include <stdboolh>
#define W 80 //屏幕宽度
#define H 37 //屏幕高度
#define SNAKE_ALL_LENGTH 200 //蛇身最长为
void CALLBACK TimerProc(
HWND hwnd,
UINT message,
UINT idTimer,
DWORD dwTime);
void start();
struct MYPOINT
{
int x;
int y;
} s[SNAKE_ALL_LENGTH] , head, end, food;
int max_count=0; //历史最高分,如果count>max_count, 则max_count=count
int old_max_count=0; //历史最高分,不会变动, 用于死亡时判断max_count是否大于old_max_count,如果大于,则写入文件
int count=0; //得分
int len=20; //当前蛇身长度
int direct=0; //方向: 0-向右, 1-向下, 2-向左, 3-向上
int speed=200; //速度:毫秒
bool isfood=false; //食物是否存在
int timerID;
bool stop=false; //暂停
char ini_path; //数据文件绝对路径
void setxy(int x, int y) //设置CMD窗口光标位置
{
COORD coord = {x, y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void hide_cursor() //隐藏CMD窗口光标
{
CONSOLE_CURSOR_INFO cci;
ccibVisible = FALSE;
ccidwSize = sizeof(cci);
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorInfo(handle, &cci);
}
void set_food() //设置食物坐标
{
if(isfood==true)
{
return;
}
int x,y,i;
bool flag=false;
while(1)
{
flag=false;
x=rand()%(W-14)+6;
y=rand()%(H-12)+6;
for(i=0;i<len;i++) //判断食物是否落在蛇身上
{
if(s[i]x==x && s[i]y==y)
{
flag=true;
break;
}
}
if(flag==true)
{
continue;
}
else
{
foodx=x;
foody=y;
break;
}
}
setxy(foodx,foody);
printf("");
isfood=true;
}
void check_board() //检测蛇身是否越界和相交
{
int i;
if(s[0]x>=W-3 || s[0]x<=2 || s[0]y>=H-1 || s[0]y<=2)
{
setxy(W/2-5,0);
printf("game over\n");
stop=true;
if(old_max_count<max_count)
{
char t[5]={'\0'};
sprintf(t,"%d",max_count);
WritePrivateProfileString("MAX_COUNT","max_count",t,ini_path);
}
}
for(i=1;i<len;i++)
{
if(s[i]x==s[0]x && s[i]y==s[0]y)
{
setxy(W/2-5,0);
printf("game over\n");
stop=true;
if(old_max_count<max_count)
{
char t[5]={'\0'};
sprintf(t,"%d",max_count);
WritePrivateProfileString("MAX_COUNT","max_count",t,ini_path);
}
break;
}
}
if(stop==true)
{
KillTimer(NULL,timerID);
int c;
while(1)
{
fflush(stdin);
c=_getch();
if(c=='n' || c=='N')
{
start();
}
else if(c=='q' || c=='Q')
{
exit(0);
}
else continue;
}
}
}
void printf_body(bool is_first) //打印蛇身
{
if(is_first==true) //如果是第一次打印蛇身
{
int i;
for(i=0;i<len;i++)
{
setxy(s[i]x,s[i]y);
printf("O");
}
}
else //如果不是第一次打印蛇身
{
setxy(endx,endy);
printf(" ");
setxy(s[0]x,s[0]y);
printf("O");
}
if(foodx==s[0]x && foody==s[0]y) //如果吃到食物
{
count++;
isfood=false; //重置食物
set_food();
len++;
KillTimer(NULL,timerID);
if(speed>100) speed-=10;
else if(speed>50) speed-=5;
else if(speed>30) speed-=2;
else if(speed>16) speed-=1;
else ;
setxy(0,0);
if(max_count<count) max_count=count;
printf(" speed : %d ms score : %d best score:%d ",speed,count,max_count);
timerID=SetTimer(NULL,001,speed,TimerProc);
}
}
void change_body_pos(int x, int y) //改变蛇身的坐标数据
{
endx=s[len-1]x;
endy=s[len-1]y;
int i;
for(i=len-1;i>0;i--)
{
s[i]x=s[i-1]x;
s[i]y=s[i-1]y;
}
s[0]x=x;
s[0]y=y;
}
void CALLBACK TimerProc(
HWND hwnd,
UINT message,
UINT idTimer,
DWORD dwTime)
{
switch(direct)
{
case 0:
headx++;
change_body_pos(headx,heady);
printf_body(false);
check_board();
break;
case 1:
heady++;
change_body_pos(headx,heady);
printf_body(false);
check_board();
break;
case 2:
headx--;
change_body_pos(headx,heady);
printf_body(false);
check_board();
break;
case 3:
heady--;
change_body_pos(headx,heady);
printf_body(false);
check_board();
break;
}
}
void start()
{
int i;
KillTimer(NULL,timerID);
count=0; //得分
len=20; //当前蛇身长度
direct=0; //方向: 0-向右, 1-向下, 2-向左, 3-向上
speed=200; //速度:毫秒
isfood=false; //食物是否存在
stop=false; //停止
system("cls");
setxy(1,4);
printf("┌─────────────────────────────────────┐\n");
for(i=0;i<33;i++)
{
printf(" │ │\n");
}
printf(" └─────────────────────────────────────┘");
headx=len-1+5;
heady=H/2;
for(i=0;i<len;i++)
{
s[i]x=headx-i;
s[i]y=heady;
}
setxy(0,0);
printf(" speed : %d:ms score : %d best score:%d ",speed,count,max_count);
printf_body(true);
set_food();
timerID=SetTimer(NULL,001,speed,TimerProc);
int c;
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
if(stop==true) break;
if(_kbhit()) //如果按下的是方向键或功能键, _getch()要调用两次,第一次返回0XE0或0
{
fflush(stdin);
c=_getch(); //上: 72 下:80 左:75 右:77
if(c==0XE0 || c==0)
{
c=_getch();
if(c==72 && direct!=1 && direct!=3)
{
direct=3;
}
else if(c==80 && direct!=1 && direct!=3)
{
direct=1;
}
else if(c==75 && direct!=0 && direct!=2)
{
direct=2;
}
else if(c==77 && direct!=0 && direct!=2)
{
direct=0;
}
}
else if(c==' ')
{
setxy(W/2-10,0);
system("pause");
setxy(W/2-10,0);
printf(" ");
}
}
if(msgmessage==WM_TIMER)
{
DispatchMessage(&msg);
}
}
}
int main()
{
ini_path=(char)malloc(sizeof(char)50);
srand((unsigned)time(0));
getcwd(ini_path,50);//取得当前程序绝对路径
ini_path=strcat(ini_path,"snakedat");
max_count=GetPrivateProfileInt("MAX_COUNT","max_count",0,ini_path);
old_max_count=max_count;
char cmd[50];
sprintf(cmd,"mode con cols=%d lines=%d\0",W,H);
system(cmd);//改变CMD窗口大小
hide_cursor();
start();
return 0;
}
以下是代码
/ 贪吃蛇程序 by champking /
#define N 200
#include <graphicsh>
#include <stdlibh>
#include <dosh>
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
int i,key;
int score = 0;/得分/
int gamespeed = 100000;/游戏速度自己调整/
struct Food
{
int x;/食物的横坐标/
int y;/食物的纵坐标/
int yes;/判断是否要出现食物的变量/
}food;/食物的结构体/
struct Snake
{
int x[N];
int y[N];
int node;/蛇的节数/
int direction;/蛇移动方向/
int life;/ 蛇的生命,0活着,1死亡/
}snake;
void Init(void);/图形驱动/
void Close(void);/图形结束/
void DrawK(void);/开始画面/
void GameOver(void);/结束游戏/
void GamePlay(void);/玩游戏具体过程/
void PrScore(void);/输出成绩/
/主函数/
void main(void)
{
Init();/图形驱动/
DrawK();/开始画面/
GamePlay();/玩游戏具体过程/
Close();/图形结束/
}
/图形驱动/
void Init(void)
{
int gd = DETECT, gm;
initgraph(&gd, &gm, "c:\\tc");
cleardevice();
}
/开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙/
void DrawK(void)
{
/setbkcolor(LIGHTGREEN);/
setcolor(11);
setlinestyle(SOLID_LINE, 0, THICK_WIDTH);/设置线型/
for(i = 50; i <= 600; i += 10)/画围墙/
{
rectangle(i, 40, i + 10, 49); /上边/
rectangle(i, 451, i + 10, 460);/下边/
}
for(i = 40; i <= 450; i += 10)
{
rectangle(50, i, 59, i + 10); /左边/
rectangle(601, i, 610, i + 10);/右边/
}
}
/玩游戏具体过程/
void GamePlay(void)
{
randomize();/随机数发生器/
foodyes = 1;/1表示需要出现新食物,0表示已经存在食物/
snakelife = 0;/活着/
snakedirection = 1;/方向往右/
snakex[0] = 100; snakey[0] = 100;/蛇头/
snakex[1] = 110; snakey[1] = 100;
snakenode = 2;/节数/
PrScore();/输出得分/
while(1)/可以重复玩游戏,压ESC键结束/
{
while(!kbhit())/在没有按键的情况下,蛇自己移动身体/
{
if(foodyes == 1)/需要出现新食物/
{
foodx = rand() % 400 + 60;
foody = rand() % 350 + 60;
while(foodx % 10 != 0)/食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到/
foodx++;
while(foody % 10 != 0)
foody++;
foodyes = 0;/画面上有食物了/
}
if(foodyes == 0)/画面上有食物了就要显示/
{
setcolor(GREEN);
rectangle(foodx, foody, foodx + 10, foody - 10);
}
for(i = snakenode - 1; i > 0; i--)/蛇的每个环节往前移动,也就是贪吃蛇的关键算法/
{
snakex[i] = snakex[i-1];
snakey[i] = snakey[i-1];
}
/1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头/
switch(snakedirection)
{
case 1: snakex[0] += 10; break;
case 2: snakex[0] -= 10; break;
case 3: snakey[0] -= 10; break;
case 4: snakey[0] += 10; break;
}
for(i = 3; i < snakenode; i++)/从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来/
{
if(snakex[i] == snakex[0] && snakey[i] == snakey[0])
{
GameOver();/显示失败/
snakelife = 1;
break;
}
}
if(snakex[0]<55||snakex[0]>595||snakey[0]<55||
snakey[0]>455)/蛇是否撞到墙壁/
{
GameOver();/本次游戏结束/
snakelife=1; /蛇死/
}
if(snakelife == 1)/以上两种判断以后,如果蛇死就跳出内循环,重新开始/
break;
if(snakex[0] == foodx && snakey[0] == foody)/吃到食物以后/
{
setcolor(0);/把画面上的食物东西去掉/
rectangle(foodx, foody, foodx + 10, foody - 10);
snakex[snakenode] =- 20; snakey[snakenode] =- 20;
/新的一节先放在看不见的位置,下次循环就取前一节的位置/
snakenode++;/蛇的身体长一节/
foodyes = 1;/画面上需要出现新的食物/
score += 10;
PrScore();/输出新得分/
}
setcolor(4);/画出蛇/
for(i = 0; i < snakenode; i++)
rectangle(snakex[i], snakey[i], snakex[i] + 10,
snakey[i] - 10);
delay(gamespeed);
setcolor(0);/用黑色去除蛇的的最后一节/
rectangle(snakex[snakenode-1], snakey[snakenode-1],
snakex[snakenode-1] + 10, snakey[snakenode - 1] - 10);
} /endwhile(!kbhit)/
if(snakelife == 1)/如果蛇死就跳出循环/
break;
key = bioskey(0);/接收按键/
if(key == ESC)/按ESC键退出/
break;
else
if(key == UP&&snakedirection!=4)
/判断是否往相反的方向移动/
snakedirection=3;
else
if(key == RIGHT &&snakedirection != 2)
snakedirection=1;
else
if(key == LEFT && snakedirection != 1)
snakedirection = 2;
else
if(key == DOWN && snakedirection != 3)
snakedirection = 4;
}/endwhile(1)/
}
/游戏结束/
void GameOver(void)
{
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0, 0, 4);
outtextxy(200, 200, "GAME OVER");
getch();
}
/输出成绩/
void PrScore(void)
{
char str[10];
setfillstyle(SOLID_FILL, YELLOW);
bar(50, 15, 220, 35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str, "score:%d", score);
outtextxy(55, 20, str);
}
/图形结束/
void Close(void)
{
getch();
closegraph();
}
#include <windowsh>
#include <ctime>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#ifndef SNAKE_H
#define SNAKE_H
class Cmp
{
friend class Csnake;
int rSign; //横坐标
int lSign; //竖坐标
public:
// friend bool isDead(const Cmp& cmp);
Cmp(int r,int l){setPoint(r,l);}
Cmp(){}
void setPoint(int r,int l){rSign=r;lSign=l;}
Cmp operator-(const Cmp &m)const
{
return Cmp(rSign-mrSign,lSign-mlSign);
}
Cmp operator+(const Cmp &m)const
{
return Cmp(rSign+mrSign,lSign+mlSign);
}
};
const int maxSize = 5; //初始蛇身长度
class Csnake
{
Cmp firstSign; //蛇头坐标
Cmp secondSign;//蛇颈坐标
Cmp lastSign; //蛇尾坐标
Cmp nextSign; //预备蛇头
int row; //列数
int line; //行数
int count; //蛇身长度
vector<vector<char> > snakeMap;//整个游戏界面
queue<Cmp> snakeBody; //蛇身
public:
int GetDirections()const;
char getSymbol(const Cmp& c)const
//获取指定坐标点上的字符
{
return snakeMap[clSign][crSign];
}
Csnake(int n)
//初始化游戏界面大小
{
if(n<20)line=20+2;
else if(n>30)line=30+2;
else line=n+2;
row=line3+2;
}
bool isDead(const Cmp& cmp)
{
return ( getSymbol(cmp)=='@' || cmprSign == row-1
|| cmprSign== 0 || cmplSign == line-1 ||
cmplSign == 0 );
}
void InitInstance(); //初始化游戏界面
bool UpdataGame(); //更新游戏界面
void ShowGame(); //显示游戏界面
};
#endif // SNAKE_H
using namespace std;
//测试成功
void Csnake::InitInstance()
{
snakeMapresize(line); // snakeMap[竖坐标][横坐标]
for(int i=0;i<line;i++)
{
snakeMap[i]resize(row);
for(int j=0;j<row;j++)
{
snakeMap[i][j]=' ';
}
}
for(int m=1;m<maxSize+1;m++)
{
//初始蛇身
snakeMap[line/2][m]='@';
//将蛇身坐标压入队列
snakeBodypush(Cmp(m,(line/2)));
//snakeBody[横坐标][竖坐标]
}
//链表头尾
firstSign=snakeBodyback();
secondSignsetPoint(maxSize-1,line/2);
}
//测试成功
int Csnake::GetDirections()const
{
if(GetKeyState(VK_UP)<0) return 1; //1表示按下上键
if(GetKeyState(VK_DOWN)<0) return 2; //2表示按下下键
if(GetKeyState(VK_LEFT)<0) return 3; //3表示按下左键
if(GetKeyState(VK_RIGHT)<0)return 4; //4表示按下右键
return 0;
}
bool Csnake::UpdataGame()
{
//-----------------------------------------------
//初始化得分0
static int score=0;
//获取用户按键信息
int choice;
choice=GetDirections();
cout<<"Total score: "<<score<<endl;
//随机产生食物所在坐标
int r,l;
//开始初始已经吃食,产生一个食物
static bool eatFood=true;
//如果吃了一个,才再出现第2个食物
if(eatFood)
{
do
{
//坐标范围限制在(1,1)到(line-2,row-2)对点矩型之间
srand(time(0));
r=(rand()%(row-2))+1; //横坐标
l=(rand()%(line-2))+1;//竖坐标
//如果随机产生的坐标不是蛇身,则可行
//否则重新产生坐标
if(snakeMap[l][r]!='@')
{snakeMap[l][r]='';}
}while (snakeMap[l][r]=='@');
}
switch (choice)
{
case 1://向上
//如果蛇头和社颈的横坐标不相同,执行下面 *** 作
if(firstSignrSign!=secondSignrSign)nextSignsetPoint(firstSignrSign,firstSignlSign-1);
//否则,如下在原本方向上继续移动
else nextSign=firstSign+(firstSign-secondSign);
break;
case 2://向下
if(firstSignrSign!=secondSignrSign)nextSignsetPoint(firstSignrSign,firstSignlSign+1);
else nextSign=firstSign+(firstSign-secondSign);
break;
case 3://向左
if(firstSignlSign!=secondSignlSign)nextSignsetPoint(firstSignrSign-1,firstSignlSign);
else nextSign=firstSign+(firstSign-secondSign);
break;
case 4://向右
if(firstSignlSign!=secondSignlSign)nextSignsetPoint(firstSignrSign+1,firstSignlSign);
else nextSign=firstSign+(firstSign-secondSign);
break;
default:
nextSign=firstSign+(firstSign-secondSign);
}
//----------------------------------------------------------
if(getSymbol(nextSign)!='' && !isDead(nextSign))
//如果没有碰到食物(且没有死亡的情况下),删除蛇尾,压入新的蛇头
{
//删除蛇尾
lastSign=snakeBodyfront();
snakeMap[lastSignlSign][lastSignrSign]=' ';
snakeBodypop();
//更新蛇头
secondSign=firstSign;
//压入蛇头
snakeBodypush(nextSign);
firstSign=snakeBodyback();
snakeMap[firstSignlSign][firstSignrSign]='@';
//没有吃食
eatFood=false;
return true;
}
//-----吃食-----
else if(getSymbol(nextSign)=='' && !isDead(nextSign))
{
secondSign=firstSign;
snakeMap[nextSignlSign][nextSignrSign]='@';
//只压入蛇头
snakeBodypush(nextSign);
firstSign=snakeBodyback();
eatFood=true;
//加分
score+=20;
return true;
}
//-----死亡-----
else {cout<<"Dead"<<endl;cout<<"Your last total score is "<<score<<endl; return false;}
}
void Csnake::ShowGame()
{
for(int i=0;i<line;i++)
{
for(int j=0;j<row;j++)
cout<<snakeMap[i][j];
cout<<endl;
}
Sleep(1);
system("cls");
}
int main()
{
Csnake s(20);
sInitInstance();
//sShowGame();
int noDead;
do
{
sShowGame();
noDead=sUpdataGame();
}while (noDead);
system("pause");
return 0;
}
这个代码可以运行的,记得给分啦
以上就是关于贪吃蛇 C语言 简易程序设计全部的内容,包括:贪吃蛇 C语言 简易程序设计、C语言课程设计,贪吃蛇应该怎么做、codeblocks 贪吃蛇c语言程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)