-
1 # 科技球
-
2 # nadesico19
回到2010年前後,百度貼吧尚未開始全面商業運作。那時候的c語言吧,可謂是人才濟濟,不要說貪吃蛇,就連俄羅斯方塊也能被炮姐搞進100行以內。當然,炮姐程式碼OI風比較重,即便貼出來也未必幾人能看明白。
鄙人曾有幸經歷那個年代,並也曾任過一屆大吧主,任期直到百度賣吧事件。看到這題主這個問題,著實讓我勾起了對那個年代的深切懷念。於是今晚久違的用純C寫了一段98行可讀版控制檯貪吃蛇。雖然用了Windows Console API,不過編譯卻是mingw64+gcc9.2,不保證msvc能用。
-
3 # 風中的棍子
記得很早有幾個牛人應該行吧?好久沒寫了,現在連基本的忘光了,當年堅持下來的都禿了,我尚有大半可在風中飄逸。
-
4 # 浪跡天涯adc
100行程式碼啥也幹不了,一個簡單網頁都不只100行程式碼。貪吃蛇雖然看起來簡單,但是也要建立遊戲畫面,匯入素材圖片,計算資料,判斷狀態,定位,操作實現等等,邏輯沒那麼簡單。平時看到的幾行程式碼實現的小遊戲,特效等,那是匯入的框架,就如同組裝電腦一樣,並不是只用那幾行程式碼就可以實現。
-
5 # 紅袖法師
用C語言是可以實現的,如果是調取一些API介面的話,是有可能實現的,但如果是完全獨立去寫的話,難度會很大,關鍵是演算法設計。
如果是完全獨立開發,這個貪吃蛇遊戲的控制方案可以這麼弄,一種是直接捕捉鍵盤中四個按鍵,另外一種是用自定義指令來控制即可。
貪吃蛇遊戲和其他電子遊戲一樣,存在一個遊戲主迴圈機制,利用for之類的函式建立一個無限迴圈,巢狀一個延時函式作為迴圈時鐘即可完成最簡單的主迴圈方案。當然,新建一個執行緒也是可以的,不過程式碼行數要控制好。
接下來就是生成一個遊戲地圖,這裡只要固定好x和y軸大小,在控制檯程式下生成一個由字串組成的矩陣容器,貪吃蛇吃的豆子用隨機函式在地圖空白區域內隨機生成即可。
最後就是蛇了,這條蛇首先要初始化長度,每吃一個豆子累加增長一節,同事要注意判斷撞牆和撞自己的演算法即可。
不過這裡最難的地方還是繪製這條蛇,蛇的移動速度由之前設定好的時鐘控制,但蛇移動方向則由按鍵對映或自定義指令控制,這裡不難理解,關鍵是在蛇移動時在這個矩陣容器中的顯示,這裡需要寫一組演算法來實現,可以百度上找資料做參考,自己寫的話還是有一定難度的,關鍵是這個演算法的程式碼還要足夠精煉,不然分分鐘超100行。
包括上述的內容也是一樣的,如果程式碼不夠精煉,同樣很容易超過100行,而且別忘記,C語言開頭寫入的標頭檔案、預處理等這部分程式碼是會佔用很多行的,包括主函式本身就能佔用掉最少一行位置,所以100行寫貪吃蛇難度還是很大的。
不過有一個最粗暴簡單的壓縮程式碼方法,那就是直接不要任何可視的圖形介面,全部採用純字元顯示遊戲內容和遊戲狀態。就比如不顯示地圖和蛇,只提供一組蛇頭實時移動座標、蛇身長度資訊、蛇身佔用位置座標、矩形地圖的四個角落座標、豆子座標、得分資訊等等。我相信這樣寫,100行難度會低很多
-
6 # LittleShadow
如果只實現貪吃蛇的邏輯,頁面很簡潔的話 差不多 一百多行就能寫完,主要考慮蛇的移動方式和撞牆,吃果子的判定,以及控制檯指令的判斷。蛇的資料結構的話選擇陣列就行,將寫好的函式放到一個while()迴圈裡,每一次都判定蛇的長度,位置,是否撞牆,是否吃到自己,是否吃到果子,蛇的運動方向。可以加一個sleep函式延時。進階一點的話 可以用廣度優先搜尋演算法和貪心演算法寫一個自動的貪吃蛇,再進階一點可以透過 神經網路寫一個自動學習走法的貪吃蛇。
我大一剛學完 c的時候寫了個貪吃蛇 差不多一百·五十行,不過是用黑方框呈現的。
-
7 # Ren
本科大二還是大三的時候在89C51上做過Loader,可以把CF卡上的BIN檔案呼叫到62256裡,再切換片選、復位,執行BIN檔案,程式退出之後再切換片選、復位,回到51片內的Loader裡。當時做的BIN檔案一個是貪食蛇,一個是播放CF卡中WAV檔案的播放器,還有一個是啥忘記了,顯示用的是沒字型檔的12864,音訊用DAC0832。
當時拿這個混了個學院微控制器競賽一等獎,證書一張,沒有獎金。那時候玩得是真起勁,也是真燒錢,晶片、制板都貴的要死,一片89C52就要20、30,一片62256好像50多,一片12864將近100,一個月補助才40,一個月家裡給800,生活費極其緊張,窮得叮噹亂響。
-
8 # zzkk9977
一個int型二維陣列地圖,0設定為空地圖元素,-1設為牆壁元素,然後蛇身頭部元素為1,往後每節加1,每次新增一節身體就遍歷二維陣列把大於0的元素都++,然後在食物位置改變對應陣列位置元素為1,碰撞邏輯就只需要預判下一幀的頭部元素位置是否為0即可。
-
9 # 搞笑快樂與你分享
程式設計首先要熟悉程式設計,然後對自己的需求進行分析,根據自己掌握的知識用最簡單的程式碼完成。最有效率最簡單的,如果一直問別人自己將學不到程式設計的精髓。
-
10 # 迷人的呆子
我覺得提這個問題的人可能對寫程式碼是有誤解的,一行程式碼能幹多少事,與這行程式碼背後的故事有很大關係。現在寫程式碼的人大多數用的是高階語言,像c這種語言用的相對要少的多了。但c並不是最底層的,C地下還有彙編,即使彙編底下還有打孔紙帶呢。
我們編碼都是在前人的基礎上,進行二次加工,套用牛老爵爺的話:“站在巨人的肩膀上”。想想再過N年以後,口述內容也可以被正常解析的ai時代,你說一句話能做些什麼?
回覆列表
恕我直言貪吃蛇這個遊戲雖小但涉及的方面還是不少的,想要做一個完整的貪吃蛇100行應該不好實現。
建議樓主試試這個。
#include<stdio.h>
#include<time.h>
#include<windows.h>
#include<stdlib.h>
#define U 1
#define D 2
#define L 3
#define R 4 //蛇的狀態,U:上 ;D:下;L:左 R:右
typedef struct SNAKE //蛇身的一個節點
{
int x;
int y;
struct SNAKE *next;
}snake;
//全域性變數//
int score=0,add=10;//總得分與每次吃食物得分。
int status,sleeptime=200;//每次執行的時間間隔
snake *head, *food;//蛇頭指標,食物指標
snake *q;//遍歷蛇的時候用到的指標
int endgamestatus=0; //遊戲結束的情況,1:撞到牆;2:咬到自己;3:主動退出遊戲。
//宣告全部函式//
void Pos();
void creatMap();
void initsnake();
int biteself();
void createfood();
void cantcrosswall();
void snakemove();
void pause();
void gamecircle();
void welcometogame();
void endgame();
void gamestart();
void Pos(int x,int y)//設定游標位置
{
COORD pos;
HANDLE hOutput;
pos.X=x;
pos.Y=y;
hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOutput,pos);
}
void creatMap()//建立地圖
{
int i;
for(i=0;i<58;i+=2)//列印上下邊框
{
Pos(i,0);
Pos(i,26);
}
for(i=1;i<26;i++)//列印左右邊框
{
Pos(0,i);
Pos(56,i);
}
}
void initsnake()//初始化蛇身
{
snake *tail;
int i;
tail=(snake*)malloc(sizeof(snake));//從蛇尾開始,頭插法,以x,y設定開始的位置//
tail->x=24;
tail->y=5;
tail->next=NULL;
for(i=1;i<=4;i++)
{
head=(snake*)malloc(sizeof(snake));
head->next=tail;
head->x=24+2*i;
head->y=5;
tail=head;
}
while(tail!=NULL)//從頭到為,輸出蛇身
{
Pos(tail->x,tail->y);
tail=tail->next;
}
}
int biteself()//判斷是否咬到了自己
{
snake *self;
self=head->next;
while(self!=NULL)
{
if(self->x==head->x && self->y==head->y)
{
return 1;
}
self=self->next;
}
return 0;
}
void createfood()//隨機出現食物
{
snake *food_1;
srand((unsigned)time(NULL));
food_1=(snake*)malloc(sizeof(snake));
while((food_1->x%2)!=0) //保證其為偶數,使得食物能與蛇頭對其
{
food_1->x=rand()%52+2;
}
food_1->y=rand()%24+1;
q=head;
while(q->next==NULL)
{
if(q->x==food_1->x && q->y==food_1->y) //判斷蛇身是否與食物重合
{
free(food_1);
createfood();
}
q=q->next;
}
Pos(food_1->x,food_1->y);
food=food_1;
}
void cantcrosswall()//不能穿牆
{
if(head->x==0 || head->x==56 ||head->y==0 || head->y==26)
{
endgamestatus=1;
endgame();
}
}
void snakemove()//蛇前進,上U,下D,左L,右R
{
snake * nexthead;
cantcrosswall();
nexthead=(snake*)malloc(sizeof(snake));
if(status==U)
{
nexthead->x=head->x;
nexthead->y=head->y-1;
if(nexthead->x==food->x && nexthead->y==food->y)//如果下一個有食物//
{
nexthead->next=head;
head=nexthead;
q=head;
while(q!=NULL)
{
Pos(q->x,q->y);
q=q->next;
}
score=score+add;
createfood();
}
else //如果沒有食物//
{
nexthead->next=head;
head=nexthead;
q=head;
while(q->next->next!=NULL)
{
Pos(q->x,q->y);
q=q->next;
}
Pos(q->next->x,q->next->y);
printf(" ");
free(q->next);
q->next=NULL;
}
}
if(status==D)
{
nexthead->x=head->x;
nexthead->y=head->y+1;
if(nexthead->x==food->x && nexthead->y==food->y) //有食物
{
nexthead->next=head;
head=nexthead;
q=head;
while(q!=NULL)
{
Pos(q->x,q->y);
q=q->next;
}
score=score+add;
createfood();
}
else //沒有食物
{
nexthead->next=head;
head=nexthead;
q=head;
while(q->next->next!=NULL)
{
Pos(q->x,q->y);
q=q->next;
}
Pos(q->next->x,q->next->y);
printf(" ");
free(q->next);
q->next=NULL;
}
}
if(status==L)
{
nexthead->x=head->x-2;
nexthead->y=head->y;
if(nexthead->x==food->x && nexthead->y==food->y)//有食物
{
nexthead->next=head;
head=nexthead;
q=head;
while(q!=NULL)
{
Pos(q->x,q->y);
q=q->next;
}
score=score+add;
createfood();
}
else //沒有食物
{
nexthead->next=head;
head=nexthead;
q=head;
while(q->next->next!=NULL)
{
Pos(q->x,q->y);
q=q->next;
}
Pos(q->next->x,q->next->y);
printf(" ");
free(q->next);
q->next=NULL;
}
}
if(status==R)
{
nexthead->x=head->x+2;
nexthead->y=head->y;
if(nexthead->x==food->x && nexthead->y==food->y)//有食物
{
nexthead->next=head;
head=nexthead;
q=head;
while(q!=NULL)
{
Pos(q->x,q->y);
q=q->next;
}
score=score+add;
createfood();
}
else //沒有食物
{
nexthead