#定義N 200
# include & ltgraphics.h & gt
# include & ltstdlib.h & gt
# include & ltdos.h & gt
#定義左0x4b00
#定義右0x4d00
#向下定義0x5000
#定義高達0x4800
#定義ESC 0x011b
int i,key
int得分= 0;/*分數*/
int gamespeed = 50000/*自己調整遊戲速度*/
結構食品
{
int x;/*食物橫坐標*/
int y;/*食物的縱坐標*/
int yes/*判斷食物的變量是否會出現*/
}食物;/*食物的結構*/
結構蛇
{
int x[N];
int y[N];
int節點;/*蛇的結數*/
int方向;/*蛇的移動方向*/
int life/*蛇的命,0是活的,1是死的*/
}蛇;
void Init(void);/*圖形驅動程序*/
void Close(無效);/*圖表結束*/
void DrawK(無效);/*開始屏幕*/
void game over(void);/*結束遊戲*/
void玩法(void);/*玩遊戲的具體流程*/
void PrScore(void);/*輸出結果*/
/*主函數*/
無效總管(無效)
{
init();/*圖形驅動程序*/
DrawK();/*開始屏幕*/
遊戲性();/*玩遊戲的具體流程*/
close();/*圖表結束*/
}
/*圖形驅動程序*/
void初始化(void)
{
int gd=DETECT,GM;
init graph(& amp;gd,& ampgm," c:\ \ TC ");
clear device();
}
/*開始屏幕,左上角坐標為(50,40),右下角坐標為(610,460 */
void DrawK(無效)
{
/*setbkcolor(淺綠色);*/
set color(11);
setlinestyle(SOLID_LINE,0,THICK _ WIDTH);/*設置線型*/
for(I = 50;我& lt=600;I+=10)/*畫壹個柵欄*/
{
矩形(I,40,i+10,49);/*高於*/
矩形(I,451,i+10,460);/*低於*/
}
for(I = 40;我& lt=450;i+=10)
{
矩形(50,I,59,I+10);/*左*/
矩形(601,I,610,I+10);/*右*/
}
}
/*玩遊戲的具體流程*/
無效遊戲(void)
{
randomize();/*隨機數生成器*/
food . yes = 1;/*1表示新的食物需要出現,0表示食物已經存在*/
snake . life = 0;/*活著*/
snake . direction = 1;/*向右方向*/
snake . x[0]= 100;snake . y[0]= 100;/*蛇頭*/
snake . x[1]= 110;snake . y[1]= 100;
snake . node = 2;/*節數*/
PrScore();/*輸出分數*/
而(1)/*可以反復玩遊戲,按ESC結束*/
{
而(!Khit ())/*蛇在不按鍵的情況下自行移動*/
{
If(food.yes==1)/*需要新的食物*/
{
food . x = rand()% 400+60;
food . y = rand()% 350+60;
而(food.x%10!=0)/*食物隨機出現後,食物必須在整個格子裏,蛇才能吃*/
food . x++;
而(food.y%10!=0)
food . y++;
food . yes = 0;/*屏幕上有食物*/
}
If(food.yes==0)/*如果屏幕上有食物,就會顯示出來*/
{
setcolor(綠色);
矩形(food.x,food.y,food.x+10,food . y-10);
}
for(I = snake . node-1;我& gt0;I-)/*蛇的每壹個環節都向前移動,這是蛇的關鍵算法*/
{
snake . x[I]= snake . x[I-1];
snake . y[I]= snake . y[I-1];
}
/*1,2,3,4表示右,左,上,下,這個判斷可以移動蛇頭*/
開關(蛇形方向)
{
case 1:snake . x[0]+= 10;打破;
案例二:snake . x[0]-= 10;打破;
案例三:snake . y[0]-= 10;打破;
案例四:snake . y[0]+= 10;打破;
}
for(I = 3;我& ltsnake .節點;I++)/*從蛇的第四節判斷自己是不是打中了自己,因為蛇頭有兩節,第三節是不可能轉身的*/
{
if(snake . x[I]= = snake . x[0]& amp;& ampsnake.y[i]==snake.y[0])
{
game over();/*顯示失敗*/
snake . life = 1;
打破;
}
}
if(snake . x[0]& lt;55 | | snake . x[0]& gt;595 | | snake . y[0]& lt;55||
snake . y[0]& gt;455)/*蛇有沒有撞到墻上*/
{
game over();/*這個遊戲結束了*/
snake . life = 1;/*蛇死*/
}
If(snake.life==1)/*以上兩個判斷後,如果蛇死了,跳出內循環重新開始*/
打破;
if(snake . x[0]= = food . x & amp;& ampSnake.y[0]==food.y)/*吃完食物*/
{
set color(0);/*從圖片中移除食物*/
矩形(food.x,food.y,food.x+10,food . y-10);
snake . x[snake . node]=-20;snake . y[snake . node]=-20;
/*先把新段放到看不見的地方,在下壹個循環中取前壹段的位置*/
snake . node++;/*蛇的身體有很長的壹段*/
food . yes = 1;/*新食物需要出現在屏幕上*/
得分+= 10;
PrScore();/*輸出新分數*/
}
set color(4);/*畫壹條蛇*/
for(I = 0;我& ltsnake .節點;i++)
矩形(snake.x[i],snake.y[i],snake.x[i]+10,
snake . y[I]-10);
延遲(gamespeed);
set color(0);/*用黑色去掉蛇的最後壹段*/
矩形(snake.x[snake.node-1],snake.y[snake.node-1],
snake . x[snake . node-1]+10,snake . y[snake . node-1]-10);
} /*endwhile(!kbhit)*/
If(snake.life==1)/*如果蛇死了,跳出循環*/
打破;
key = BIOS key(0);/*接收按鈕*/
If(key==ESC)/*按ESC退出*/
打破;
其他
if(key = = UP & amp;& amp蛇,方向!=4)
/*判斷是否向相反方向移動*/
snake . direction = 3;
其他
if(key = = RIGHT & amp;& amp蛇,方向!=2)
snake . direction = 1;
其他
if(key = = LEFT & amp;& amp蛇,方向!=1)
snake . direction = 2;
其他
if(key = = DOWN & amp;& amp蛇,方向!=3)
snake . direction = 4;
}/*endwhile(1)*/
}
/*遊戲結束*/
無效遊戲結束(無效)
{
clear device();
PrScore();
setcolor(紅色);
settextstyle(0,0,4);
outtextxy(200,200,“遊戲結束”);
getch();
}
/*輸出結果*/
無效PrScore(無效)
{
char str[10];
setfillstyle(SOLID_FILL,黃色);
吧(50,15,220,35);
set color(6);
settextstyle(0,0,2);
sprintf(str," score:%d ",score);
outtextxy(55,20,str);
}
/*圖表結束*/
無效關閉(無效)
{
getch();
closegraph();
}