1. 程式人生 > >C語言也能寫植物大戰殭屍

C語言也能寫植物大戰殭屍

不少同學都玩過《植物大戰殭屍》,最近PopCap公司又帶來了新版的訊息,這次高興的輪到Xbox的使用者了,日前PopCap公司公佈了《植物大戰殭屍》XBLA版的截圖,這個版本的《植物大戰殭屍》引入了多人合作與對抗模式,看圖就知道好玩多了又刺激多了。
在這裡插入圖片描述
C語言也能寫植物大戰殭屍

詳見遊戲說明,

遊戲視訊

於是,我在非常強烈的好奇心和求知慾下,自己動手寫了一個簡易的雙人對戰版。開發環境是VC6.0,開發語言是C語言。

遊戲最終完成情況C語言植物大戰殭屍

第一章 需求分析

設計一個雙人對戰的植物大戰殭屍,兩人在一臺電腦上玩。

植物方使用滑鼠控制,基本上與原版的控制的方法一樣。植物方獲勝條件是打掉殭屍最後面的五個墓碑中的三個。

殭屍方使用鍵盤控制,W控制殭屍選擇游標的上移,S控制殭屍選擇游標的下移,ENTER是殭屍選擇的確認,方向鍵控制殭屍安放的位置,空格鍵是安放殭屍。殭屍方的獲勝條件是與原版一樣走到戴夫家裡。

第二章 概要設計

首先,根據我的設計,我把遊戲分為幾個元素:地圖格子元素,卡片元素,殭屍元素,推車元素,殭屍方的墓碑靶子元素,植物的子彈元素,動畫效果播放元素。

其次,把遊戲分為幾個處理:子彈碰到殭屍處理,殭屍碰到植物處理,推車碰到殭屍處理,子彈碰到墓碑靶子處理等。每個處理完後立馬接上動畫播放效果。

第三章 詳細設計

3.1載入GIF影象

植物元素和殭屍元素都是動態的,於是我想到了載入GIF。經過查詢資料,找到了在VC6.0中用GDI+載入GIF的方法。

詳見VC6.0使用GIF資料

資料和示例程式地址VC6.0載入GIF方法,示例程式

程式的結果如圖所示
在這裡插入圖片描述

C語言也能寫植物大戰殭屍
這是因為當資料量很大時,繪圖可能需要幾秒鐘甚至更長的時間,而且有時還會出現閃爍現象,為了解決這些問題,可採用雙緩衝技術來繪圖。

雙緩衝即在記憶體中建立一個與螢幕繪圖區域一致的物件,先將圖形繪製到記憶體中的這個物件上,再一次性將這個物件上的圖形拷貝到螢幕上,這樣能大大加快繪圖的速度。雙緩衝實現過程如下:

1、在記憶體中建立與畫布一致的緩衝區

2、在緩衝區畫圖

3、將緩衝區點陣圖拷貝到當前畫布上

4、釋放記憶體緩衝區

增加雙緩衝後的示例程式地址雙緩衝載入GIF

程式結果如圖所示
在這裡插入圖片描述

C語言也能寫植物大戰殭屍

3.2遊戲元素

3.2.1地圖格子元素

植物大戰殭屍的地圖中的草地是有一格一格的,於是可以建立一個二維陣列的結構體,來表示地圖上當前格子的狀態。

typedef struct
  {
   char cName; //格子中植物的名字,沒植物時是0
   int iLife; //格子中植物的生命值
   char cSun; //格子中是否有陽光
   char cChomper; //是否是食人花
   char cSquash; //是否是窩瓜
   char cBomb; //是否是炸彈
   char cCherryBomb;//是否是炸彈
   POINT ptSite; //格子的座標位置
   char cBeat; //格子中的植物是否正在被攻擊
  }__MAPNATURE;
  __MAPNATURE _MAP[5][9]; //植物的格子
  __MAPNATURE _MAPZOM[5][3]; //殭屍的格子
3.2.2卡片元素

