1. 程式人生 > >c++語言實現貪吃蛇

c++語言實現貪吃蛇

1.完美的貪吃蛇 
#include<windows.h>
#include<time.h>
#include<stdlib.h>
#include<conio.h>
#define N 21
#include<iostream>
using namespace std; 
void gotoxy(int x,int y)//位置函式
{
COORD pos;
pos.X=2*x;
pos.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void color(int a)//顏色函式
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
}
void init(int apple[2])//初始化函式(初始化圍牆、顯示資訊、蘋果)
{
int i,j;//初始化圍牆
int wall[N+2][N+2]={{0}};
for(i=1;i<=N;i++)
{
for(j=1;j<=N;j++)
wall[i][j]=1;
}
color(11);
for(i=0;i<N+2;i++)
{
for(j=0;j<N+2;j++)
{
if(wall[i][j])
cout<<"■";
else cout<<"□" ;
}
cout<<endl;
}
gotoxy(N+3,1);//顯示資訊
color(20);
cout<<"按 W S A D 移動方向"<<endl;
gotoxy(N+3,2);
color(20);
cout<<"按任意鍵暫停"<<endl;
gotoxy(N+3,3);
color(20);
cout<<"得分:"<<endl;
apple[0]=rand()%N+1;//蘋果
apple[1]=rand()%N+1;
gotoxy(apple[0],apple[1]);
color(12);
cout<<"●"<<endl;
}
int main()
{
int i,j;
int** snake=NULL;
int apple[2];
int score=0;
int tail[2];
int len=3;
char ch='p';
srand((unsigned)time(NULL));
init(apple);
snake=(int**)realloc(snake,sizeof(int*)*len);
for(i=0;i<len;i++)
snake[i]=(int*)malloc(sizeof(int)*2);
for(i=0;i<len;i++)
{
snake[i][0]=N/2;
snake[i][1]=N/2+i;
gotoxy(snake[i][0],snake[i][1]);
color(14);
cout<<"★"<<endl;
}
while(1)//進入訊息迴圈
{
tail[0]=snake[len-1][0];
tail[1]=snake[len-1][1];
gotoxy(tail[0],tail[1]);
color(11);
cout<<"■"<<endl;
for(i=len-1;i>0;i--)
{
snake[i][0]=snake[i-1][0];
snake[i][1]=snake[i-1][1];
gotoxy(snake[i][0],snake[i][1]);
color(14);
cout<<"★"<<endl;
}
if(kbhit())
{
gotoxy(0,N+2);
ch=getche();
}
switch(ch)
{
case 'w':snake[0][1]--;break;
case 's':snake[0][1]++;break;
case 'a':snake[0][0]--;break;
case 'd':snake[0][0]++;break;
default: break;
}
gotoxy(snake[0][0],snake[0][1]);
color(14);
cout<<"★"<<endl;
Sleep(abs(200-0.5*score));
if(snake[0][0]==apple[0]&&snake[0][1]==apple[1])//吃掉蘋果後蛇分數加1,蛇長加1
{
score++;
len++;
snake=(int**)realloc(snake,sizeof(int*)*len);
snake[len-1]=(int*)malloc(sizeof(int)*2);
apple[0]=rand()%N+1;
apple[1]=rand()%N+1;
gotoxy(apple[0],apple[1]);
color(12);
cout<<"●"<<endl;
gotoxy(N+5,3);
color(20);
cout<<score<<endl;
}
if(snake[0][1]==0||snake[0][1]==N||snake[0][0]==0||snake[0][0]==N)//撞到圍牆後失敗
{
gotoxy(N/2,N/2);
color(30);
cout<<"失敗!!!"<<endl;
for(i=0;i<len;i++)
free(snake[i]);
Sleep(INFINITE);
exit(0);
}
}
return 0;
}

