商利華
(無錫城市職業技術學院,江蘇 無錫 214153)
C#版貪吃蛇游戲的設計與實現
商利華
(無錫城市職業技術學院,江蘇 無錫 214153)
本文基于C#開發環境,開發了一個界面美觀、操作簡單、功能更為齊全的貪吃蛇游戲。整個游戲包括單人游戲、聯機對戰、地圖選擇、音效播放等功能。通過本游戲的開發,達到學習C#技術和熟悉軟件開發流程的目的。
貪吃蛇;C#;GDI+
貪吃蛇是一款經典的小游戲。游戲規則是玩家使用方向鍵操控一條長長的蛇不斷吞下金蛋,同時蛇身隨著吞下的金蛋不斷變長,當蛇頭撞到蛇身或者蛇身撞壁時則游戲結束,如圖1所示。

圖1 蛇身及貪吃蛇游戲界面
貪吃蛇的核心算法是如何實現移動和吃掉道具,從而解決蛇身移動、吃到道具后身體增長、減短、反向、減速、撞墻、死亡等問題,并且能夠隨時暫?;蜷_始游戲。程序的關鍵是表示蛇的圖形以及蛇的移動。本游戲用一個小矩形表示蛇的一節身體,身體每長一節,增加一個矩形塊,蛇頭用兩節表示。移動時必須從蛇頭開始,所以蛇不能向相反方向移動,也就是蛇尾不能改作蛇頭。如果不按任何鍵,蛇自行在當前方向上前移,當游戲者按了有效的方向鍵后,蛇頭朝著指定的方向移動,一步移動一節身體,所以當按了有效的方向鍵后,先確定蛇頭的位置,然后蛇身體隨著蛇頭移動,圖形的實現是從蛇頭的新位置開始畫出蛇。食物的出現和消失也是畫矩形塊和覆蓋矩形塊。
本游戲主要設計了snakeClass和snakeFood兩個類。snakeClass是模型類,有長度、顏色、速度、方向、狀態等屬性,有蛇的移動snakeMove()、蛇的碰撞判斷SnakeCollide()、蛇吃道具SnakeEatFood()等方法;snakeFood是食物道具類,其基本屬性包括位置及狀態,主要方法為道具的新建foodCreate()過程。道具的位置是隨機的,蛇頭每次觸碰到道具,蛇身在加長的同時成績加分數,這樣累加,直到游戲結束,在顯示結果的文本框內顯示玩家最終的成績[1]。
游戲的開始、結束、暫停以及加分功能均在窗體的代碼事件中完成定義過程。開始是由用戶通過單擊命令按鈕實現的;游戲過程中的任意時刻玩家只要按下空格鍵均可進行游戲的暫停狀態,再次按下空格游戲繼續進行;另外每吃掉一個道具,玩家的總成績會加分,最終可以在文本框控件內累積出當前玩家的最高分。
本游戲在繼承傳統同類游戲規則的基礎上,添加了地圖選擇、地圖解鎖、雙人游戲、鼠標特效等功能,游戲規則包括蛇的運動范圍、蛇的生命周期、分數統計、關卡判斷,具體設計如下:
地圖:蛇的運動范圍是一個地圖,蛇運動的地圖抽象成為一個40*40的二維整形數組,每個數組值代表一個小方塊的坐標值,這樣,蛇只能在規定好的二維數組內運動。當蛇遇到數組左右邊界值時,宣告蛇生命周期結束,貪吃蛇死亡。
蛇的生命周期:當蛇自己吃到自己身體的某一部分時,也宣告游戲結束,在程序里通過循環判斷蛇頭下一個前進方向的節點是不是蛇身上的某一部分節點即可,如果是那樣蛇死亡,否則繼續運行游戲。當蛇撞上地圖上任意一個障礙物時要么蛇死亡,否則繼續運行游戲。當蛇穿過閃電并且身體長度少于3時則蛇死亡,否則繼續運行游戲。
分數統計:分數統計算法的思想是每次蛇吃到一個果實時,相加的分數為自身的長度,這樣可以隨著游戲難度的增加,分數值也隨之增多。關卡功能設置通過與分數相關聯體現,初始化游戲分數為0,關卡由玩家自己選擇,地圖預先設置在程序中。地圖中包含了閃電,但蛇移動到閃電區域觸發閃電時會截去閃電以后的身體部分,當身體長度小于3時則判定死亡。
3.1 游戲界面設計

