c#貪吃蛇實現(xiàn)完整流程_第1頁
c#貪吃蛇實現(xiàn)完整流程_第2頁
c#貪吃蛇實現(xiàn)完整流程_第3頁
c#貪吃蛇實現(xiàn)完整流程_第4頁
c#貪吃蛇實現(xiàn)完整流程_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、最近老有人問我那個俄羅斯方塊游戲的代碼,解釋了半天,覺得麻煩,干脆再做一個更簡單的小游戲,貪吃蛇,和俄羅斯方塊是一樣的思路,只不過游戲相對俄羅斯方塊來說簡單了很多,把這個小游戲給大伙講一下,希望對一些C#的初學(xué)者有幫助。游戲很簡單,通過WASD或上下左右?guī)讉€按鍵控制貪吃蛇的前進方向,這個估計全世界都知道,先看一下游戲運行效果吧其中黑色的事物,紅色是貪吃蛇,由于考慮到越簡單越好,就沒有追求過多的美化和修飾看一下程序結(jié)構(gòu)吧程序結(jié)構(gòu)很簡單,一個Form,兩個ClassFormMain是程序主界面,里面就一個PictureBox控件Block類是“蛇塊”類,我不知道怎么換個詞來描述,這個類就是用于描述

2、蛇身子一節(jié)一節(jié)的信息,從運行效果圖上可以看到就是那一個一個小方塊的信息,等價于俄羅斯方塊里的磚塊信息類Palette類就是主畫布,是游戲的主要代碼,和俄羅斯方塊里的畫布是一樣的作用。從結(jié)構(gòu)上可以看出,整個工程很簡單,應(yīng)該還算比較好理解吧。下一篇給大伙從頭到尾的把整個工程重現(xiàn)一遍。呵呵,如果是高手的話,請勿見笑,初學(xué)者的話大可以“拿來主義”一下。上一篇我們簡單介紹了一下程序結(jié)構(gòu),接下來我們從頭到尾把整個游戲重現(xiàn)一下1.新建一個Windows 應(yīng)用程序,起名Snake吧2.重命名Form1,改為FormMain。這是我的個人偏好,不改也行。3.從工具欄里拖放一個picturebox到FormMai

3、n上面,設(shè)置屬性picturebox1的BorderStyle屬性選擇為FixedSingle,這樣能顯示邊框FormMain的KeyPreview屬性設(shè)定為True,這樣整個窗體可以響應(yīng)鍵盤按鍵事件,這個在俄羅斯方塊那個里面講過了設(shè)定完以后大概應(yīng)該是整個樣子需要補充一下的是,這里面form的大小和picturebox的大小是不用刻意設(shè)置的,因為我們程序里面會根據(jù)設(shè)定貪吃蛇的大小和貪吃蛇的活動空間自動變大變小的,所以大致是整個樣子就行了。4.添加pictureBox1和FormMain的事件,添加的事件有picturesBox1的Paint事件pictureBox1_PaintFormMain

4、的KeyDown事件FormMain_KeyDownFormMain的Load事件FormMain_Load至于這三個事件是干什么用的,估計大家大致也能猜的到,pictureBox1_Paint用于更新游戲畫面,F(xiàn)ormMain_KeyDown用于響應(yīng)用戶按鍵,F(xiàn)ormMain_Load用于做一些初始化的工作添加完成以后代碼里應(yīng)該是這個樣子吧5.添加兩個類文件Block類和Palette類6.實現(xiàn)Block類Block類用于描述蛇塊信息,記錄每個蛇塊的坐標,顏色,以及大小這些信息,具體代碼如下這個類比較簡單,Point p用于記錄該蛇塊的“坐標”,注意這里的坐標不是真正的坐標,由于蛇塊是一個塊

5、,不是一個點,這里記錄的是這個塊的坐標,比如,如果是Point(3,2),那么就是表示第四列,第三行的那個塊Paint函數(shù)根據(jù)坐標以及蛇塊大小計算出實際繪圖的坐標,進行繪圖,蛇塊是一個正方形(矩形),我們用矩形繪制,在代碼中我們看到,繪制的大小比size小1個像素,這么做的原因是為了突出蛇塊與蛇塊之間的間隙,也就是說蛇塊與蛇塊之間有1個像素的間隙,這就是我們看到游戲效果圖中的蛇塊是一段一段的原因7.Palette類的實現(xiàn)Palette類是真?zhèn)€游戲的核心處理類,里面定義了畫布的大小,背景色,蛇塊列表以及游戲速度,移動方向等屬性另外還提供了timer計時器,用于定時更新蛇塊坐標位置,以及如何在畫面