2.有缺陷的貪吃蛇 
#include <stdio.h>
#include <windows.h>
#include <conio.h>
#include <time.h>
//遊戲視窗
#define FrameX 4   //遊戲視窗左上角的X軸座標
#define FrameY 4   //遊戲視窗左上角的Y軸座標
#define Frame_height  20 //遊戲視窗的高度
#define Frame_width   20 //遊戲視窗的寬度
//定義全域性變數
int i,j;
int a[2];     //用於記住蛇尾座標,其中a[0]、a[1]分別表示橫、豎座標
//宣告蛇的結構體
struct Snake
{
 int x[100];    //蛇的橫座標,其中x[0]表示蛇尾的橫座標,x[N-1]表示蛇頭的橫座標
 int y[100];    //蛇的豎座標,其中y[0]表示蛇尾的豎座標,y[N-1]表示蛇頭的豎座標
 int count;    //蛇吃食物的個數
 int length;    //蛇的長度
 int speed;    //蛇的速度
};
//宣告食物的結構體
struct Food
{
 int x;     //食物的橫座標
 int y;     //食物的豎座標
};
/******游標移到指定位置**************************************************************/
void gotoxy(HANDLE hOut, int x, int y)
{
 COORD pos;
 pos.X = x;  //橫座標
 pos.Y = y;  //縱座標
 SetConsoleCursorPosition(hOut, pos);
}
/******設定文字為綠色*****************************************************************/
void Set_TextColor_Green (void)
{ 
 HANDLE Handle = GetStdHandle(STD_OUTPUT_HANDLE);
 
 SetConsoleTextAttribute(Handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN);
}
/******製作遊戲視窗******************************************************************/
void make_frame()
{
 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);  //定義顯示器控制代碼變數
 gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+13);  //列印選擇選單
 printf("Esc 退出遊戲");
 gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+15);
 printf("長按方向鍵:加速");
 gotoxy(hOut,FrameX,FrameY);       //列印框角
 printf("╔");
 gotoxy(hOut,FrameX+2*Frame_width-2,FrameY);
 printf("╗");
 gotoxy(hOut,FrameX,FrameY+Frame_height);
 printf("╚");
 gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+Frame_height);
 printf("╝");
 for(i=2;i<2*Frame_width-2;i+=2)
 {
  gotoxy(hOut,FrameX+i,FrameY);
  printf("═");         //列印上橫框
 }
 for(i=2;i<2*Frame_width-2;i+=2)
 {
  gotoxy(hOut,FrameX+i,FrameY+Frame_height);
  printf("═");         //列印下橫框
 }
 for(i=1;i<Frame_height;i++)
 {
  gotoxy(hOut,FrameX,FrameY+i); 
  printf("║");         //列印左豎框
 }
 for(i=1;i<Frame_height;i++)
 {
  gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+i); 
  printf("║");         //列印右豎框
 }
 gotoxy(hOut,FrameX+Frame_width-5,FrameY-2);   //列印遊戲名稱 
 Set_TextColor_Green ();        //設定蛇為綠色
 printf("貪吃蛇遊戲");
}
/******結束選單*******************************************************************/
void over_game()
{
 system("cls");
 printf("\n\n\n\n\n\n\n\n\t\t\t\t遊戲結束\n\n\n");
 Sleep(2000);
 getch();
}
/******選單資訊***************************************************************/
print_information(HANDLE hOut,struct Snake *snake,struct Food *food)
{
 gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+1);
 printf("level : %d",snake->count/5+1);    //列印遊戲等級
 gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+3);
 printf("score : %d",10*snake->count);    //列印遊戲得分
 gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+5);
 printf("eat food : %d",snake->count);    //列印產生食物個數 
 gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+7);
 printf("speed : %dms",snake->speed);    //列印遊戲速度
 gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+9);
 printf("foodX : %d",food->x);      //列印食物的橫座標
 gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+11);
 printf("foodY : %d",food->y);      //列印食物的豎座標
}
/******初始化蛇**********************************************************************/
void init_snake(struct Snake *snake)
{
 snake->x[0]=FrameX+2;     //初始化蛇的橫座標 
 snake->y[0]=FrameY+Frame_height/2;  //初始化蛇的豎座標 
 snake->speed=300;      //初始化蛇的速度為300ms
 snake->length=3;      //初始化蛇的長度為3節
 snake->count=0;       //初始化蛇吃的個數為0
 for(i=1;i<snake->length;i++)
 {/* 依次得到蛇身、蛇頭的座標 */
  snake->x[i]=snake->x[i-1]+2;
  snake->y[i]=snake->y[i-1];
 } 
}
/******移動蛇*************************************************************************/
void move_snake(HANDLE hOut,struct Snake *snake)
{
 gotoxy(hOut,snake->x[0],snake->y[0]);
 printf("  ");       /* 清除蛇尾*/
 for(i=1;i<snake->length;i++)
 {/* 後一節的座標依次取代前一節的座標 */
  snake->x[i-1]=snake->x[i];
  snake->y[i-1]=snake->y[i];
 }
}
/******列印蛇*************************************************************************/
void print_snake(HANDLE hOut,struct Snake *snake)
{
 for(i=0;i<snake->length;i++)
 {
  gotoxy(hOut,snake->x[i],snake->y[i]);
  if(i==0)
  {
   printf("○");       //列印蛇尾
  }
  else if(i==snake->length-1)
  {
   printf("¤");       //列印蛇頭
  }
  else
  {
   printf("⊙");       //列印蛇身
  }
 }
}
/******隨機產生食物*******************************************************************/
void get_food(HANDLE hOut,struct Snake *snake,struct Food *food)
{
 srand((unsigned)time(NULL));       //初始化隨機數
 while(1)
 {/* 產生食物的條件:1.在遊戲視窗內 2.不在蛇的身上 */ 
  food->x = rand() % (Frame_width-1);
  food->y = rand() % Frame_height;
  if( food->x==0 || food->y==0 )
  {
   continue;
  }
  food->x = 2*food->x + FrameX;      //得到食物的橫座標
  food->y+=FrameY;         //得到食物的豎座標
  for(i=0;i<snake->length;i++)
  {/* 判斷食物是否在蛇的身上,如果在蛇身上,則重新產生;否則,列印蛇身 */
   if( food->x==snake->x[i] && food->y==snake->y[i] )
   {
    break;
   }
  }
  if(i==snake->length)
  {
   gotoxy(hOut,food->x,food->y);
   printf("⊙");
   break;
  } 
 }
}
/******吃食物***************************************************************************/
void eat_food(HANDLE hOut,struct Snake *snake,struct Food *food)
{
 if( snake->x[snake->length-1]==food->x && snake->y[snake->length-1]==food->y )
 {/* 如果蛇頭位置與食物位置相同,吃食物 */
  snake->length++;      //吃一個食物,蛇身增長一節
  for(i=snake->length-1;i>=1;i--)
  {/* 蛇後節座標依次賦值給蛇前一節的座標,依次得到蛇身及蛇頭的座標 */
   snake->x[i]=snake->x[i-1];
   snake->y[i]=snake->y[i-1];
  } 
  snake->x[0]=a[0];      //得到蛇尾移動前的橫座標
  snake->y[0]=a[1];      //得到蛇尾移動前的豎座標  
  get_food(hOut,snake,food);    //重新產生食物
  snake->count++;       //食物的個數增1
  if( snake->count%5==0 )
  {/* 當蛇吃Up_level個食物時,速度加快Up_speed毫秒並且升一級 */
   snake->speed-=50;
  }
 }
}
/******穿牆**********************************************************************************/
void through_wall(HANDLE hOut,struct Snake *snake,char ch)
{
 if( ch==72 && snake->y[snake->length-1]==FrameY)
 {
  snake->y[snake->length-1] = FrameY+Frame_height-1; //如果蛇在上框且向上移動,穿牆
 }
 if( ch==80 && snake->y[snake->length-1]==FrameY+Frame_height )
 {
  snake->y[snake->length-1] = FrameY+1;    //如果蛇在下框且向下移動,穿牆
 }
 if( ch==75 && snake->x[snake->length-1]==FrameX )
 {
  snake->x[snake->length-1] = FrameX+2*Frame_width-4; //如果蛇在左框且向左移動,穿牆
 }
 if( ch==77 && snake->x[snake->length-1]==FrameX+2*Frame_width-2 )
 {
  snake->x[snake->length-1] = FrameX+2;    //如果蛇在右框且向右移動,穿牆
 }
}
/******判斷蛇是否死**************************************************************************/
int if_die(struct Snake *snake)
{/* 當蛇頭碰到自身時,蛇死 ,返回值為0 */
 for(i=0;i<snake->length-1;i++)
 {
  if( snake->x[snake->length-1]==snake->x[i] && snake->y[snake->length-1]==snake->y[i] )
  {
   return 0;
  }
 }
 return 1;
}
/******開始遊戲*******************************************************************************/
void start_game()
{
 unsigned char ch=77;        //定義用於接收鍵盤輸入的字元變數
 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //定義顯示器控制代碼變數
 struct Snake s,*snake=&s;      //定義蛇的結構體指標並指向蛇的結構體
 struct Food f,*food=&f;       //定義食物的結構體指標並指向食物的結構體
 
 make_frame();         //製作遊戲視窗 
 init_snake(snake);        //初始化蛇
 get_food(hOut,snake,food);      //隨機產生食物
 while(1)
 {
  print_information(hOut,snake,food);   //列印選單資訊
  a[0]=snake->x[0];       //記住蛇尾的橫座標
  a[1]=snake->y[0];       //記住蛇尾的豎座標
  j=0;
  if(kbhit())
  {/* 判斷是否按下鍵盤,如果按下,ch接收鍵盤輸入 */
   ch=getch();
   if(kbhit())
   {/* 如果長按鍵盤,則加速 */
    Sleep(20);
    j=1;
   }
  }
  switch(ch)
  {
   case 72:
    {/* 向上移動 */
     move_snake(hOut,snake);   //移動蛇
     snake->y[snake->length-1]-=1; //蛇頭的豎座標向上移,即減1 
     break;
    }
   case 80:
    {/* 向下移動 */
     move_snake(hOut,snake);   //移動蛇
     snake->y[snake->length-1]+=1; //蛇頭的豎座標向下移,即加1
     break;
    }
   case 75:
    {/* 向左移動 */
     move_snake(hOut,snake);   //移動蛇
     snake->x[snake->length-1]-=2; //蛇頭的橫座標向左移,即減2
     break;
    }    
   case 77:
    {/* 向右移動 */
     move_snake(hOut,snake);   //移動蛇
     snake->x[snake->length-1]+=2; //蛇頭的橫座標向右移,即加2
     break;
    }
  }
  through_wall(hOut,snake,ch);    //穿牆   
  eat_food(hOut,snake,food);     //吃食物
  print_snake(hOut,snake);     //列印蛇
  if( if_die(snake)==0 || ch==27 || snake->speed==50 )
  {/* 遊戲結束條件:1.蛇碰到自身 2.按Esc鍵 3.速度為50ms */
   gotoxy(hOut,FrameX+Frame_width-2,FrameY+Frame_height/2-1);
   printf("Game Over");
   Sleep(2000);
   break;
  }
  if(j==0)
  {
   Sleep(snake->speed);      //延遲時間
  }
  else
  {
   Sleep(1000);
  } 
 }
}
int main()
{
 system("color 0D");  //設定文字為粉紅色
 start_game();   //開始遊戲
 over_game(); 
 return 0;  //結束遊戲
}

