程式設計實訓坦克大戰實驗報告

2021-03-14 14:41:48 字數 3670 閱讀 5291

程式設計實訓報告

坦克大戰

專業班級: 裝控1401

實習時間:2023年7月10日至7月14日

實習地點微401

成員 1趙振華

成員 2許晨歡

成員 3蔣緒濤

1、自定義並命名樹林和鋼板精靈,設定樹林屬性為不接受碰撞可以自由穿梭,鋼板為接受任何碰撞但不做任何處理(即子彈和坦克均不能摧毀鋼板)。

2、新增坦克發炮、擊中目標和坦克移動的特殊聲效。

這款遊戲是我們qwer小組以經典90版坦克大戰為背景製作的坦克大戰的改編款,玩家通過控制坦克摧毀敵方坦克來保衛主基地不被摧毀。當敵我雙方坦克相碰或己方基地被子彈摧毀時遊戲結束(敵我雙方子彈均可摧毀基地),每隔3秒鐘出現一輛敵方坦克,遊戲最大時長為100秒。此款遊戲與經典90版坦克大戰較為相似,操作簡單,能喚起我們對童年的回憶。

玩家坦克與敵方坦克在街道中進行巷戰,玩家坦克被擊中或與敵方坦克相撞、玩家指揮部被擊中或遊戲時間到,一局遊戲結束。

按下空格鍵後遊戲開始,「空格開始」消失,載入地圖,100秒倒計時開始,並把玩家坦克設定在指揮部左側。

遊戲時間到,玩家坦克被敵方坦克摧毀,與敵方坦克相撞,或者玩家指揮部被摧毀,一局遊戲結束,遊戲回到初始介面,並顯示上一局的分數。

玩家用w、a、s、d鍵控制坦克上、下、左、右執行,按j鍵開炮。坦克行進過程中有特殊聲效,坦克發射或擊中目標都有相應的聲效。玩家坦克碰到牆和鋼板就停下來,需要調轉方向才能繼續前進。

玩家坦克開炮,一炮就能摧毀一塊牆或者一輛敵方坦克,但不能摧毀鋼板,玩家可穿梭於樹林中。玩家每摧毀一輛敵方坦克,加1分。

玩家指揮部被坦克或者炮彈(不管玩家還是敵方)碰上,都會被摧毀。

每隔3秒鐘,就會產生一輛敵方坦克。敵方坦克每隔一段時間,就自動開炮。敵方坦克遇到牆就會停下來。

停下來的坦克,前方的牆如果被摧毀了,又能繼續前進。每隔幾秒鐘,敵方坦克就會順時針變換乙個方向前進。每局最大時長為100秒。

struct weapon

;enum direction;

enum role

;const float game_time100.f一局遊戲時間

const float create_tank_time = 2.f每批次生成坦克的時間間隔

const float tank_speed20.f坦克速度

const float bullet_speed30.f子彈速度

const float fire_time2.f坦克開炮時間間隔

const float world_left26.f; // 遊戲場景邊界左值

const float world_top22.f; // 遊戲場景邊界左值

const float world_right26.f遊戲場景邊界左值

const float world_bottom = 22.f遊戲場景邊界左值

