當前位置:編程學習大全網 - 編程語言 - 用c語言寫貪吃蛇

用c語言寫貪吃蛇

#include

#include

#include

#include /*引用的庫函數*/

#define LEFT 0x4b00

#define RIGHT 0x4d00

#define DOWN 0x5000

#define UP 0x4800

#define ESC 0x011b/*宏定義鍵名*/

#define N 200

int i,key;

int level;/*遊戲等級*/

int score=0;/*得分*/

int gamespeed;/*遊戲速度*/

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 Choicelevle(void);/*選擇遊戲等級*/

void Init(void);/*圖形驅動*/

void Close(void);/*圖形結束*/

void DRAW(void);/*遊戲區域*/

void GameOver(void);/*結束遊戲*/

void GamePlay(void);/*玩遊戲具體過程*/

void PrScore(void);/*輸出成績*/

/*主函數*/

void main(void)

{

Init();/*圖形驅動*/

Choicelevle();/*選擇遊戲等級*/

DRAW();/*遊戲區域*/

GamePlay();/*玩遊戲具體過程*/

Close();/*圖形結束*/

}

/*圖形驅動*/

void Init(void)

{

int gd=DETECT,gm;

initgraph(&gd,&gm,"\\turboc2"); /*初始化圖形系統*/

cleardevice(); /*清除圖形界面*/

}

/*選擇遊戲等級*/

void Choicelevle(void)

{char name[20];setcolor(YELLOW);settextstyle(0,0,6);outtextxy(150,150,"Snake");setcolor(GREEN);settextstyle(0,0,1);outtextxy(200,250,"please put in your English name:");outtextxy(200,270,"Choice levle from 1-9.");outtextxy(300,320,"name:yangzilong");/*制作人姓名*/outtextxy(300,350,"number:0902060226");/*制作人學號*/outtextxy(300,380,"class:computer science 0602");/*制作人班級*/getch();printf("please putin your name:");gets(name);printf("please choice levle:");scanf("%d",&level);gamespeed=100000-400*level-300*level*level;if(level>9||level<1){cleardevice(); /*清除圖形界面*/setcolor(YELLOW); /*設置字體顏色*/settextstyle(0,0,2); /*設置字體類型*/outtextxy(150,200,"level input error"); /*顯示文本*/getch();level=1;}

}

void DRAW(void)

{cleardevice(); /*清屏*/setcolor(2);setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*設置線型*/rectangle(45,45,465,325);}

/*玩遊戲具體過程*/

void GamePlay(void)

{setcolor(5);setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*設置線型*/randomize();/*隨機數發生器*/food.yes=1;/*1表示需要出現新食物,0表示已經存在食物*/snake.life=0;/*活著*/snake.direction=1;/*方向往右*/snake.x[0]=320;snake.y[0]=240;/*蛇頭*/snake.x[1]=330;snake.y[1]=240; /*蛇的第二節位置*/snake.node=3;/*節數*/PrScore();/*輸出得分*/while(1)/*可以重復玩遊戲,壓ESC鍵結束*/{while(!kbhit())/*在沒有按鍵的情況下,蛇自己移動身體*/{if(food.yes==1)/*需要出現新食物*/{food.x=rand()%360+70;food.y=rand()%250+60;while(food.x%10!=0)/*食物隨機出現後必須讓食物能夠在整格內,這樣才可以讓蛇吃到*/food.x++;while(food.y%10!=0)food.y++;food.yes=0;/*畫面上有食物了*/}

if(food.yes==0)/*畫面上有食物了就要顯示*/

{

setcolor(GREEN);

rectangle(food.x,food.y,food.x+10,food.y-10);

}

for(i=snake.node-1;i>0;i--)/*蛇的每個環節往前移動*/

{

snake.x[i]=snake.x[i-1];

snake.y[i]=snake.y[i-1];

}

/*1,2,3,4表示右,左,上,下四個方向,通過這個控制來移動蛇頭*/

switch(snake.direction)

{

case 1: snake.x[0]+=10;break;

case 2: snake.x[0]-=10;break;

case 3: snake.y[0]-=10;break;

case 4: snake.y[0]+=10;break;

}

for(i=3;i<snake.node;i++)/*從蛇的第四節開始判斷是否撞到自己了,因為蛇頭為兩節,第三節不可能拐過來*/

{

if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])

{

GameOver();/*顯示失敗*/

snake.life=1; /*蛇死*/

break;

}

}

/*如果蛇頭碰到墻壁,蛇頭從對面墻出來*/

if(snake.x[0]<50)

{snake.x[0]=450;/*如果蛇頭越過左邊界,則從右邊界進入*/snake.y[0]=snake.y[0];/*縱坐標不變*/for(i=snake.node-1;i>0;i--){snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1]; /*蛇的其他節數向前推進*/}

{

setfillstyle(SOLID_FILL,0); /*設置填充模式和顏色,0表示黑色*/

bar(50,55,455,315);/*bar是表示填充的範圍的函數*/

}

}