3.貪吃蛇的簡單移動 
#include <stdio.h>
#include <conio.h>
#include <windows.h>

#define BEG_X	2
#define BEG_Y	1
#define WID		20
#define HEI		20

HANDLE hout;
typedef enum {UP, DOWN, LEFT, RIGHT} DIR;
typedef struct Snake_body
{
	COORD pos;//蛇身的位置
	struct Snake_body *next;//下一個蛇身
	struct Snake_body *prev;//前一個蛇身
}SNAKE, *PSNAKE;
PSNAKE head = NULL;//蛇頭
PSNAKE tail = NULL;//蛇尾

//畫遊戲邊框的函式
void DrawBorder()
{
	int i, j;
	COORD pos = {BEG_X, BEG_Y};
	for(i = 0; i < HEI; ++i)
	{
		SetConsoleCursorPosition(hout, pos);
		for(j = 0; j < WID; ++j)
		{
			if(i == 0)//第一行
			{
				if(j == 0)
					printf("┏");
				else if(j == WID - 1)
					printf("┓");
				else
					printf("━");
			}
			else if(i == HEI - 1)//最後一行
			{
				if(j == 0)
					printf("┗");
				else if(j == WID - 1)
					printf("┛");
				else
					printf("━");
			}
			else if(j == 0 || j == WID - 1)//第一列或最後一列
				printf("┃");
			else
				printf("  ");
		}
		++pos.Y;
	}	
}