int g_imap[11][13二維陣列定義遊戲地圖

int g_iwallcount = 0遊戲中牆的數量

int g_inum = 0記錄全部精靈的數目,用來給精靈命名

float g_fcreatetime0.f每批次生成坦克的剩餘時間

int g_listsize;

const float rotate_time2.f敵方坦克調轉方向的時間

bool g_bstart定義遊戲開始與否

int g_iscore遊戲中的分數

float g_fgametime=30.f定義遊戲時間

int maxscore=0定義初始最高分

1、遊戲狀態g_bstart分為兩種狀態0,1 ,其中0表示遊戲結束狀態,1表示遊戲開始; 當遊戲未開始時即g_start狀態為0,按下空格鍵,遊戲g_bstart狀態變為1,遊戲開始,將「空格開始」與「splash」設定為不可見,遊戲開始計時為100秒,顯示最高分數,將本局遊戲分數初始化為0,初始化地圖中牆,goal,玩家坦克的位置。一局遊戲進行中,每迴圈一次,g_fgametime減去一次刷屏的時間。當g_fgametime≤0,說明一局遊戲時間已完,遊戲停止,重新顯示「空格開始「字樣。

2、按w、s、a、d鍵,控制坦克上下左右運動。定義movemytank函式,按下w鍵,設定玩家坦克向上的速度;按下a鍵,設定向左速度;按下s鍵,設定向下的速度,按下d鍵,設定向右速度。鬆開鍵盤,坦克速度為0。

同時設定玩家坦克朝向idir。

3、遊戲開始後,右上角實時顯示剩餘時間。一局遊戲開始後,在winmain函式中的主迴圈裡,通過dsettextvalue把(int)g_fgametime的數值顯示在名為「time」的文字精靈裡,從而實時顯示剩餘時間(顯示整秒的時間)。

4、當超過100秒,遊戲結束,重新顯示「空格開始」字樣,遊戲時間設為0,坦克回到初始位置。一局遊戲進行中,每迴圈一次,g_fgametime減去一次刷屏的時間。當g_fgametime≤0,說明一局遊戲時間已完,遊戲停止,重新顯示「空格開始」字樣。

同時,g_batart狀態要改為0,否則下一局就不能正確判斷遊戲開始或結束。

1、一局遊戲開始時載入地圖。利用陣列的值來載入地圖,值為0,說明此處為空;值為1,說明此處有牆。遊戲開始後載入地圖,但只能載入一次。

如果不停載入,會占有大量資源。建立乙個新的精靈,首先需要給它命名。有規則地給精靈命名,有利於我們對精靈進行處理。

我們按照牆生成的先後順序,分別給精靈命名為:wall0,wall1,wall2….按樹林生成的順序,分別給精靈命名為:

shu,shu1,shu2……,鋼板分別命名為aa1,aa2……。

2、一局遊戲結束後刪除地圖。

3、玩家坦克碰到牆的話,不能繼續前行。設定玩家坦克的碰撞屬性,並專門定義乙個函式處理玩家坦克發生碰撞後,玩家坦克的響應。

1、玩家按下j鍵,坦克傳送炮彈;自定義乙個函式,onfire用於完成坦克發射子彈功能。玩家坦克發射子彈,和敵方坦克發射子彈功能基本一樣,我們可以寫在乙個函式裡。首先,需要把發射子彈的坦克名稱傳進來,這樣,我們才能獲取坦克的朝向和位置;其次,需要區別是我方坦克發射的子彈,還是敵方坦克發射的子彈。

在donkeydown中增加對onfire函式的呼叫。條件需要滿足:遊戲開始後,且玩家按j鍵。

2、建立鍊錶,用鍊錶管理炮彈;用鍊錶管理子彈,每發射一顆子彈,就新增到煉表裡。每刪除一顆子彈,就從鏈表裡相應刪除節點。遊戲結束時,刪除所有剩餘的子彈。

3、子彈擊中牆,將牆摧毀;子彈擊中目標,遊戲結束。碰撞事件中,我們經常會將碰撞的一方或兩方刪除。但是,如果我們直接刪除某個精靈,而後面的精靈還需要獲得它的資訊時,就沒法獲得了。

因此,我們定義乙個isdead函式,當該指標存在且ihp為0時,說明該精靈已死。碰撞函式中,先將需要刪除的精靈的ihp設定為0,最後再統一將需要刪除的精靈刪除。

4、在donspritecolsprite函式中呼叫上面兩個碰撞函式。其中,牆只具有「接受碰撞」屬性,因此只需要判斷sztarname是否包含wall字串。子彈具有「發射碰撞」和「接受碰撞」兩種屬性,因此需要分別判斷szsr**ame和sztarname是否包含bullet字串。

1、每隔一段時間,生成一輛敵方坦克,向下運動;坦克生成的初始位置前方不能有牆。

自定義乙個函式,用於生成敵方坦克。每次生成一輛敵方坦克,總是放在第一排,列數隨機,但其前方不能有牆。方向朝向,設定「傳送碰撞」和「接受碰撞」屬性,設定世界邊界。

建立乙個weapon指標節點,將精靈名稱、朝向、坦克調轉方向時間儲存起來,並將節點新增到鍊錶中。

物流實訓實驗報告

實訓實習報告 學院名稱管理學院 專業 班級2011級物流管理x班 姓名 學號 x 指導教師 第一部分 1.製作單證 這一階段,我們實訓的地點是合肥市物流學校 合肥市物流學校 合肥市第二十四中學 始創於1959年,是安徽省唯一一所以 物流 命名的公辦中等職業學校,隸屬於合肥市教育局 這個單證製作是在機...

會計實訓實驗報告

實驗報告 一 實驗目的 會計學是一門理論與實際相結合的學科,對會計學的學習不能僅僅侷限於對理論知識的學習而要重要的是對實務的練習。會計實驗課程是以模擬實際會計工作為基礎,按照會計準則的要求,進行操作訓練,有目的地檢驗和複習所學的基礎會計理論知識 方法 技能和技巧。通過實際操作,能夠使我們比較系統和全...

實訓課題實驗報告

實訓課題 plc在三相非同步電動機控制中的應用 班級 姓名 學號 指導老師 2007年6月22日 一 綜合實訓的目的 1 通過綜合實訓加強對plc理論知識的理解,加強實踐動手能力。2 通過對課題的製作,學習plc應用系統的硬體 軟體的一般設計方法。3 掌握步進電機及驅動模組 直流電機 單相交流電機 ...