6、上畫圖的函數(shù),整個代碼如下從函數(shù)定義中我們可以大致了解一下這個類的功能以及實現(xiàn)方法了,類的屬性定義就不再細說了,這些都是很明顯的,接下來我們一步一步介紹各個函數(shù)的實現(xiàn)7.1 Start函數(shù)Start函數(shù)用于開始游戲,這個函數(shù)的內(nèi)部其實就是設(shè)定食物,以及觸發(fā)計時器。代碼片段如下:這里面定義了計時器的事件觸發(fā)間隔,是通過level然后找到speed數(shù)組里的對應(yīng)毫秒值設(shè)定的。然后觸發(fā)事件是OnBlockTimedEvent,這個函數(shù)后面再講。最后是啟動計時器開始計時。7.2 OnBlockTimedEvent函數(shù)OnBlockTimedEvent函數(shù)是計時器的執(zhí)行函數(shù),這個函數(shù)用于更新蛇塊信息列表,

7、以及檢測游戲是否結(jié)束等等,代碼片段如下可以看到,函數(shù)內(nèi)部調(diào)用了兩個函數(shù),一個是Move函數(shù),一個是CheckDead函數(shù),從字面意思上我們就可以看出來是怎么個流程了。7.3 CheckDead函數(shù)checkDead函數(shù)用于檢測游戲是否結(jié)束,具體檢查規(guī)則如下檢測是否結(jié)束分兩種情況,一種是撞上邊界,即蛇頭坐標超出畫布范圍,一種是蛇頭撞上了蛇身,也就是蛇頭的坐標和蛇身的某個坐標重合,通過for循環(huán)來檢查第二種情況7.4 Move函數(shù)Move函數(shù)用于更新整個蛇塊的坐標,我們前面通過將蛇塊信息放到ArrayList里來表示貪吃蛇的整個信息,其中根據(jù)下標從0到Count-1依次表示各個蛇塊的信息,比如說,

8、ArrayList里現(xiàn)在依次是_blocks0 : Point(5,2)_blocks1 : Point(4,2)_blocks2 : Point(3,2)此時蛇塊的形狀如下假設(shè)現(xiàn)在蛇塊的移動方向是向右,那么下一刻移動以后的狀態(tài)應(yīng)該是這樣_blocks0 : Point(6,2)_blocks1 : Point(5,2)_blocks2 : Point(4,2)也就是和上圖相比,我們會發(fā)現(xiàn)其實就是蛇頭變成了一個新的蛇頭了,原來的舌頭變成是蛇身,原來的蛇尾沒有了,改成蛇尾前一個蛇塊了,所以通過這個分析我們可以得到如何移動的解決方案,就是在ArrayList的0下標處插入一個新的蛇塊(蛇頭),然后

9、把原來最后一個(Count-1)的那個蛇塊(蛇尾)去掉。代碼實現(xiàn)片段如下實際代碼中增加了吃食物的情況判斷,也就是說如果新蛇頭的坐標和食物的坐標一致,那么就不做刪除原蛇尾的操作了,這樣產(chǎn)生的效果就是蛇塊列表的長度增加了一個,達到吃食物變長的效果,相信很好理解,我就不再作圖了。7.5 GetFood函數(shù)GetFood函數(shù)用于生成下一個食物,其實就是一個蛇塊,生成的規(guī)則就是,坐標要在畫布范圍內(nèi),并且食物的坐標不能和貪吃蛇的坐標重合,具體代碼如下通過for循環(huán)檢查食物坐標是否和貪吃蛇的蛇塊列表ArrayList里的蛇塊有沖突,很容易理解,就不多說了7.6 PaintPalette函數(shù)PaintPale

10、tte函數(shù)需要一個參數(shù),也就是繪圖句柄,然后在這個畫布上畫圖也就是我們看到的游戲效果首先用背景色清空畫布,然后畫食物,其次是通過for循環(huán)將貪吃蛇的每個蛇塊畫在畫布上,以此達到游戲效果。7.7 構(gòu)造函數(shù)呵呵,這個函數(shù)我以為沒東西,回頭看看,這個函數(shù)里面有一句話很重要,得說明一下構(gòu)造函數(shù)很簡單就是設(shè)定類屬性值,還有初始化蛇塊列表ArrayList,然后需要說明的是你得手動生成一個蛇塊放到列表里面,否則連個蛇頭都沒有怎么玩啊。this._blocks.Insert(0, (new Block(Color.Red, this._size, new Point(width / 2, height /

11、2);這句話就是在畫布的正中央產(chǎn)生一個只有一節(jié)的貪吃蛇。至此貪吃蛇的核心代碼就算介紹完了貪吃蛇的靈魂已經(jīng)具有了,怎么讓這個貪吃蛇跑起來呢,下面看看主界面是怎么使用這個貪吃蛇的吧8. 主界面的實現(xiàn)在主界面的類里面定義個Paletteprivate Palette p;然后在page_load里實現(xiàn)初始化貪吃蛇代碼很簡單吧,呵呵,不多說了看下一個函數(shù)FormMain_KeyDown函數(shù),這個函數(shù)用于更改貪吃蛇的移動方向,這里設(shè)定了wdsa和上下左右都可以使用,更改移動方向的前提就是新的方向不能和當前方向相反,也即是只能90度拐彎,不能180度拐彎。最后一個函數(shù)是pictureBox1_Paint函數(shù),這個事件在pictureBox1需要重新繪制的時候發(fā)生,這里面只

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論