//新增蛇身的函式
void AddBody(COORD pos)
{
	PSNAKE pnew = (PSNAKE)calloc(1, sizeof(SNAKE));
	pnew->pos = pos;
	if(!head)
	{
		head = tail = pnew;
	}
	else
	{
		pnew->next = head;//新建立蛇身的next指向原先的蛇頭
		head->prev = pnew;//原先的蛇頭的prev指向新建立的蛇身
		head = pnew;//把新建立的蛇身作為新的蛇頭
	}
	SetConsoleCursorPosition(hout, head->pos);
	printf("◎");
}

//蛇身移動的函式
void MoveBody(DIR dir)
{
	PSNAKE ptmp;
	COORD pos = head->pos;
	switch(dir)
	{
		case UP:
			if(head->pos.Y > BEG_Y + 1)
				--pos.Y;
			else
				return;
		break;		
		case DOWN:
			if(head->pos.Y < BEG_Y + HEI - 2)
				++pos.Y;
			else
				return;
		break;
		case LEFT:
			if(head->pos.X > BEG_X + 2)
				pos.X -= 2;
			else
				return;
		break;
		case RIGHT:
			if(head->pos.X < BEG_X + (WID - 2) * 2)
				pos.X += 2;
			else 
				return;
		break;
	}
	AddBody(pos);//添加了一個新的蛇頭
	ptmp = tail;//儲存當前的蛇尾
	tail = tail->prev;
	if(tail)
		tail->next = NULL;
	SetConsoleCursorPosition(hout, ptmp->pos);
	printf("  ");
	free(ptmp);
}