else

if(snake.x[0]>450)

{snake.x[0]=50;/*如果蛇頭越過右邊界,則蛇頭從左邊界進入*/snake.y[0]=snake.y[0];/*縱坐標不變*/for(i=snake.node-1;i>0;i--){snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1]; /*蛇的其他節數向前推進*/}

{

setfillstyle(SOLID_FILL,0); /*設置填充模式和顏色,0表示黑色*/

bar(50,55,455,315);/*bar是表示填充的範圍的函數*/

}

}

else

if(snake.y[0]<60)

{snake.y[0]=320;/*如果蛇頭越過上邊界,則從下邊界進入*/snake.x[0]=snake.x[0];/*橫坐標不變*/for(i=snake.node-1;i>0;i--){snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1]; /*蛇的其他節數向前推進*/}

{

setfillstyle(SOLID_FILL,0); /*設置填充模式和顏色,0表示黑色*/

bar(50,55,455,315);/*bar是表示填充的範圍的函數*/

}

}

else

if(snake.y[0]>320)

{snake.y[0]=60;/*如果蛇頭越過下邊界,則從上邊界進入*/snake.x[0]=snake.x[0];/*橫坐標不變*/for(i=snake.node-1;i>0;i--){snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1]; /*蛇的其他節數向前推進*/}

{

setfillstyle(SOLID_FILL,0); /*設置填充模式和顏色,0表示黑色*/

bar(50,55,455,315);/*bar是表示填充的範圍的函數*/

}

}

if(snake.life==1)/*如果蛇死就跳出內循環,重新開始*/

break;

if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以後*/

{

setcolor(0);/*把畫面上的食物東西去掉*/

rectangle(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;/*畫面上需要出現新的食物*/

score+=10; /*每吃掉壹食物,得分累加10分*/

if(score%100==0)

{level++;gamespeed=100000-400*level-300*level*level;/*每吃掉10食物提升壹級,速度加快*/PrScore();/*輸出新得分*/setcolor(YELLOW); /*設置字體顏色*/settextstyle(0,0,4); /*設置字體類型*/outtextxy(150,200,"LEVEL UP"); /*顯示文本*/if(level==10){level=1,gamespeed=100000-400*level-300*level*level;}

delay(6000000);

delay(6000000);

delay(6000000);

delay(6000000);

delay(6000000);

delay(6000000);

delay(6000000);

bar(50,55,455,315);/*bar是表示填充的範圍的函數*/

}

PrScore();/*輸出新得分*/

}

setcolor(4);/*畫出蛇*/

for(i=0;i<snake.node;i++)

rectangle(snake.x[i],snake.y[i],snake.x[i]+10,

snake.y[i]-10);

delay(gamespeed); /*控制遊戲速度*/

setcolor(0);

rectangle(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)/*如果蛇死就跳出循環*/

break;

key=bioskey(0);/*接收按鍵*/

if(key==ESC)/*按ESC鍵退出*/

break;

else

if(key==UP&&snake.direction!=4)

/*判斷是否往相反的方向移動*/

snake.direction=3;

else

if(key==RIGHT&&snake.direction!=2)

snake.direction=1;

else

if(key==LEFT&&snake.direction!=1)

snake.direction=2;

else

if(key==DOWN&&snake.direction!=3)

snake.direction=4;

}/*endwhile(1)*/

}

/*遊戲結束*/

void GameOver(void)

{

cleardevice(); /*清屏*/

PrScore();

setcolor(RED); /*設置字體顏色*/

settextstyle(0,0,4); /*設置字體類型*/

outtextxy(200,200,"GAME OVER"); /*顯示文本*/

getch();

}

/*輸出成績及遊戲等級*/

void PrScore(void)

{

char str1[20];/*設置字符型數組*/

setfillstyle(SOLID_FILL,0);

bar(50,15,390,35); /*填充矩形框*/

setcolor(6); /*設置文本顏色*/

settextstyle(0,0,2); /*設置數組顯示位置*/

sprintf(str1,"score %d level %d",score,level);/*顯示數組內容*/

outtextxy(55,20,str1);

setcolor(YELLOW); /*設置字體顏色*/

settextstyle(0,0,2); /*設置字體類型*/

outtextxy(250,400,"EXIT=ESC ");/*顯示文本*/

}

void Close(void)

{

closegraph();

}

  • 上一篇:內向的妳選擇做了什麽工作?
  • 下一篇:推薦壹款電鋼琴或者電子鍵盤
  • copyright 2024編程學習大全網