如何用純C語言來實現貪吃蛇的小遊戲,個人思路如下:
1.首先,我們要先顯示一個遊戲界面,所以我一般想到用一個數組game[ROW][COL]來實現
static char game[ROW][COL];
方法:遍歷整個遊戲界面的座標,首先在初始化的函數中規定當下x,y滿足什麼條件時,game[ROW][COL]=?,
然後在顯示函數中通過game[y][x]=?進行printf打印出來
2.然後,用一個結構體來定義蛇
typedf struct snake{
int data;//1:蛇頭 2:蛇身 3:蛇尾
int y,x;//蛇在遊戲區域的位置座標
struct snake *next,*prev;
}Snake_t;
3.對於蛇要吃的食物,我將採取隨機出現的情況
規定遊戲界面一直保持同時存在6個食物
int i;
srand(getpid());//初始化隨機數種子
for(i=0;i<6;i++)
{
while(1)
{
y=rand()%(ROW-2)+1;
x=rand()%(COL-2)+1;
if(game[y][x]==0)
{
game[y][x]=6;
break;
}
}
}
4.我們還應該實現貪吃蛇它自動運動,所以我們要用到信號函數
//初始化信號
signal(SIGALRM,moveSnake);
struct itimerval new={0};//一定要初始化,否則爲垃圾值
new.it_value.tv_usec=500000;
new.it_interval.tv_usec=500000;
setitimer(ITIMER_REAL,&new,NULL);
//默認向下移動
dy=1;
dx=0;
5.同時我們也要通過按鍵來控制蛇的上、下、左、右和暫停
對於方向的移動,我們只需定義一個在本文件使用的全局變量
static int dy,dx;
case UP: if(dy==0)
dy=-1.dx=0;
moveSnake(SIGALRM);
DOWN --dy=1.dx=0;
LEFT --dy=0,dx=-1;
RIGHT --dy=0,dx=1;
要實現貪吃蛇的移動暫停,自然少不了之前的定時器了
void stopSnake(void)
{
struct itimerval zero={0},old;
int key;
setitimer(ITIMER_REAL,&zero,&old);
while(1)
{
key=getInput();
if(key==EXIT)
{
exit(0);
}
else if(key==STOP) break;
setimer(ITIMER_REAL,&old,NULL);
}
}
6.當蛇吃到食物後,蛇的身體如何增長,我用到了雙向鏈表(採取尾部追加的方式)
Snake_t *new,*tail=head.prev->prev;
new=malloc(sizeof(Snake_t));
if(new!=NULL)
{
new->dat=2;
new->y=tail->prev->y;
new->x=tail->prev->x;
new->next=tail;
new->prev=tail->prev;
new->next->prev=new;
new->prev->next=new;
}
蛇總是後面的部分跟隨前面部分的移動軌跡,所以我們還需要把前面的座標賦值給後面的(i->y=i->prev->y),
我們定義game[y][x]=0 ,打印空白,所以尾後給個0節點 用於移動時清除(new->data=0)。
7.判斷遊戲結束的條件:
a.當蛇碰到邊界時
if(first->y<=0||first->x<=0||first->y>=(ROW-1)||first->x>=(COL-1))
{
printf("Game Over");
exit(0);
}
b.當蛇吃到自己了
for(i=head.prev->prev;i!=first;i=i->prev)
{
if(first->y==i->y&& first->x==i->x)
{
printf("Game Over");
exit(0);
}
}
8.遊戲改進
<1>可以增加分數的累計,當分數達到多少就升級,用一個數組把10個升級速度
先保存好,再調用。
也可以通過文件操作的方式(fopen...),進行遊戲存檔與調用。
<2>可利用SDL庫,給遊戲增加音效和華麗界面。
<3>我們可以實現雙人對戰的貪吃蛇遊戲,在規定時間內,誰的蛇身最長爲勝利者
<4>在QT上面進行改進,實現多人同一局域網上共同遊戲,可以一直玩,兩蛇相撞恢復初始蛇身,
繼續遊戲,通過增加積分,來定義玩家等級。