int main()
{
	int ctrl;
	DIR dir = RIGHT;//初始蛇的方向是向右的
	COORD pos = {BEG_X + 2, BEG_Y + HEI / 2};
	system("color 0E");
	system("mode con cols=90 lines=30");
	hout = GetStdHandle(STD_OUTPUT_HANDLE);
	printf("    ------------貪吃蛇的移動------------");
	DrawBorder();
	//自定義幾個蛇的身體
	AddBody(pos);
	pos.X += 2;
	AddBody(pos);
	pos.X += 2;
	AddBody(pos);
	pos.X += 2;
	AddBody(pos);
	pos.X += 2;
	AddBody(pos);
	pos.X += 2;
	AddBody(pos);
	pos.X += 2;
	AddBody(pos);
	//控制蛇的移動
	while(ctrl = getch())
	{
		switch(ctrl)
		{
			case 'w':
				if(dir == DOWN)
					continue;
				dir = UP;
				break;
			case 's':
				if(dir == UP)
					continue;
				dir = DOWN;
				break;
			case 'a':
				if(dir == RIGHT)
					continue;
				dir = LEFT;
				break;
			case 'd':
				if(dir == LEFT)
					continue;
				dir = RIGHT;
				break;
			case 'q':
				return 0;
		}
		MoveBody(dir);
	}
	
	return 0;
}
#include<stdio.h>  
#include<time.h>  
#include<windows.h>  
#include<stdlib.h>  
  
#define U 1  
#define D 2  
#define L 3  
#define R 4       //蛇的狀態,U:上 ;D:下;L:左 R:右  
  
typedef struct SNAKE { //蛇身的一個節點  
    int x;  
    int y;  
    struct SNAKE *next;  
} snake;  
  
//全域性變數//  
int score=0,add=10;//總得分與每次吃食物得分。  
int status,sleeptime=200;//每次執行的時間間隔  
snake *head, *food;//蛇頭指標,食物指標  
snake *q;//遍歷蛇的時候用到的指標  
int endgamestatus=0; //遊戲結束的情況,1:撞到牆;2:咬到自己;3:主動退出遊戲。  
  
//宣告全部函式//  
void Pos();  
void creatMap();  
void initsnake();  
int biteself();  
void createfood();  
void cantcrosswall();  
void snakemove();  
void pause();  
void gamecircle();  
void welcometogame();  
void endgame();  
void gamestart();  
  
void Pos(int x,int y) { //設定游標位置  
    COORD pos;  
    HANDLE hOutput;  
    pos.X=x;  
    pos.Y=y;  
    hOutput=GetStdHandle(STD_OUTPUT_HANDLE);  
    SetConsoleCursorPosition(hOutput,pos);  
}  
  
void creatMap() { //建立地圖  
    int i;  
    for(i=0; i<58; i+=2) { //列印上下邊框  
        Pos(i,0);  
        printf("■");  
        Pos(i,26);  
        printf("■");  
    }  
    for(i=1; i<26; i++) { //列印左右邊框  
        Pos(0,i);  
        printf("■");  
        Pos(56,i);  
        printf("■");  
    }  
}  
  
