第二章教程16 貪吃蛇

2021-10-04 06:15:00 字數 2534 閱讀 6375

見一葉落,而知三秋至。

雖然還處於能夠把控的狀態,但現在的map.cpp**結構已經越來越複雜,物件之間的知識和責任鏈也越來越不清晰。開發組小q計畫對**再做一次重構。

但還沒等理出頭緒,小pa卻提出了新的需求:用現在的遊戲機制,能實現貪吃蛇麼?開發組的負責人小q思考了一下表示:做一定的擴充套件之後能夠實現。

小pa於是高興地回去準備地圖了。

貪吃蛇還有地圖麼?不過先不管地圖的事,看一看為了實現貪吃蛇的功能,現在遊戲機制還需做哪些調整。

首先,必須引入乙個新的鍵盤檢測函式,getch()函式能夠直接響應任意鍵,但畢竟是阻塞函式。意思是當程式執行到這裡後,就會暫停,等待使用者的輸入。

對於現階段的迷宮遊戲來說,這樣的功能已經足夠了。但貪吃蛇不行,必須在使用者不按鍵盤時,仍然保持移動。這就必須引入kbhit()函式,這個函式的作用是檢測鍵盤,如果發現使用者有按下鍵盤,再呼叫getch()獲得所按的鍵,否則可以執行其他**,比如蛇的移動。加上kbhit()後,由於處理rpg和貪吃蛇的鍵盤控制邏輯有明顯的不同,所以將具體處理邏輯拆分成兩個函式。增加乙個地圖的模式屬性(mode)對地圖做乙個區分,究竟是rpg地圖,還是貪吃蛇地圖。新的鍵盤監聽函式,源**如下。

void listen() else 

} else else }}

}

其實rgp遊戲中,我們看到會自己走動的npc,也必須依靠kbhit()函式才能實現。在這裡預留了將來處理npc自由行動的位置。具體handlekeysnake和autosnake兩個函式具體做了什麼,讓我們先看乙個關鍵問題:現在的英雄怎樣顯示和隱藏。

以前的英雄只有乙個字元,所以它的當前位置只需x,y兩個變數來記錄。現在變成一條蛇(或者在rpg遊戲中被稱作「火車」模式),蛇身上有很多位置,每個都必須記錄。在不斷增加記錄頭部位置的同時,還需刪除尾部的記錄。這種操作邏輯,比較自然地讓我們相對「佇列」這樣一種資料結構。

所謂佇列結構,與真實的排隊是相似。它的特點用一句話概括就是先進先出。蛇的長度就是隊的長度,蛇頭就是佇列尾,新的資料不斷增加到佇列尾;而蛇尾恰恰是佇列頭,就的資料從這裡刪除,並同時從螢幕上消除。

標準的佇列有三個函式來實現這一功能:

由於**比較分散,我們只看其中重點的幾段**:

void autosnake()

}

這裡值得注意的是gettickcount函式,獲取當前的毫秒數。用當前毫秒數與上次毫秒數之差實現每200毫秒移動一次。

移動控制的主邏輯**在trysnake

void trysnake(int dx, int dy) else  

}

生成新糖果的**:

void newsugar(string aeaten)

// 移動糖果

int x1= rand()%(currentmap.w/2- 2)* 2+ 2;

int y1= rand()%(currentmap.h- 3)+ 1;

event evt1;

evt1=;

//cout << evt1.gettriggertext() << endl;

eventlist.insert(make_pair(evt1.gettriggertext(), evt1));

showsugar(x1, y1);                  

}

這裡值得注意的是怎樣產生乙個隨機的位置。

函式rand()可以產生乙個0~rand_max的隨機數,我們知道rand_max是乙個很大的數字就好了。

我們現在希望這個數字出現在乙個範圍內,具體來說,橫座標在2到地圖寬度範圍內,縱座標在1到地圖高度內。

我們使用求餘數(%)的機制來實現區間隨機數的獲取。

一般地說,如果想獲取從a到b之間的隨機數(包含a與b,a很快小pa拿來了她設計的新地圖,不但加了貪吃蛇地圖,還加了乙個兩個遊戲的總入口。

小pa的興趣很高,看她現在的狀態,還打算設計更多的遊戲模式。

但開發組小q可是越來越鬱悶了,為了實現貪吃蛇的功能,原本已經不甚清晰的**結構,現在更是雪上加霜。

但小q還是努力又增加了最後乙個功能。由於現在的地圖大小差別很大,以前固定大小的控制台視窗有時會導致顯示上的混亂。於是在載入地圖的函式中,增加了根據當前地圖的大小,來設定控制台視窗大小的功能。

void setconsolesize(int w, int h)
這個函式本當是放在tools.cpp之中,但小q為了省事,隨手把它放在了map.cpp中。從一件小事,可以看到開發人員的心態一件發生了改變。

現在的貪吃蛇遊戲邏輯,還存在有幾個很明顯的問題。

這些問題都能解決,但會導致現有系統架構更加混亂。

如果這樣走下去,不知道是問題先解決掉,還是開發人員先逃離。

C 貪吃蛇二

小菜學習winform 一 貪吃蛇 說到oo可能一說一大堆,這裡面小菜只是簡單的把貪吃蛇抽象出來,先來說蛇,具有的屬性和行為,屬性比如蛇的長度 蛇的寬度 蛇的行動方向等 行為比如是否吃到食物 是否撞牆等,那我們可以抽象乙個蛇的類,這樣實現 1 using system 2using system.c...

第二次作業貪吃蛇

1 學號2017 7094 psp2.1 我的估計 實際情況 計畫這個任務的時間 20min 25min 分析需求 25min 20min 生成設計文件 30min 30min 設計複審 50min 60min 規範 15min 30min 編碼180min 300min 測試30min 60min...

Day16 GUI程式設計 貪吃蛇

鍵盤監聽 thread 定時器 定義資料 畫東西監聽事件 鍵盤事件 啟動類public class startgame 面板類 public class gamepanel extends jpanel implements keylistener actionlistener 初始化方法 publ...