C語言學習筆記 XII 貪吃蛇

2021-08-15 15:10:17 字數 2039 閱讀 3109

放假之後一直沒有什麼學習的動力,得了一學習就困得不行的病。覺得不能再這樣下去了,剛好有個學c++的朋友要自己寫個貪吃蛇,於是拿到了c++不完整框架,改寫並重構成c的**了。

一開始我拿到的**有了地圖生成和重新整理的部分,但蛇的移動演算法有缺陷,無論怎麼改都會有bug。

他最初的想法是找到頭部和尾部,頭部移動後身體不移動,尾部往前收一節。吃到果實的時候,頭尾都不動,長度加一,頭部更新為果實座標。但當尾部周圍多個方向都有身體的時候,就很難找到尾部。

當初我確實很驚訝,因為在我的意識裡,貪吃蛇好像是要維護整條蛇的。。。

一通胡亂分析之後,我們倆各自給出了不同的方案:

朋友的方案:原先頭尾和身體都是以『1』來標記的,現在把第n步時頭部位置標記為『n+1』,那麼尾部肯定是最小的數,找起來就會很方便。

我的方案:維護整條蛇好像不太好寫,但分析一通可以知道,尾部是頭部動作的延時。也就是說,只要記錄下頭部的動作,尾部一定會按照這個順序移動,只不過會晚一點。所以只要維護乙個記錄頭部運動的陣列就可以確定尾部的運動了。

我沒有拿到朋友的**,就只貼c的了。

好像有的時候還是會有bug,但苦於碼力不足,修改無力了。

//

// main.c

// snake

//// created by passer_by_a on 2018/2/3.

//#include

#include

#include

int ss[100]=;//記錄頭部移動

int o=0,a=0;//記錄尾部進度

int l=0;//記錄是否吃到了果實

typedef

struct ans;

int over=0;//遊戲是否結束

void mapmade(int

map[12])

i=0;

while(map[i][j]!=0)

map[i][j]=9;//產生新果實

}void print(int

map[12])

putchar('\n');

}}ans smove(int*head,int*end,int

map[12],char step)

else

if(*(head-12)==9)//吃到果實,下同

l++;

head=head-12;//更新頭部位置

*head=1;

}break;

}/*左移*/

case

'a':

else

if(*(head-1)==9)

l++;

head=head-1;

*head=1;

}break;

}/*下移*/

case

's':

else

if(*(head+12)==9)

l++;

head=head+12;

*head=1;

}break;

}/*右移*/

case

'd':

else

if(*(head+1)==9) l++;

head=head+1;

*head=1;

}break;}}

an.h=head;

an.e=end;

return an;//返回當前首尾位置

}int main() ;

ans move;//接收返回值

map[6][6]=1;//蛇的起始位置

char step;

int*head=&map[6][6];

static

int*end;

end=&map[6][6];

mapmade(map);

while(over==0)

}return

0;}

貪吃蛇學習筆記 C

事情是這樣的,我上的大學裡有個和微軟合作的俱樂部,面向大一招新的時候我去參加了一面,面試完acm組又去了一下game組,結果就讓我寫乙個貪吃蛇作為二面前的任務。這我也沒寫過啊,就只好搜了一下別人的源 學習學習。我從這裡找的源 但真正的作者是這位。一百多行的 看下來,確實是學到了不少。首先是整體的演算...

C語言貪吃蛇

include include include include include include define screen width 40 遊戲螢幕寬度 define screen length 15 遊戲螢幕長度 define start x 16 螢幕起始x座標 define start y ...

C語言 貪吃蛇

include include include define framewidght 22 define frameheight 22 short generaterandnumber short a,short b void posconsolecursor short x,short y voi...