植物與殭屍都有選擇的卡片,如圖所示
在這裡插入圖片描述
C語言也能寫植物大戰殭屍
植物有植物的卡片,殭屍有殭屍的卡片。每張卡片它們具有不同的屬性,建立一個結構體。

typedef struct {
   char cCanFlg; //是否能被選擇
   int iCount; //冷卻的時間
   POINT ptSite; //卡片的位置
   char pTime[8];//冷卻的時間
   int iColor; //要隱藏的顏色
   int iMoney; //卡片所花費的金錢
  }__CARDNATURE;
  __CARDNATURE _CARD[8];//植物的卡片
  __CARDNATURE _CARDZOM[7];//殭屍的卡片
3.2.3殭屍元素

每個殭屍都是一個獨立的單元,包含著它的存活,位置等。我用的是一個結構體陣列,其實可以用迴圈佇列的。

typedef struct {
   char cAlive; //是否活著
   char cName; //殭屍的名字
   int iLife; //殭屍的生命值
   char cPole; //撐杆殭屍的杆子是否存在
   int iSpeed; //殭屍的行走的速度
   POINT ptSite; //殭屍的位置
   char cBeat; //殭屍是否被子彈打擊
   char cAttack; //殭屍是否正在吃植物
   char cPass; //殭屍能否行走,碰到植物不通過
   char cProtect;//殭屍的保護是否在,針對報紙,鐵桶殭屍
   char cPoleVaulting;//撐杆殭屍是否正在跳躍
  }__ZOMBIENATURE;
__ZOMBIENATURE _ZOMBIE[ZOMMAX];//殭屍的陣列
3.2.4其他元素

這裡其他元素是推車元素,殭屍方的墓碑靶子元素,植物的子彈元素。同理,它們有自己特性。

//推車
  typedef struct {
   char cActive; //推車啟用標誌。有殭屍碰到啟用
   char cAlive; //推車跑出最右端,不在存活
   POINT ptSite; //推車位置
  }__LAWNMOVERNATURE;
  //殭屍靶子
  typedef struct {
   int iLife; //殭屍靶子的生命值
   POINT ptSite; //靶子的位置
   char cBeat; //靶子是否被攻擊
  }__TARGETNATURE;
  //豌豆子彈
  typedef struct
  {
   char cAlive; //子彈啟用標誌,每隔多少時間射一次
   char cOpen; //子彈能否啟用
   POINT ptSite; //子彈老的位置
   POINT ptNew; //子彈新的位置
  }__BULLETNATURE;
3.3遊戲處理

3.3.1子彈碰到殭屍處理

子彈是一個結構體陣列,殭屍也是結構體陣列,用兩個for迴圈掃描這兩個陣列,當子彈的座標與殭屍的座標滿足相碰關係時,子彈啟用標誌清零,即子彈消失,同時殭屍的生命值減一。直到殭屍清零,殭屍死亡。

3.3.2殭屍碰到植物處理

For迴圈掃描每個殭屍,通過殭屍的位置判斷出它此時所對應地圖上的前一個格子。通過當前格子的狀態,判斷接下來發生的事情。例如:格子裡沒植物,殭屍通過;殭屍碰到豌豆射手,堅果牆,向日葵就停下來開吃,同時,格子的生命值不停地減,直到吃掉植物,向前通行,當是撐杆殭屍有一個杆子,碰到它們後要跳過它們;殭屍碰到炸彈,窩瓜,食人花就被吃掉或炸死,同時播放動畫效果。

3.3.3推車碰到殭屍處理

For迴圈掃描每個殭屍,當殭屍走到最左端的時候,啟用推車的標誌,並且推車向右行駛。推車在這條路上碰到殭屍,殭屍就死亡,當推車到達最右端時,推車死亡。

本人從事線上教育c++十年工作經驗現在精心整理了一套從小白到專案實踐開發各種學習資料如果你想學想加入我們請關注我在私信回覆“程式設計”就可以領取學習資料!!!加群:775356268