承接上篇的掃雷,在分享一個貪喫蛇的代碼,w,a,s,d控制方向。
其實在寫貪喫蛇的時候,代價或許會不懂蛇的尾巴怎麼畫,這個告訴大家一個技巧,背景融入法,就是一條邊畫成黑色,相信大家都懂了,相信大家如果在寫的時候,可能會有些許疑惑,蛇怎麼實現轉彎,那麼大家可以換一種思維,蛇只有頭前進,身體的其他部位都是跟着前一段身體走,這樣或許大家就知道怎麼寫了(array[1]和array[2]),數組緊貼賦值,其實根本不用考慮轉彎。
附上代碼:
//////////////////////////
//程序名稱:貪喫蛇娛樂版 //
//作者: ys //
//最後修改:2014.7.27 //
//編輯條件:VC6.0 //
//////////////////////////
#include <graphics.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
#define SIZE_ALL_BODY 20
#define SIZE_UNIT_BODY 20
#define WIDTH 480
#define HEIGHT 360
int x0,y0;
int m_maxx,m_maxy;
typedef enum //蛇移動的四個方向
{
left, right, up, down
}DIR;
typedef struct //結構體化座標
{
int x; //x座標
int y; //y座標
}COOR;
struct FOOD //定義食物的信息
{
int flag; //食物的狀態,1表示沒喫,0表示吃了
COOR crd; //食物的座標
}food;
struct SNAKE //定義蛇的狀態信息
{
int body_num; //蛇身多少節
COOR body[SIZE_ALL_BODY]; //蛇身每節的座標
DIR dir; //蛇頭方向
}snake;
/******************************************************/
void init_system(); //初始化系統
void setfood(); //設置食物信息
void draw_food(); //畫食物
void judge_hit(); //判斷是否撞擊
void eatfood(); //蛇喫食物
void snakemove(); //蛇的移動
void gameover(); //遊戲結束
void showsnake(); //畫蛇
void keyboard(); //鍵盤操作
/*****************************************************/
int main()
{
init_system();
while(1)
{
while(!kbhit())
{
if (!food.flag)
setfood(); //判斷食物是否被喫
draw_food(); //畫食物
showsnake(); //畫蛇
snakemove(); //蛇的移動
judge_hit(); //蛇是否發生撞擊
eatfood(); //喫食物
}
keyboard();
}
getch();
return 0;
}
//判斷是否撞擊身體或者邊界
void judge_hit()
{
int i;
if (snake.body[0].x < x0 || snake.body[0].x > x0+WIDTH-SIZE_UNIT_BODY || //判斷撞擊邊界
snake.body[0].y < y0 || snake.body[0].y > y0+HEIGHT-SIZE_UNIT_BODY)
{
gameover();
}
for (i=snake.body_num-1;i>0;i--) //判斷撞擊身體
{
if (snake.body[0].x==snake.body[i].x && snake.body[0].y==snake.body[i].y)
{
gameover();
}
}
}
//蛇的移動
void snakemove()
{
int i;
for (i=snake.body_num;i>0;i--)
{
snake.body[i].x=snake.body[i-1].x;
snake.body[i].y=snake.body[i-1].y;
}
switch(snake.dir)
{
case right:
snake.body[0].x+=SIZE_UNIT_BODY;break;
case left:
snake.body[0].x-=SIZE_UNIT_BODY;break;
case up:
snake.body[0].y-=SIZE_UNIT_BODY;break;
case down:
snake.body[0].y+=SIZE_UNIT_BODY;break;
}
Sleep(100);
}
//鍵盤控制
void keyboard()
{
switch(getch())
{
case 'w':
case 'W':
if (snake.dir!=down)
{
snake.dir=up;
break;
}
case 'a':
case 'A':
if (snake.dir!=right)
{
snake.dir=left;
break;
}
case 's':
case 'S':
if (snake.dir!=up)
{
snake.dir=down;
break;
}
case 'd':
case 'D':
if (snake.dir!=left)
{
snake.dir=right;
break;
}
}
}
//畫蛇
void showsnake()
{
int i;
for (i=snake.body_num-1;i>=0;i--)
{
rectangle(snake.body[i].x,snake.body[i].y,snake.body[i].x+SIZE_UNIT_BODY,snake.body[i].y+SIZE_UNIT_BODY);
}
setlinecolor(BLACK);
rectangle(snake.body[snake.body_num].x,snake.body[snake.body_num].y,snake.body[snake.body_num].x+SIZE_UNIT_BODY,snake.body[snake.body_num].y+SIZE_UNIT_BODY);
}
//畫食物
void draw_food()
{
int i=0;
i=rand()%4;
switch(i)
{
case 0: setlinecolor(RED);break;
case 1: setlinecolor(GREEN);break;
case 2: setlinecolor(WHITE);break;
case 3: setlinecolor(BLUE);break;
}
i++;
rectangle(food.crd.x,food.crd.y,food.crd.x+SIZE_UNIT_BODY,food.crd.y+SIZE_UNIT_BODY);
}
//設置食物信息
void setfood()
{
srand((unsigned)time(NULL));
food.crd.x=x0+rand()%(WIDTH/SIZE_UNIT_BODY)*SIZE_UNIT_BODY;
food.crd.y=y0+rand()%(HEIGHT/SIZE_UNIT_BODY)*SIZE_UNIT_BODY;
food.flag=1;
}
//蛇喫食物
void eatfood()
{
if (snake.body[0].x==food.crd.x && snake.body[0].y==food.crd.y)
{
snake.body_num++;
setlinecolor(RED);
rectangle(food.crd.x,food.crd.y,food.crd.x+SIZE_UNIT_BODY,food.crd.y+SIZE_UNIT_BODY);
food.flag=0;
}
}
//初始化系統
void init_system()
{
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode," "); //初始化圖形界面模式
m_maxx=getmaxx();
m_maxy=getmaxy();
x0=(m_maxx-WIDTH)/2;
y0=(m_maxy-HEIGHT)/2;
snake.body_num=1; //初始化蛇的狀態
srand((unsigned)time(NULL));
snake.body[0].x=x0+rand()%(WIDTH/SIZE_UNIT_BODY/2)*SIZE_UNIT_BODY;;
snake.body[0].y=y0+rand()%(HEIGHT/SIZE_UNIT_BODY/2)*SIZE_UNIT_BODY;
food.flag=0;
int dir;
dir=rand()%4;
switch(dir)
{
case 0:
snake.dir=right;break;
case 1:
snake.dir=left;break;
case 2:
snake.dir=up;break;
case 3:
snake.dir=down;break;
}
setlinecolor(WHITE);
rectangle(x0-1,y0-1,x0+WIDTH+1,y0+HEIGHT+1);//畫遊戲框
}
//遊戲結束
void gameover()
{
int x,y;
settextstyle(40,40,_T("宋體"));
x=(m_maxx-textwidth("GAME OVER!"))/2;
y=10;
outtextxy(x,y,_T("GAME OVER!"));
getch();
closegraph();
}