void initsnake() { //初始化蛇身  
    snake *tail;  
    int i;  
    tail=(snake*)malloc(sizeof(snake));//從蛇尾開始,頭插法,以x,y設定開始的位置//  
    tail->x=24;  
    tail->y=5;  
    tail->next=NULL;  
    for(i=1; i<=4; i++) {  
        head=(snake*)malloc(sizeof(snake));  
        head->next=tail;  
        head->x=24+2*i;  
        head->y=5;  
        tail=head;  
    }  
    while(tail!=NULL) { //從頭到為,輸出蛇身  
        Pos(tail->x,tail->y);  
        printf("■");  
        tail=tail->next;  
    }  
}  
  
int biteself() { //判斷是否咬到了自己  
    snake *self;  
    self=head->next;  
    while(self!=NULL) {  
        if(self->x==head->x && self->y==head->y) {  
            return 1;  
        }  
        self=self->next;  
    }  
    return 0;  
}  
  
void createfood() { //隨機出現食物  
    snake *food_1;  
    srand((unsigned)time(NULL));  
    food_1=(snake*)malloc(sizeof(snake));  
    while((food_1->x%2)!=0) {  //保證其為偶數,使得食物能與蛇頭對其  
        food_1->x=rand()%52+2;  
    }  
    food_1->y=rand()%24+1;  
    q=head;  
    while(q->next==NULL) {  
        if(q->x==food_1->x && q->y==food_1->y) { //判斷蛇身是否與食物重合  
            free(food_1);  
            createfood();  
        }  
        q=q->next;  
    }  
    Pos(food_1->x,food_1->y);  
    food=food_1;  
    printf("■");  
}  
  
void cantcrosswall() { //不能穿牆  
    if(head->x==0 || head->x==56 ||head->y==0 || head->y==26) {  
        endgamestatus=1;  
        endgame();  
    }  
}  
  
void snakemove() { //蛇前進,上U,下D,左L,右R  
    snake * nexthead;  
    cantcrosswall();  
  
    nexthead=(snake*)malloc(sizeof(snake));  
    if(status==U) {  
        nexthead->x=head->x;  
        nexthead->y=head->y-1;  
        if(nexthead->x==food->x && nexthead->y==food->y) { //如果下一個有食物//  
            nexthead->next=head;  
            head=nexthead;  
            q=head;  
            while(q!=NULL) {  
                Pos(q->x,q->y);  
                printf("■");  
                q=q->next;  
            }  
            score=score+add;  
            createfood();  
        } else {                                           //如果沒有食物//  
            nexthead->next=head;  
            head=nexthead;  
            q=head;  
            while(q->next->next!=NULL) {  
                Pos(q->x,q->y);  
                printf("■");  
                q=q->next;  
            }  
            Pos(q->next->x,q->next->y);  
            printf("  ");  
            free(q->next);  
            q->next=NULL;  
        }  
    }  
    if(status==D) {  
        nexthead->x=head->x;  
        nexthead->y=head->y+1;  
        if(nexthead->x==food->x && nexthead->y==food->y) { //有食物  
            nexthead->next=head;  
            head=nexthead;  
            q=head;  
            while(q!=NULL) {  
                Pos(q->x,q->y);  
                printf("■");  
                q=q->next;  
            }  
            score=score+add;  
            createfood();  
        } else {                           //沒有食物  
            nexthead->next=head;  
            head=nexthead;  
            q=head;  
            while(q->next->next!=NULL) {  
                Pos(q->x,q->y);  
                printf("■");  
                q=q->next;  
            }  
            Pos(q->next->x,q->next->y);  
            printf("  ");  
            free(q->next);  
            q->next=NULL;  
        }  
    }  
    if(status==L) {  
        nexthead->x=head->x-2;  
        nexthead->y=head->y;  
        if(nexthead->x==food->x && nexthead->y==food->y) { //有食物  
            nexthead->next=head;  
            head=nexthead;  
            q=head;  
            while(q!=NULL) {  
                Pos(q->x,q->y);  
                printf("■");  
                q=q->next;  
            }  
            score=score+add;  
            createfood();  
        } else {                            //沒有食物  
            nexthead->next=head;  
            head=nexthead;  
            q=head;  
            while(q->next->next!=NULL) {  
                Pos(q->x,q->y);  
                printf("■");  
                q=q->next;  
            }  
            Pos(q->next->x,q->next->y);  
            printf("  ");  
            free(q->next);  
            q->next=NULL;  
        }  
    }  
    if(status==R) {  
        nexthead->x=head->x+2;  
        nexthead->y=head->y;  
        if(nexthead->x==food->x && nexthead->y==food->y) { //有食物  
            nexthead->next=head;  
            head=nexthead;  
            q=head;  
            while(q!=NULL) {  
                Pos(q->x,q->y);  
                printf("■");  
                q=q->next;  
            }  
            score=score+add;  
            createfood();  
        } else {                                     //沒有食物  
            nexthead->next=head;  
            head=nexthead;  
            q=head;  
            while(q->next->next!=NULL) {  
                Pos(q->x,q->y);  
                printf("■");  
                q=q->next;  
            }  
            Pos(q->next->x,q->next->y);  
            printf("  ");  
            free(q->next);  
            q->next=NULL;  
        }  
    }  
    if(biteself()==1) {     //判斷是否會咬到自己  
        endgamestatus=2;  
        endgame();  
    }  
}  
  
