



版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、程序設(shè)計(jì)實(shí)訓(xùn)報(bào)告坦克大戰(zhàn)專業(yè)班級(jí):裝控 1401實(shí)習(xí)時(shí)間: 2015年7月10日至7月14日實(shí)習(xí)地點(diǎn):微 401成員 1:趙振華成員 2:許晨歡成員 3:蔣緒濤考勤視頻總成績(jī)個(gè)人分文檔創(chuàng)意及實(shí)( 10(30%( 100%成員1成員2成員3( 30% ) 現(xiàn)(30% )% )一、作品概述1.1 創(chuàng)新點(diǎn):1、自定義并命名樹林和鋼板精靈,設(shè)置樹林屬性為不接受碰撞可以自由穿梭,鋼板為接受任何碰撞但不做任何處理( 即子彈和坦克均不能摧毀鋼板) 。2、添加坦克發(fā)炮、擊中目標(biāo)和坦克移動(dòng)的特殊聲效。12 概述:這款游戲是我們 QWER 小組以經(jīng)典 90 版坦克大戰(zhàn)為背景制作的坦克大戰(zhàn)的改編款,玩家通過控制坦克
2、摧毀敵方坦克來保衛(wèi)主基地不被摧毀。當(dāng)敵我雙方坦克相碰或己方基地被子彈摧毀時(shí)游戲結(jié)束(敵我雙方子彈均可摧毀基地),每隔 3 秒鐘出現(xiàn)一輛敵方坦克,游戲最大時(shí)長(zhǎng)為100 秒。此款游戲與經(jīng)典90 版坦克大戰(zhàn)較為相似,操作簡(jiǎn)單,能喚起我們對(duì)童年的回憶。二、功能設(shè)計(jì)玩家坦克與敵方坦克在街道中進(jìn)行巷戰(zhàn),玩家坦克被擊中或與敵方坦克相撞、玩家指揮部被擊中或游戲時(shí)間到,一局游戲結(jié)束。按下空格鍵后游戲開始, “空格開始 ”消失,載入地圖, 100 秒倒計(jì)時(shí)開始,并把玩家坦克設(shè)置在指揮部左側(cè)。游戲時(shí)間到,玩家坦克被敵方坦克摧毀,與敵方坦克相撞,或者玩家指揮部被摧毀,一局游戲結(jié)束,游戲回到初始界面,并顯示上一局的分?jǐn)?shù)
3、。玩家用 W 、A、S、D 鍵控制坦克上、下、左、右運(yùn)行,按 J 鍵開炮。坦克行進(jìn)過程中有特殊聲效,坦克發(fā)射或擊中目標(biāo)都有相應(yīng)的聲效。玩家坦克碰到墻和鋼板就停下來,需要調(diào)轉(zhuǎn)方向才能繼續(xù)前進(jìn)。玩家坦克開炮,一炮就能摧毀一塊墻或者一輛敵方坦克,但不能摧毀鋼板, 玩家可穿梭于樹林中。 玩家每摧毀一輛敵方坦克, 加 1 分。玩家指揮部被坦克或者炮彈(不管玩家還是敵方)碰上,都會(huì)被摧毀。每隔 3 秒鐘,就會(huì)產(chǎn)生一輛敵方坦克。敵方坦克每隔一段時(shí)間,就自動(dòng)開炮。敵方坦克遇到墻就會(huì)停下來。停下來的坦克,前方的墻如果被摧毀了,又能繼續(xù)前進(jìn)。每隔幾秒鐘,敵方坦克就會(huì)順時(shí)針變換一個(gè)方向前進(jìn)。每局最大時(shí)長(zhǎng)為100 秒
4、。三、功能實(shí)現(xiàn)3.1 數(shù)據(jù)結(jié)構(gòu)struct WeaponcharszName128;/ 精靈名稱floatfPosX,fPosY;/ 精靈坐標(biāo)floatfSpeedX,fSpeedY; / X 和 Y 方向上速度floatfFireTime;/ 敵方坦克距下一次開炮的剩余時(shí)間float fRotateTime;intiHp;/ 生命值intiDir;/ 朝向:0 - 上方; 1 - 右方; 2 - 下方; 3 -左方intiType;/ 類型:0 -我方坦克;1 -敵方坦克;2 -我方/ 子彈; 3 - 敵方子彈Weapon* pNext;/ 指向下一個(gè)節(jié)點(diǎn)的指針;enumDirectionU
5、P=0,/ 上方RIGHT=1,/ 右方DOWN =2,/ 下方LEFT=3/ 左方;enumRoleMYTANK=0,/ 我方坦克ENEMYTANK=1,/ 敵方坦克MYBULLET=2,/ 我方子彈ENEMYBULLET= 3/ 敵方子彈;constfloat GAME_TIME=100.f;/ 一局游戲時(shí)間constfloatCREATE_TANK_TIME =2.f;/ 每批次生成坦克的時(shí)間間隔constfloat TANK_SPEED=20.f;/ 坦克速度constfloatBULLET_SPEED=30.f;/ 子彈速度constfloat FIRE_TIME= 2.f;/ 坦克
6、開炮時(shí)間間隔constfloat WORLD_LEFT=-26.f;/游戲場(chǎng)景邊界左值constfloat WORLD_TOP=-22.f;/游戲場(chǎng)景邊界左值constfloat WORLD_RIGHT=26.f;/游戲場(chǎng)景邊界左值constfloat WORLD_BOTTOM =22.f;/游戲場(chǎng)景邊界左值int g_iMap1113;/二維數(shù)組定義游戲地圖int g_iWallCount=0;/游戲中墻的數(shù)量int g_iNum =0;/記錄全部精靈的數(shù)目,用來給精靈命名float g_fCreateTime=0.f;/每批次生成坦克的剩余時(shí)間int g_listSize;const fl
7、oat ROTATE_TIME=2.f;/敵方坦克調(diào)轉(zhuǎn)方向的時(shí)間bool g_bStart;/定義游戲開始與否int g_iScore;/游戲中的分?jǐn)?shù)float g_fGameTime=30.f;/定義游戲時(shí)間int maxscore=0;/定義初始最高分3.2 算法描述3.2.1游戲開始和結(jié)束1、游戲狀態(tài) g_bstart 分為兩種狀態(tài) 0,1 ,其中 0 表示游戲結(jié)束狀態(tài), 1 表示游戲開始; 當(dāng)游戲未開始時(shí)即 g_start 狀態(tài)為 0,按下空格鍵, 游戲 g_bstart 狀態(tài)變?yōu)?1,游戲開始,將“空格開始”與“ splash”設(shè)置為不可見,游戲開始計(jì)時(shí)為 100 秒,顯示最高分?jǐn)?shù),
8、將本局游戲分?jǐn)?shù)初始化為 0,初始化地圖中墻, goal,玩家坦克的位置。一 局 游 戲 進(jìn) 行 中 , 每 循 環(huán) 一 次 , g_fGameTime 減 去 一 次 刷 屏 的 時(shí) 間 。 當(dāng)g_fGameTime0,說明一局游戲時(shí)間已完,游戲停止,重新顯示“空格開始 “字樣。2、按 W 、S、A 、D 鍵,控制坦克上下左右運(yùn)動(dòng)。定義MoveMyTank 函數(shù),按下W 鍵,設(shè)置玩家坦克向上的速度;按下A 鍵,設(shè)置向左速度;按下S 鍵,設(shè)置向下的速度,按下 D 鍵,設(shè)置向右速度。松開鍵盤,坦克速度為0。同時(shí)設(shè)置玩家坦克朝向 iDir 。3、游戲開始后,右上角實(shí)時(shí)顯示剩余時(shí)間。一局游戲開始后,在
9、WinMain 函數(shù)中的主循環(huán)里,通過 dSetTextValue把 (int)g_fGameTime 的數(shù)值顯示在名為 “time的”文字精靈里,從而實(shí)時(shí)顯示剩余時(shí)間(顯示整秒的時(shí)間) 。4、當(dāng)超過 100 秒,游戲結(jié)束,重新顯示“空格開始”字樣,游戲時(shí)間設(shè)為0,坦克回到初始位置。 一局游戲進(jìn)行中, 每循環(huán)一次, g_fGameTime 減去一次刷屏的時(shí)間。當(dāng) g_fGameTime0,說明一局游戲時(shí)間已完, 游戲停止,重新顯示“空格開始”字樣。同時(shí), g_batart 狀態(tài)要改為 0,否則下一局就不能正確判斷游戲開始或結(jié)束。3.2.2玩家坦克在街道中運(yùn)行1、一局游戲開始時(shí)載入地圖。 利用數(shù)
10、組的值來載入地圖, 值為 0,說明此處為空;值為 1,說明此處有墻。游戲開始后載入地圖,但只能載入一次。如果不停載入,會(huì)占有大量資源。創(chuàng)建一個(gè)新的精靈,首先需要給它命名。有規(guī)則地給精靈命名,有利于我們對(duì)精靈進(jìn)行處理。我們按照墻生成的先后順序,分別給精靈命名為:wall0 ,wall1 ,wall2 按.樹林生成的順序,分別給精靈命名為:shu, shu1,shu2 ,鋼板分別命名為 aa1,aa2。2、一局游戲結(jié)束后刪除地圖。3、玩家坦克碰到墻的話,不能繼續(xù)前行。設(shè)置玩家坦克的碰撞屬性,并專門定義一個(gè)函數(shù)處理玩家坦克發(fā)生碰撞后,玩家坦克的響應(yīng)。3.2.3玩家坦克射擊1、玩家按下j 鍵,坦克發(fā)送
11、炮彈;自定義一個(gè)函數(shù),OnFire 用于完成坦克發(fā)射子彈功能。玩家坦克發(fā)射子彈,和敵方坦克發(fā)射子彈功能基本一樣,我們可以寫在一個(gè)函數(shù)里。首先,需要把發(fā)射子彈的坦克名稱傳進(jìn)來,這樣,我們才能獲取坦克的朝向和位置;其次,需要區(qū)別是我方坦克發(fā)射的子彈,還是敵方坦克發(fā)射的子彈。在dOnKeyDown 中增加對(duì) OnFire 函數(shù)的調(diào)用。條件需要滿足:游戲開始后,且玩家按J鍵。2、創(chuàng)建鏈表,用鏈表管理炮彈;用鏈表管理子彈,每發(fā)射一顆子彈,就添加到鏈表里。每刪除一顆子彈,就從鏈表里相應(yīng)刪除節(jié)點(diǎn)。游戲結(jié)束時(shí),刪除所有剩余的子彈。3、子彈擊中墻,將墻摧毀;子彈擊中目標(biāo),游戲結(jié)束。碰撞事件中,我們經(jīng)常會(huì)將碰撞的
12、一方或兩方刪除。但是,如果我們直接刪除某個(gè)精靈,而后面的精靈還需要獲得它的信息時(shí),就沒法獲得了。因此,我們定義一個(gè)ISDead 函數(shù),當(dāng)該指針存在且iHp為 0 時(shí),說明該精靈已死。碰撞函數(shù)中,先將需要?jiǎng)h除的精靈的iHp設(shè)置為0,最后再統(tǒng)一將需要?jiǎng)h除的精靈刪除。4、在 dOnSpriteColSprite 函數(shù)中調(diào)用上面兩個(gè)碰撞函數(shù)。其中,墻只具有“接受碰撞”屬性,因此只需要判斷 szTarName是否包含 wall 字符串。子彈具有“發(fā)射碰撞”和“接受碰撞”兩種屬性, 因此需要分別判斷szSrcName和 szTarName是否包含 bullet字符串。3.2.4敵方坦克產(chǎn)生與運(yùn)動(dòng)1、每隔一
13、段時(shí)間,生成一輛敵方坦克,向下運(yùn)動(dòng);坦克生成的初始位置前方不能有墻。自定義一個(gè)函數(shù), 用于生成敵方坦克。 每次生成一輛敵方坦克, 總是放在第一排,列數(shù)隨機(jī),但其前方不能有墻。方向朝向,設(shè)置“發(fā)送碰撞”和“接受碰撞”屬性,設(shè)置世界邊界。創(chuàng)建一個(gè) Weapon 指針節(jié)點(diǎn),將精靈名稱、朝向、坦克調(diào)轉(zhuǎn)方向時(shí)間保存起來,并將節(jié)點(diǎn)添加到鏈表中。2、敵方坦克每隔一段時(shí)間,就順時(shí)針變化一個(gè)方向,繼續(xù)前進(jìn)。自定義一個(gè)MoveEnemyTank 函數(shù),用來處理敵方坦克的運(yùn)動(dòng)。函數(shù)根據(jù)敵方坦克名稱,獲取敵方坦克當(dāng)前朝向和速度, 然后將該坦克順時(shí)針旋轉(zhuǎn) 90 度,并修改相應(yīng)速度。在 WinMain 函數(shù)中,一局游戲運(yùn)
14、行時(shí),遍歷鏈表,找出敵方坦克節(jié)點(diǎn),判斷是否已經(jīng)到調(diào)換方向時(shí)間。如果時(shí)間到,調(diào)用 MoveEnemyTank 函數(shù)。3.2.5坦克對(duì)戰(zhàn)1、玩家坦克子彈擊中敵方坦克, 敵方坦克被摧毀,玩家加一分。在 OnTankColOther函數(shù)中,對(duì)玩家子彈碰到敵方坦克,敵方坦克iHp 設(shè)為 0,并且 g_iScore 加 1。2、每隔一段時(shí)間,敵方坦克就發(fā)射一發(fā)子彈;增加一個(gè)一個(gè)全局常量的定義:const floatFIRE_TIME= 2.f;/敵方坦克發(fā)射炮彈的時(shí)間間隔創(chuàng)建坦克時(shí),需要給坦克的 fFireTime 賦值為 FIRE_TIME 。在 WinMain 的主循環(huán)中,遍歷鏈表,找到敵方坦克節(jié)點(diǎn)。
15、如果坦克發(fā)射炮彈時(shí)間到,調(diào)用OnFire 函數(shù)。3、敵方子彈擊中玩家坦克,游戲結(jié)束。在 OnMyTankColOther 函數(shù)中,當(dāng)玩家坦克碰到的是子彈精靈(不可能是自己發(fā)射的子彈,因?yàn)樽訌椝俣缺忍箍丝欤?,游戲結(jié)束。四、系統(tǒng)界面圖 4-1 開始游戲圖 4-2 游戲進(jìn)行畫面圖 4-3 開始新一局游戲五、總結(jié)許晨歡:這次程序設(shè)計(jì)實(shí)訓(xùn)我自己收獲非常的多,首先是對(duì)于funcode 這款軟件的收獲,可以說是從無到有,從陌生到熟悉,開始覺得軟件太難了,無從下手,后來在不斷詢問老師和同學(xué)的過程中,逐漸熟能生巧,學(xué)會(huì)了創(chuàng)建第一個(gè)項(xiàng)目,運(yùn)行FunCode創(chuàng)建新項(xiàng)目,導(dǎo)入靜態(tài)精靈,導(dǎo)入動(dòng)畫精靈,刪除精靈,設(shè)計(jì)界面
16、初步,運(yùn)行游戲等基本操作。通過練習(xí)熟練了打開項(xiàng)目,安裝目錄及內(nèi)容,給精靈起名稱,設(shè)置精靈的速度,設(shè)置精靈的層次,精靈與世界邊界的碰撞,精靈與精靈的碰撞,導(dǎo)入地圖模板等項(xiàng)目改進(jìn)措施,并逐步運(yùn)用自如。但是對(duì)軟件熟悉了之后新問題又來了,發(fā)現(xiàn)真正難的是游戲代碼,開始連哪個(gè)函數(shù)是什么作用都搞不明白,而且坦克大戰(zhàn)中運(yùn)用到指針,枚舉等之前已經(jīng)生疏的知識(shí)點(diǎn), 我們也只能是現(xiàn)學(xué)現(xiàn)用, 通過詢問老師,同學(xué)和查詢網(wǎng)絡(luò)一步一步達(dá)到自己的目的, 在與同隊(duì)的隊(duì)員編寫一天之后逐步的可以通過結(jié)合程序后面的中文注釋看懂程序所表達(dá)的目的和意思了; 在實(shí)習(xí)過程中遇到很多很多棘手的問題,其中最大的問題便是 C 語言能力不夠了,好多程
17、序編出來都有錯(cuò)誤,甚至都編不出來,這給我們時(shí)間和精力上增添了很大障礙。在這幾天最令我感慨的就是團(tuán)隊(duì)的力量,三個(gè)人從零基礎(chǔ)到獨(dú)立編寫一個(gè)游戲,沒有團(tuán)結(jié)協(xié)作的精神是不行的,我們甚至犧牲晚上娛樂的時(shí)間和中午午休的時(shí)間加班加點(diǎn)地完善我們的程序,盡管很苦,但我們甘之如飴,為的是團(tuán)隊(duì)的成績(jī);其次就是C 語言的強(qiáng)大力量,無論是我們?nèi)粘=佑|的手機(jī),電腦或者是接觸不到的高科技產(chǎn)品,都離不開 C語言,它是一種非常實(shí)用的計(jì)算機(jī)語言,我們也應(yīng)該日后更加重視 C 語言的學(xué)習(xí)與應(yīng)用。這次實(shí)訓(xùn)貴在學(xué)有所用,我在團(tuán)隊(duì)的力量中確實(shí)感覺到自己過去的 C 語言沒有白學(xué),能夠轉(zhuǎn)化為應(yīng)用技能,感到很高興,希望我們都能在日后注重學(xué)于用之
18、間的關(guān)系,團(tuán)結(jié)一心向前看!趙振華:經(jīng)過為期 4 天的 funcode 學(xué)習(xí),從開始只會(huì)編程解決所謂的實(shí)際應(yīng)用問題到用 funcode 平臺(tái)編一個(gè)小游戲,其間我們的 C 語言知識(shí)、程序思維能力等從理論階段提升到實(shí)踐階段,我們從游戲制作者的角度弄清楚了游戲運(yùn)行原理,知道怎么原來的基礎(chǔ)上添加類似的元素(如樹林、鋼板) 幾天以來,感受頗深,例如坦克大戰(zhàn),首先進(jìn)行功能分類, 然后具體分析每個(gè)功能的設(shè)計(jì)以及各個(gè)功能模塊之間的聯(lián)系,精靈碰撞分類 我們解決現(xiàn)實(shí)問題的時(shí)候也可借鑒類似的思維方式, 針對(duì)各種分類情況做出相應(yīng)的抉擇。再者,我們?cè)诓粩嗟貙W(xué)習(xí)新知識(shí)的同時(shí)在應(yīng)用中不斷將已有的知識(shí)融會(huì)貫通,多多抓住實(shí)踐練習(xí)的機(jī)會(huì),學(xué)習(xí)與應(yīng)用相結(jié)合,使我們學(xué)有所用,達(dá)到學(xué)習(xí)的真正目的。以上這是我的感想。蔣緒濤:我這已經(jīng)不是第一次接觸 funcode 了,早在小學(xué)期
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年車輛抵押貸款信保業(yè)務(wù)借款協(xié)議
- 三年級(jí)下冊(cè)數(shù)學(xué)教案-第五單元長(zhǎng)方形的面積∣北師大版
- 2025年工作室網(wǎng)站合同
- 行業(yè)培訓(xùn)外包合同(2篇)
- (高清版)DB45∕T 227-2022 地理標(biāo)志產(chǎn)品 廣西肉桂
- 2011年全國(guó)各地高考生物試題分章匯編
- 任務(wù)二 高效地下載信息 教學(xué)設(shè)計(jì) -2023-2024學(xué)年桂科版初中信息技術(shù)七年級(jí)上冊(cè)
- 第十一課 智能家居教學(xué)設(shè)計(jì) -2023-2024學(xué)年青島版(2019)初中信息技術(shù)第四冊(cè)
- 第八單元(A卷基礎(chǔ)篇)三年級(jí)語文下冊(cè)單元分層訓(xùn)練AB卷(部編版)
- 第六單元-平移、旋轉(zhuǎn)和軸對(duì)稱(單元測(cè)試)-蘇教版數(shù)學(xué)三年級(jí)上冊(cè)(含解析)
- 銀行存管三方協(xié)議書
- 2024義務(wù)教育道德與法治課程標(biāo)準(zhǔn)(2022版)
- 2024年新人教版化學(xué)九年級(jí)上冊(cè)全冊(cè)課件(新版教材)
- 智能體脂秤市場(chǎng)洞察報(bào)告
- 教科版 二年級(jí)科學(xué)上冊(cè)第一單元第6課《不同的季節(jié)》同步練習(xí)(附答案解析)
- 山東省東營(yíng)市2024年中考英語真題【附真題答案】
- 2024義務(wù)教育英語新課標(biāo)課程標(biāo)準(zhǔn)2022年版考試真題附答案
- 粵港澳宜居城市建設(shè)協(xié)同發(fā)展策略
- 動(dòng)物防疫服務(wù)投標(biāo)方案(技術(shù)方案)
- 2024年新課標(biāo)全國(guó)Ⅰ卷語文高考真題試卷(含答案)
- 2022-2023學(xué)年廣州市六年級(jí)下學(xué)期數(shù)學(xué)期末考試試卷及答案解析
評(píng)論
0/150
提交評(píng)論