放假之後一直沒有什麼學習的動力,得了一學習就困得不行的病。覺得不能再這樣下去了,剛好有個學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...