




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、最近老有人問我那個(gè)俄羅斯方塊游戲的代碼,解釋了半天,覺得麻煩,干脆再做一個(gè)更簡單的小游戲,貪吃蛇,和俄羅斯方塊是一樣的思路,只不過游戲相對(duì)俄羅斯方塊來說簡單了很多,把這個(gè)小游戲給大伙講一下,希望對(duì)一些C#的初學(xué)者有幫助。游戲很簡單,通過WASD或上下左右?guī)讉€(gè)按鍵控制貪吃蛇的前進(jìn)方向,這個(gè)估計(jì)全世界都知道,先看一下游戲運(yùn)行效果吧其中黑色的事物,紅色是貪吃蛇,由于考慮到越簡單越好,就沒有追求過多的美化和修飾看一下程序結(jié)構(gòu)吧程序結(jié)構(gòu)很簡單,一個(gè)Form,兩個(gè)ClassFormMain是程序主界面,里面就一個(gè)PictureBox控件Block類是“蛇塊”類,我不知道怎么換個(gè)詞來描述,這個(gè)類就是用于描述
2、蛇身子一節(jié)一節(jié)的信息,從運(yùn)行效果圖上可以看到就是那一個(gè)一個(gè)小方塊的信息,等價(jià)于俄羅斯方塊里的磚塊信息類Palette類就是主畫布,是游戲的主要代碼,和俄羅斯方塊里的畫布是一樣的作用。從結(jié)構(gòu)上可以看出,整個(gè)工程很簡單,應(yīng)該還算比較好理解吧。下一篇給大伙從頭到尾的把整個(gè)工程重現(xiàn)一遍。呵呵,如果是高手的話,請(qǐng)勿見笑,初學(xué)者的話大可以“拿來主義”一下。上一篇我們簡單介紹了一下程序結(jié)構(gòu),接下來我們從頭到尾把整個(gè)游戲重現(xiàn)一下1.新建一個(gè)Windows 應(yīng)用程序,起名Snake吧2.重命名Form1,改為FormMain。這是我的個(gè)人偏好,不改也行。3.從工具欄里拖放一個(gè)picturebox到FormMai
3、n上面,設(shè)置屬性picturebox1的BorderStyle屬性選擇為FixedSingle,這樣能顯示邊框FormMain的KeyPreview屬性設(shè)定為True,這樣整個(gè)窗體可以響應(yīng)鍵盤按鍵事件,這個(gè)在俄羅斯方塊那個(gè)里面講過了設(shè)定完以后大概應(yīng)該是整個(gè)樣子需要補(bǔ)充一下的是,這里面form的大小和picturebox的大小是不用刻意設(shè)置的,因?yàn)槲覀兂绦蚶锩鏁?huì)根據(jù)設(shè)定貪吃蛇的大小和貪吃蛇的活動(dòng)空間自動(dòng)變大變小的,所以大致是整個(gè)樣子就行了。4.添加pictureBox1和FormMain的事件,添加的事件有picturesBox1的Paint事件pictureBox1_PaintFormMain
4、的KeyDown事件FormMain_KeyDownFormMain的Load事件FormMain_Load至于這三個(gè)事件是干什么用的,估計(jì)大家大致也能猜的到,pictureBox1_Paint用于更新游戲畫面,F(xiàn)ormMain_KeyDown用于響應(yīng)用戶按鍵,F(xiàn)ormMain_Load用于做一些初始化的工作添加完成以后代碼里應(yīng)該是這個(gè)樣子吧5.添加兩個(gè)類文件Block類和Palette類6.實(shí)現(xiàn)Block類Block類用于描述蛇塊信息,記錄每個(gè)蛇塊的坐標(biāo),顏色,以及大小這些信息,具體代碼如下這個(gè)類比較簡單,Point p用于記錄該蛇塊的“坐標(biāo)”,注意這里的坐標(biāo)不是真正的坐標(biāo),由于蛇塊是一個(gè)塊
5、,不是一個(gè)點(diǎn),這里記錄的是這個(gè)塊的坐標(biāo),比如,如果是Point(3,2),那么就是表示第四列,第三行的那個(gè)塊Paint函數(shù)根據(jù)坐標(biāo)以及蛇塊大小計(jì)算出實(shí)際繪圖的坐標(biāo),進(jìn)行繪圖,蛇塊是一個(gè)正方形(矩形),我們用矩形繪制,在代碼中我們看到,繪制的大小比size小1個(gè)像素,這么做的原因是為了突出蛇塊與蛇塊之間的間隙,也就是說蛇塊與蛇塊之間有1個(gè)像素的間隙,這就是我們看到游戲效果圖中的蛇塊是一段一段的原因7.Palette類的實(shí)現(xiàn)Palette類是真?zhèn)€游戲的核心處理類,里面定義了畫布的大小,背景色,蛇塊列表以及游戲速度,移動(dòng)方向等屬性另外還提供了timer計(jì)時(shí)器,用于定時(shí)更新蛇塊坐標(biāo)位置,以及如何在畫面
6、上畫圖的函數(shù),整個(gè)代碼如下從函數(shù)定義中我們可以大致了解一下這個(gè)類的功能以及實(shí)現(xiàn)方法了,類的屬性定義就不再細(xì)說了,這些都是很明顯的,接下來我們一步一步介紹各個(gè)函數(shù)的實(shí)現(xiàn)7.1 Start函數(shù)Start函數(shù)用于開始游戲,這個(gè)函數(shù)的內(nèi)部其實(shí)就是設(shè)定食物,以及觸發(fā)計(jì)時(shí)器。代碼片段如下:這里面定義了計(jì)時(shí)器的事件觸發(fā)間隔,是通過level然后找到speed數(shù)組里的對(duì)應(yīng)毫秒值設(shè)定的。然后觸發(fā)事件是OnBlockTimedEvent,這個(gè)函數(shù)后面再講。最后是啟動(dòng)計(jì)時(shí)器開始計(jì)時(shí)。7.2 OnBlockTimedEvent函數(shù)OnBlockTimedEvent函數(shù)是計(jì)時(shí)器的執(zhí)行函數(shù),這個(gè)函數(shù)用于更新蛇塊信息列表,
7、以及檢測(cè)游戲是否結(jié)束等等,代碼片段如下可以看到,函數(shù)內(nèi)部調(diào)用了兩個(gè)函數(shù),一個(gè)是Move函數(shù),一個(gè)是CheckDead函數(shù),從字面意思上我們就可以看出來是怎么個(gè)流程了。7.3 CheckDead函數(shù)checkDead函數(shù)用于檢測(cè)游戲是否結(jié)束,具體檢查規(guī)則如下檢測(cè)是否結(jié)束分兩種情況,一種是撞上邊界,即蛇頭坐標(biāo)超出畫布范圍,一種是蛇頭撞上了蛇身,也就是蛇頭的坐標(biāo)和蛇身的某個(gè)坐標(biāo)重合,通過for循環(huán)來檢查第二種情況7.4 Move函數(shù)Move函數(shù)用于更新整個(gè)蛇塊的坐標(biāo),我們前面通過將蛇塊信息放到ArrayList里來表示貪吃蛇的整個(gè)信息,其中根據(jù)下標(biāo)從0到Count-1依次表示各個(gè)蛇塊的信息,比如說,
8、ArrayList里現(xiàn)在依次是_blocks0 : Point(5,2)_blocks1 : Point(4,2)_blocks2 : Point(3,2)此時(shí)蛇塊的形狀如下假設(shè)現(xiàn)在蛇塊的移動(dòng)方向是向右,那么下一刻移動(dòng)以后的狀態(tài)應(yīng)該是這樣_blocks0 : Point(6,2)_blocks1 : Point(5,2)_blocks2 : Point(4,2)也就是和上圖相比,我們會(huì)發(fā)現(xiàn)其實(shí)就是蛇頭變成了一個(gè)新的蛇頭了,原來的舌頭變成是蛇身,原來的蛇尾沒有了,改成蛇尾前一個(gè)蛇塊了,所以通過這個(gè)分析我們可以得到如何移動(dòng)的解決方案,就是在ArrayList的0下標(biāo)處插入一個(gè)新的蛇塊(蛇頭),然后
9、把原來最后一個(gè)(Count-1)的那個(gè)蛇塊(蛇尾)去掉。代碼實(shí)現(xiàn)片段如下實(shí)際代碼中增加了吃食物的情況判斷,也就是說如果新蛇頭的坐標(biāo)和食物的坐標(biāo)一致,那么就不做刪除原蛇尾的操作了,這樣產(chǎn)生的效果就是蛇塊列表的長度增加了一個(gè),達(dá)到吃食物變長的效果,相信很好理解,我就不再作圖了。7.5 GetFood函數(shù)GetFood函數(shù)用于生成下一個(gè)食物,其實(shí)就是一個(gè)蛇塊,生成的規(guī)則就是,坐標(biāo)要在畫布范圍內(nèi),并且食物的坐標(biāo)不能和貪吃蛇的坐標(biāo)重合,具體代碼如下通過for循環(huán)檢查食物坐標(biāo)是否和貪吃蛇的蛇塊列表ArrayList里的蛇塊有沖突,很容易理解,就不多說了7.6 PaintPalette函數(shù)PaintPale
10、tte函數(shù)需要一個(gè)參數(shù),也就是繪圖句柄,然后在這個(gè)畫布上畫圖也就是我們看到的游戲效果首先用背景色清空畫布,然后畫食物,其次是通過for循環(huán)將貪吃蛇的每個(gè)蛇塊畫在畫布上,以此達(dá)到游戲效果。7.7 構(gòu)造函數(shù)呵呵,這個(gè)函數(shù)我以為沒東西,回頭看看,這個(gè)函數(shù)里面有一句話很重要,得說明一下構(gòu)造函數(shù)很簡單就是設(shè)定類屬性值,還有初始化蛇塊列表ArrayList,然后需要說明的是你得手動(dòng)生成一個(gè)蛇塊放到列表里面,否則連個(gè)蛇頭都沒有怎么玩啊。this._blocks.Insert(0, (new Block(Color.Red, this._size, new Point(width / 2, height /
11、2);這句話就是在畫布的正中央產(chǎn)生一個(gè)只有一節(jié)的貪吃蛇。至此貪吃蛇的核心代碼就算介紹完了貪吃蛇的靈魂已經(jīng)具有了,怎么讓這個(gè)貪吃蛇跑起來呢,下面看看主界面是怎么使用這個(gè)貪吃蛇的吧8. 主界面的實(shí)現(xiàn)在主界面的類里面定義個(gè)Paletteprivate Palette p;然后在page_load里實(shí)現(xiàn)初始化貪吃蛇代碼很簡單吧,呵呵,不多說了看下一個(gè)函數(shù)FormMain_KeyDown函數(shù),這個(gè)函數(shù)用于更改貪吃蛇的移動(dòng)方向,這里設(shè)定了wdsa和上下左右都可以使用,更改移動(dòng)方向的前提就是新的方向不能和當(dāng)前方向相反,也即是只能90度拐彎,不能180度拐彎。最后一個(gè)函數(shù)是pictureBox1_Paint函數(shù),這個(gè)事件在pictureBox1需要重新繪制的時(shí)候發(fā)生,這里面只
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 生態(tài)保護(hù)與書畫藝術(shù)創(chuàng)作考核試卷
- 藝術(shù)品市場(chǎng)規(guī)范考核試卷
- 航班機(jī)組人員溝通技巧考核試卷
- 花卉畫法的分類與特點(diǎn)考核試卷
- 一次函數(shù)應(yīng)用舉例教學(xué)課件
- 共建文明社區(qū)共享和諧生活:課件教程
- 中國古代教育長善救失
- 2019-2025年咨詢工程師之工程項(xiàng)目組織與管理能力提升試卷B卷附答案
- 2025年投資項(xiàng)目管理師之投資建設(shè)項(xiàng)目決策真題練習(xí)試卷A卷附答案
- 扈中平現(xiàn)代教育改革理論與實(shí)踐
- 創(chuàng)造心智與創(chuàng)新訓(xùn)練智慧樹知到期末考試答案2024年
- 創(chuàng)傷性前房積血
- 供水企業(yè)安全生產(chǎn)培訓(xùn)課件
- 2024年《大學(xué)語文》期末考試復(fù)習(xí)題庫(含答案)
- 早產(chǎn)的護(hù)理查房課件
- 國家智慧教育平臺(tái)培訓(xùn)課件
- 針灸科出科個(gè)人小結(jié)
- 語感與語言習(xí)得-【中職專用】高一語文同步課件(高教版2023·基礎(chǔ)模塊上冊(cè))
- 2024年中國石化集團(tuán)資本有限公司招聘筆試參考題庫含答案解析
- 普通高中地理課程標(biāo)準(zhǔn)(2023年版)
- 檢驗(yàn)批劃分方案14
評(píng)論
0/150
提交評(píng)論