回覆列表
  • 1 # 科技球

    恕我直言貪吃蛇這個遊戲雖小但涉及的方面還是不少的,想要做一個完整的貪吃蛇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

  • 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時代,你說一句話能做些什麼?

  • 中秋節和大豐收的關聯?
  • GLC、X3、Q5、XC60、RX選哪個好?