void pause() { //暫停  
    while(1) {  
        Sleep(300);  
        if(GetAsyncKeyState(VK_SPACE)) {  
            break;  
        }  
  
    }  
}  
  
void gamecircle() { //控制遊戲  
  
    Pos(64,15);  
    printf("不能穿牆,不能咬到自己\n");  
    Pos(64,16);  
    printf("用↑.↓.←.→分別控制蛇的移動.");  
    Pos(64,17);  
    printf("F1 為加速,F2 為減速\n");  
    Pos(64,18);  
    printf("ESC :退出遊戲.space:暫停遊戲.");  
    Pos(64,20);  
    printf("C語言研究中心 www.clang.cc");  
    status=R;  
    while(1) {  
        Pos(64,10);  
        printf("得分:%d  ",score);  
        Pos(64,11);  
        printf("每個食物得分:%d分",add);  
        if(GetAsyncKeyState(VK_UP) && status!=D) {  
            status=U;  
        } else if(GetAsyncKeyState(VK_DOWN) && status!=U) {  
            status=D;  
        } else if(GetAsyncKeyState(VK_LEFT)&& status!=R) {  
            status=L;  
        } else if(GetAsyncKeyState(VK_RIGHT)&& status!=L) {  
            status=R;  
        } else if(GetAsyncKeyState(VK_SPACE)) {  
            pause();  
        } else if(GetAsyncKeyState(VK_ESCAPE)) {  
            endgamestatus=3;  
            break;  
        } else if(GetAsyncKeyState(VK_F1)) {  
            if(sleeptime>=50) {  
                sleeptime=sleeptime-30;  
                add=add+2;  
                if(sleeptime==320) {  
                    add=2;//防止減到1之後再加回來有錯  
                }  
            }  
        } else if(GetAsyncKeyState(VK_F2)) {  
            if(sleeptime<350) {  
                sleeptime=sleeptime+30;  
                add=add-2;  
                if(sleeptime==350) {  
                    add=1;  //保證最低分為1  
                }  
            }  
        }  
        Sleep(sleeptime);  
        snakemove();  
    }  
}  
  
void welcometogame() { //開始介面  
    Pos(40,12);  
  
    system("title C語言研究中心   www.clang.cc");  
    printf("歡迎來到貪食蛇遊戲!");  
    Pos(40,25);  
    printf("              C語言研究中心  www.clang.cc.\n");  
    system("pause");  
    system("cls");  
    Pos(25,12);  
    printf("用↑.↓.←.→分別控制蛇的移動, F1 為加速,2 為減速\n");  
    Pos(25,13);  
    printf("加速將能得到更高的分數。\n");  
    system("pause");  
    system("cls");  
}  
  
void endgame() { //結束遊戲  
  
    system("cls");  
    Pos(24,12);  
    if(endgamestatus==1) {  
        printf("對不起,您撞到牆了。遊戲結束.");  
    } else if(endgamestatus==2) {  
        printf("對不起,您咬到自己了。遊戲結束.");  
    } else if(endgamestatus==3) {  
        printf("您的已經結束了遊戲。");  
    }  
    Pos(24,13);  
    printf("您的得分是%d\n",score);  
    exit(0);  
}  
  
void gamestart() { //遊戲初始化  
    system("mode con cols=100 lines=30");  
    welcometogame();  
    creatMap();  
    initsnake();  
    createfood();  
}  
  
int main() {  
    gamestart();  
    gamecircle();  
    endgame();  
    return 0;  
}