圖2 游戲LOGO、游戲主菜單、游戲子菜單、游戲初始化、游戲排名
本游戲在傳統貪吃蛇的功能基礎上,進行了全新的界面設計和音效設計,整款游戲界面簡潔美觀,色彩鮮明,音效豐富,部分界面效果如圖2所示。
//地圖選擇,游戲的初始化代碼,蛇的坐標初始化

3.2 蛇的顯示
游戲中完整蛇形狀的繪制:主要通過一個鏈表,其中存儲蛇身體的每一節所需的坐標,當蛇移動時,將取出尾坐標將它變為頭坐標加到頭上實現蛇的移動,并創建一個平行的鏈表存儲蛇對應每節所需顯示的圖片,再通過下述代碼實現繪制,最后就是一條完美的蛇了,效果如圖1蛇身所示。


3.3 道具
游戲中每當蛇吃到道具時,需要重置道具。道具分為八種,分別為:普通,加兩格,加三格,減一格,減兩格,加速,減速,隱身。如圖3所示。

圖3 道具
3.4 游戲開發過程中的問題
(1)畫面的閃爍問題
在游戲開發前期圖片采用多線程來分別繪制,然而在游戲編譯運行的過程中發現,GDI+如果使用多線程來繪制圖片,會產生非常嚴重的閃爍問題,后使用了雙緩沖技術,把所有的圖像刷新都放在內存中的一個緩沖區(Buffer)中,然后在游戲畫面需要刷新的時候只需輸出緩沖區中最終的圖像信息就能夠解決閃爍的問題[2-3]。下面是本游戲中采用的圖像繪制代碼:
//以Bitmap為緩沖載體:Bitmap FBuffer=new Bitmap (_ScreenWidth,_ScreenHeight);
//graphics繪制圖像到Bitmap中:Graphics FPainter= Graphics.FromImage(FBuffer);
//繪制圖片:Image map01=Image.FromFile("..//..//images// map01.png");
//繪 制 文 字:FPainter.DrawString(FMessage,FMessage-Font,FMessageBrush,new PointF(X,Y));
//最后在主程序中繪制包涵圖片信息的Bitmap:FScreen. DrawImage(FBuffer,0,0);
(2)音頻播放及內存資源占用過大的衍生問題
游戲先后使用了WindowsMediaPlayClass,winmm.dll的非托管方式來播放音頻。后來發現如果使用WindowsMediaPlayClass提供的音頻播放方法,一個音頻文件還好,多個音頻文件一起播放就會讓內存占用量顯著升高,在有的電腦上還會導致內存溢出的情況,初步認為是托管方式對于內存的回收方面并不是很完美,而且無法使用多線程播放音頻。又使用了winmm.dll的非托管播放方式,發現內存占有量顯著降低,但是沒有前者所提供的音量操控等方法。最后取彼之長補彼之短,使用WindowsMediaPlayClass播放背景音樂這種非隨機事件,用winmm.dll來播放菜單音效這種隨機高頻度事件,來達到中和的效果。
本文開發的升級版貪吃蛇游戲除實現基本功能外,附加了許多趣味性新功能,牽涉到了圖形界面的顯示與更新、數據的收集與更新等,對開發類似的GDI+游戲有很好的借鑒作用。
[1](英)夏普.Visual C#2005從入門到精通[M].周靖,譯.北京:清華大學出版社,2006.
[2]楊睿娜.C#開發貪食蛇游戲[J].電腦知識與技術,2011(18).
[3]雷麗娟,鄭永彬.使用Java制作貪吃蛇游戲[J].科技視界,2013 (4).
Design and Implementation of Snake Game in C#Version
Shang Lihua
(Wuxi City College of Vocational Technology,Wuxi 214153,Jiangsu)
In this paper,based on C#development environment,a snake game is developed with beautiful interface,simple operation and complete functions.The game includes a single player game,online game,online map selection,audio playback and other functions.Through the development of the game,it can achieve the purpose to learn C#technology and familiar with the software development process.
snake game;C#;GDI+
TP311.52
A
1008-6609(2015)11-0065-03
商利華,女,江蘇無錫人,本科,講師,研究方向:.NET平臺開發,數據庫應用。