小游戲貪吃蛇的詳細設(shè)計_第1頁
小游戲貪吃蛇的詳細設(shè)計_第2頁
小游戲貪吃蛇的詳細設(shè)計_第3頁
小游戲貪吃蛇的詳細設(shè)計_第4頁
小游戲貪吃蛇的詳細設(shè)計_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、摘要在我們空閑的時候,我們可以用一些我們學過的知識編一些東西,通過這些東西我們可以學習到匯編語言綜合應(yīng)用程序設(shè)計方法,還可以提高匯編語言實際應(yīng)用能力,充分了解計算機硬件和軟件,完成理論到實踐的推進過程。這個程序就是用我所學過的匯編知識編的一個小游戲,這個游戲的程序主要就是用匯編宏和子程序的知識來編制而成的,我們用宏和子程序定義了很多的模塊,模塊也就是在我們的程序中直接可以調(diào)用的一個獨立的程序。所以我們編寫程序的時候可以很方便的用到它,所以那些基礎(chǔ)知識也是我們編寫程序的基礎(chǔ)。關(guān)鍵詞 匯編 貪吃蛇 小游戲前言現(xiàn)在有的一些人感覺生活都是很無聊的,特別是我們這些學生,所以有些時候肯定會玩各種各樣的游戲

2、的,有一些大的游戲,玩起來會話掉很多的時間,而且也會花掉大量精力的 ,所以在一些閑暇的時候一些小游戲會博得很多人的喜愛,例如:俄羅斯方塊,和一些格斗游戲等等。然而這些小游戲的設(shè)計方法和軟件有很多,所以也有很多不同的效果,本篇設(shè)計是采用匯編中宏定義和調(diào)用,子程序的調(diào)用等一些匯編知識編制而成的一個貪吃蛇小游戲,通過這個小游戲的制作,我們可以得到很多的益處,一方面我們可以不在浪費平時的一些空閑的時間了,而熱中于我們自己喜歡的游戲;另一個方面我們制作完游戲還可以給自己或者別人來享受一下,同時自己也會有一種成就感。特別當你用自己學到的知識制作出一個東西的時候,或者克服一個困難的時候你就會發(fā)現(xiàn)你自己的價值

3、所在了,而且這還能促進你喜歡學習的念頭。目錄一、系統(tǒng)分析 二、系統(tǒng)總體設(shè)計三、詳細設(shè)計1、 窗口化程序2、 建立小蛇和食物3、 初始對話框4、 小蛇和食物的位置5、 分配內(nèi)存空間6、 調(diào)整鏈表大小四、系統(tǒng)測試 1測試方案及用例2.測試結(jié)果及軟件可靠性分析3.游戲規(guī)則五、軟件使用說明書六、設(shè)計總結(jié)參考文獻致謝程序清單 一、系統(tǒng)分析這個程序的總體的思想也就是主要用的就是宏和子程序的定義和調(diào)用,首先,定義了5個宏它們分別為:屏幕初始化宏定義 在光標位置顯示字符和屬性定義 顯示字符串宏定義 置光標位置宏定義 讀光標位置的字符和屬性宏定義。它們在程序中起到主要的作用。其次,就是子程序定義了,程序中定義了

4、很多的子程序,其中有:控制子程序 食物子程序,還有記分子程序等。它們首先被主程序調(diào)用,然后它們之間再互相調(diào)用,這樣構(gòu)成了完整的游戲程序并實現(xiàn)其功能。具體的設(shè)計思想是:第一,對數(shù)據(jù)進行初始化,即對寄存器的初始化,比如對食物的初始化等。第二,開始運行,判斷是否符合條件,如果符合贏的條件的話,就會跳轉(zhuǎn)到贏的那個子程序下,然后那個贏的子程序會調(diào)用記分的那個子程序,最后顯示贏的信息和分數(shù)后再轉(zhuǎn)到控制程序執(zhí)行控制和其后的程序。如果要是輸?shù)脑?,就會跳轉(zhuǎn)到輸?shù)哪莻€子程序下,然后那個輸?shù)淖映绦蛞矔{(diào)用記分的那個子程序,最后顯示得分和信息。如果要是沒有贏也沒有輸?shù)脑挘浅绦驎娇刂频淖映绦蛑?,等控制完以后程序?/p>

5、會跳到程序判斷的那個地方重復的執(zhí)行。這個就是完成這個游戲程序的整個思想。二、系統(tǒng)總體設(shè)計這個程序完成的功能就是和別的游戲一樣,最初,給出一個初始化的界面,和一個4個方塊組成的小蛇,我們要把那個最初給出那個小蛇穿過那個閃爍的小紅黃相間的小方塊,然后那個小方塊就會變成我們那個小蛇上的組成單元一樣的一個小方塊,和在別的地方會在出現(xiàn)另一個小方塊,我們接下來要做的就是要把那個小方塊穿過來,然后我們那個小蛇就會變長了,然后在穿過小方塊,就這樣重復的做就行了,隨著你的穿過你的小蛇就會越來越長了,這是你的得分就會越高,同時你難度也會變大的,因為如果你要碰到四周的變的話,或者你自己的那個小蛇首尾要是相連的話你就

6、會輸了,所以當你那個小蛇很長的時候,難度自然就會變大了。開始初始化數(shù)據(jù)是否成功?losewinnolose顯示分數(shù)和符號顯示成功的符號上下左右的控制結(jié)束動畫貪吃蛇程序的流程圖三詳細設(shè)計1窗口化程序.data classname dbdlgclass, 0;snakedlg,0 helpmsgdbhelp: space-pause or start | esc-exit | arrow-direction, 0scoremsgdblength:%d, 0gameoverdbgame over!, 0bkgndclrdd0000dd00h;0x00bbggrrstatuswidth dd280,3

7、50,-1gsnakesnakest2建立小蛇和食物initbmp proc, hwnd:hwndinvoke getdc, hwndmov hdc, eax;蛇體畫片invoke createcompatibledc, hdcmov hsnkdc, eaxinvoke loadbitmap, hinstance, snakebmpmov hsnkbmp, eaxinvoke selectobject, hsnkdc, eax;食物畫片1invoke createcompatibledc, hdcmov hfddc1, eaxinvoke loadbitmap, hinstance, fdbm

8、p1mov hfdbmp1, eaxinvoke selectobject, hfddc1, eax;食物畫片2invoke createcompatibledc, hdcmov hfddc2, eaxinvoke loadbitmap, hinstance, fdbmp2mov hfdbmp2, eax invoke selectobject, hfddc2, eax3初始對話框wndproc proc hwnd:hwnd, umsg:uint, wparam:wparam, lparam:lparamlocal rect:rectlocal ps:posst.if umsg = wm_cl

9、oseinvoke destroywindow, hwnd.elseif umsg = wm_createinvoke getwindowrect, hwnd, addr rectinvoke setwindowpos, hwnd, hwnd_notopmost, rect.left , rect.top, clientw, clienth, swp_nozorder.elseif umsg = wm_initdialog;此時對話框子控件都已經(jīng)初始化好了invoke senddlgitemmessage, hwnd, idc_sbr1, sb_setparts, 3, offset stat

10、uswidthinvoke senddlgitemmessage, hwnd, idc_sbr1, sb_settext, 0, offset helpmsginvoke initbmp, hwndinvoke initgame, hwnd4.小蛇與食物的位置push rect.leftpop ps.xpush rect.toppop ps.ymov eax, ps.xmov ebx, ps.y;ps存放的是下一個位置的坐標5.分配內(nèi)存空間delfromtail proc, ppnode:dwordpushadassume eax:ptr node, ebx:ptr nodemov eax,

11、ppnodemov eax, dword ptr eaxcmp eax, 0je lret.if eax.next = null;只有一個元素,釋放內(nèi)在,將表頭置空invoke localfree, eaxmov eax, ppnodemov dword ptr eax, 0jmp lret.endifmov ebx, eax.next.while ebx.next != nullmov eax, eax.nextmov ebx, ebx.next.endwmov eax.next, nullinvoke localfree, ebx6.調(diào)整鏈表大小addfromheadproc,ppnode

12、:dword, ppos:dwordpushadassume eax:ptr node, edx: ptr posstmov edx, ppospush edxinvoke localalloc, lptr, sizeof(node);會改變edx的值pop edxmov ebx, edx.xmov eax.data.x, ebxmov ebx, edx.y mov eax.data.y, ebxmov ebx, ppnodemov ebx, ebxmov eax.next, ebxpush eaxmov eax, ppnodepop dword ptr eaxassume eax:nothi

13、ng, edx:nothingpopadretaddfromheadendp四系統(tǒng)測試1測試方案及用例 (1)在masmplus里編譯snack.asm,編譯無誤后,接下來進行下一步測試。(2)在所創(chuàng)建的窗口化程序里測試小蛇上,下,左,右,和吃食物及碰撞墻壁和自己發(fā)生的現(xiàn)象。2. 測試結(jié)果及軟件可靠性分析測試編譯顯示無誤,出現(xiàn)界面圖4.1 界面圖測試小蛇吃食物 圖4.2吃食物圖吃食物成功 圖4.3吃食物成功圖碰撞墻壁游戲結(jié)束 圖4.4碰撞墻壁游戲結(jié)束小蛇碰撞自己游戲結(jié)束 圖4.5小蛇碰撞自己游戲結(jié)束圖3游戲規(guī)則貪吃蛇游戲是一款簡單的益智類游戲,規(guī)則很簡單,就是吃屏幕上的食物增加蛇的長度來提高分

14、數(shù),避免蛇撞墻和撞到自己導致游戲結(jié)束。五軟件使用說明書1、運行程序在我們用的軟件masm32的目錄下,我們可以找到snake.exe文件,雙擊就可以打開了。2、玩游戲我們通過鍵盤的上下左右鍵來控制里面我們的那個小蛇的,即鍵盤上的鍵,只需要這四個鍵就可以了。而且有空格鍵可以暫?;蜷_始游戲,esc為退出游戲。 六設(shè)計總結(jié)這個小游戲程序主要用的技術(shù)包括三個方面:第一個方面就是宏的定義及調(diào)用,這個程序當中多次用到宏匯編。這不僅減少了程序的開銷,而且還減少了程序運行的時間和一些存儲空間。第二個方面就是子程序的調(diào)用,這個程序中也有多處用到call的調(diào)用。使用子程序不僅可以提供模塊化程序設(shè)計的條件,而且便于

15、程序的調(diào)試及修改等。第三個方面就是其中的一些跳轉(zhuǎn)的問題,這個用起來有點麻煩,但是這個用起來比較方便,所以文中很多很多的地方都用到這個跳轉(zhuǎn)。比如:jmp,jnc,jc等。在這個游戲的設(shè)計中,其實也遇到很多的困難,比如說一些寄存器使用沖突的問題 ,還有一些是宏的使用問題和當中跳轉(zhuǎn)的問題等。經(jīng)過這一個小游戲程序的設(shè)計,我也深刻體會到這個匯編程序設(shè)計的意義所在了,原本在課堂上學的東西自己現(xiàn)在把它運用到現(xiàn)時的生活中的一些小的問題上,那種感覺和意義是無法用言語表達的, 在這個過程當中我也知道了匯編這門課程的重要性了。參考文獻1 ibm-pc 匯編語言程序設(shè)計 沈美明等 清華大學出版社。 2 8086/80

16、88宏匯編語言程序設(shè)計教程 第二版 王正智/編 電子工業(yè)出版社。3 80x86匯編語言程序設(shè)計教程 楊季文/等編 清華大學出版社。4錢曉捷.匯編語言程序設(shè)計(第二版). 電子工業(yè)出版社, 2003。5羅云彬.windows環(huán)境下32位匯編語言程序設(shè)計(第二版).電子工業(yè)出版社, 2006。6 windows api函數(shù)參考手冊.人民郵電出版社, 2002。致謝 在這將近一周的匯編語言課程設(shè)計里,將我們所學的基礎(chǔ)知識加以應(yīng)用的過程中,在很緊張的時間里完成了這次的課程設(shè)計任務(wù)。但是在這樣很短的時間里完成任務(wù),我們遇到了很多匯編語法知識、程序總體設(shè)計思路、程序編程以及程序代碼調(diào)試困難,幸好在劉樹群老

17、師的指導下,將一個個問題都得以解決,再次特別感謝劉老師在這次課設(shè)中的幫助。并且要感謝我們小組的另外兩名組員,我們各自分工明確并且相互幫助,才完成了這次的課程設(shè)計任務(wù)。團隊是每一個人組成的,只有每一個人分工明確且相互幫助下才能體現(xiàn)出團隊的凝聚力,才能更好的完成每一個任務(wù),在這次的課設(shè)任務(wù)里感謝我們小組以及參與到我們小組的每位成員,謝謝。程序清單.386 .model flat,stdcall option casemap:noneinclude masm32includewindows.incinclude masm32includekernel32.incinclude masm32inclu

18、deuser32.incinclude masm32includegdi32.incinclude rsrc.inc;resource.hinclude masm32includecomctl32.inc;for status barinclude snake.incinclude list.incinclude d:masmplusincludemasm32.inc;for randomincludelib masm32libkernel32.libincludelib masm32libuser32.libincludelib masm32libgdi32.libincludelib ma

19、sm32libcomctl32.libincludelib d:masmpluslibmasm32.libwinmain proto :dword,:dword,:dword,:dwordaboutproc proto, hwnd:hwnd, umsg:uint, wparam:wparam, lparam:lparamwndproc proto hwnd:hwnd, umsg:uint, wparam:wparam, lparam:lparam.data classname dbdlgclass, 0;snakedlg,0 helpmsgdbhelp: space-pause or star

20、t | esc-exit | arrow-direction, 0scoremsgdblength:%d, 0gameoverdbgame over!, 0bkgndclrdd0000dd00h;0x00bbggrrstatuswidth dd280,350,-1gsnakesnakest.data? hinstance hinstance ? commandline lpstr ?hdcdd?hsnkdcdd?hfddc1dd?hfddc2dd?hsnkbmpdd?hfdbmp1dd?hfdbmp2dd?hbrbackground dd ?fpausedd?isoverdd?bufferdb

21、100 dup (?).codestart: invoke initcommoncontrols invoke getmodulehandle, null mov hinstance,eax invoke getcommandline mov commandline,eax invoke winmain, hinstance,null,commandline, sw_showdefault invoke exitprocess,eaxrandom proc _r0:dwordmoveax, _r0imul eax, 23addeax, 123andeax, 7fffhretrandom end

22、p;將改變鏈表頭,沒有返回值addfromheadproc,ppnode:dword, ppos:dwordpushadassume eax:ptr node, edx: ptr posstmov edx, ppospush edxinvoke localalloc, lptr, sizeof(node);會改變edx的值pop edxmov ebx, edx.xmov eax.data.x, ebxmov ebx, edx.y mov eax.data.y, ebxmov ebx, ppnodemov ebx, ebxmov eax.next, ebxpush eaxmov eax, ppn

23、odepop dword ptr eaxassume eax:nothing, edx:nothingpopadretaddfromheadendp;刪除鏈表最后一個元素,無返回值delfromtail proc, ppnode:dwordpushadassume eax:ptr node, ebx:ptr nodemov eax, ppnodemov eax, dword ptr eaxcmp eax, 0je lret.if eax.next = null;只有一個元素,釋放內(nèi)在,將表頭置空invoke localfree, eaxmov eax, ppnodemov dword ptr

24、eax, 0jmp lret.endifmov ebx, eax.next.while ebx.next != nullmov eax, eax.nextmov ebx, ebx.next.endwmov eax.next, nullinvoke localfree, ebxlret:assume eax:nothing, ebx:nothingpopadretdelfromtail endpfreeall proc, ppnode:dwordpush eaxmov eax, ppnodemov eax, eax.while eax != 0push (node ptr eax).nextin

25、voke localfree, eaxpop eax.endwmov eax, ppnodemov dword ptr eax, 0pop eaxretfreeallendpisexistproc, pnode:dword, ppos:dwordpush ebxpush ecxpush edxmov eax, pnodemov edx, pposassume eax:ptr node, edx:ptr posst.while eax != nullmov ebx, eax.data.xmov ecx, eax.data.y.if ebx = edx.x & ecx = edx.ymov eax

26、, true.break.endifmov eax, eax.next.endwassume eax:nothing, edx:nothingpop edxpop ecxpop ebxretisexist endpwinmain proc hinst:hinstance,hprevinst:hinstance,cmdline:lpstr,cmdshow:dword local wc:wndclassex local msg:msg local hdlg:hwnd mov wc.cbsize,sizeof wndclassex mov wc.style, cs_hredraw or cs_vre

27、draw mov wc.lpfnwndproc, offset wndproc mov wc.cbclsextra,null mov wc.cbwndextra,dlgwindowextra push hinst pop wc.hinstanceinvoke createsolidbrush, bkgndclrmov hbrbackground, eax mov wc.hbrbackground,eax mov wc.lpszmenuname, idr_menu1 mov wc.lpszclassname,offset classname invoke loadicon,hinstance,

28、snakeicon mov wc.hicon,eax mov wc.hiconsm,eax invoke loadcursor,null,idc_arrow mov wc.hcursor,eax invoke registerclassex, addr wc invoke createdialogparam,hinstance, idd_dlg1,null,wndproc,null mov hdlg,eax invoke showwindow, hdlg,sw_shownormal invoke updatewindow, hdlg .while true invoke getmessage,

29、 addr msg,null,0,0 .break .if (!eax) ;invoke isdialogmessage, hdlg, addr msg ; .if eax =false invoke translatemessage, addr msg invoke dispatchmessage, addr msg ; .endif .endw mov eax,msg.wparam ret winmain endpgetrandnumproc, max:dwordinvoke gettickcountinvoke random, eaxmov edx, 0;取余div maxmov eax

30、, edxmov ebx, boxsizemov edx, 0div ebxmul ebxretgetrandnumendpcreatefoodproc, psnake:dwordinvoke getrandnum, clientw-boxsizemov ebx, psnakemov (snakest ptr ebx).food.x, eaxinvoke getrandnum, clienth-sbr_men_cap-boxsizemov ebx, psnakemov (snakest ptr ebx).food.y, eaxretcreatefoodendpinitsnakeproc, ps

31、nake:dwordlocal pos:posstpushadmov eax, psnakeassume eax:ptr snakestmov eax.len, 4mov eax.direct, eastmov ecx, 0.while ecx boxsize*4;初始化鏈表,長度為4mov pos.x, ecxmov pos.y, 60;起始位置lea ebx, posinvoke addfromhead, addr eax.header, ebxadd ecx, boxsize.endwassume eax:nothingpopadretinitsnakeendpinitbmp proc,

32、 hwnd:hwndinvoke getdc, hwndmov hdc, eax;蛇體畫片invoke createcompatibledc, hdcmov hsnkdc, eaxinvoke loadbitmap, hinstance, snakebmpmov hsnkbmp, eaxinvoke selectobject, hsnkdc, eax;食物畫片1invoke createcompatibledc, hdcmov hfddc1, eaxinvoke loadbitmap, hinstance, fdbmp1mov hfdbmp1, eaxinvoke selectobject,

33、hfddc1, eax;食物畫片2invoke createcompatibledc, hdcmov hfddc2, eaxinvoke loadbitmap, hinstance, fdbmp2mov hfdbmp2, eaxinvoke selectobject, hfddc2, eaxretinitbmp endpinitgame proc, hwnd:hwndmov fpause, 0mov isover, 0invoke freeall, offset gsnakeinvoke initsnake, offset gsnakeinvoke createfood, offset gsn

34、akeinvoke wsprintf, offset buffer, offset scoremsg, gsnake.leninvoke senddlgitemmessage, hwnd, idc_sbr1, sb_settext, 1, offset bufferinvoke killtimer, hwnd, timeridinvoke settimer, hwnd, timerid, elapse, nullinvoke invalidaterect, hwnd, null, trueretinitgame endpwndproc proc hwnd:hwnd, umsg:uint, wp

35、aram:wparam, lparam:lparamlocal rect:rectlocal ps:posst.if umsg = wm_closeinvoke destroywindow, hwnd.elseif umsg = wm_createinvoke getwindowrect, hwnd, addr rectinvoke setwindowpos, hwnd, hwnd_notopmost, rect.left , rect.top, clientw, clienth, swp_nozorder.elseif umsg = wm_initdialog;此時對話框子控件都已經(jīng)初始化好

36、了invoke senddlgitemmessage, hwnd, idc_sbr1, sb_setparts, 3, offset statuswidthinvoke senddlgitemmessage, hwnd, idc_sbr1, sb_settext, 0, offset helpmsginvoke initbmp, hwndinvoke initgame, hwnd.elseif umsg = wm_timer.if fpause != 0jmp lret.elseif isover != 0not fpauseinvoke messagebox, hwnd, offset ga

37、meover, offset gameover, mb_iconinformationinvoke initgame, hwndjmp lret.endifmov eax, hfddc1xchgeax, hfddc2mov hfddc1, eaxinvoke bitblt, hdc, gsnake.food.x, gsnake.food.y, boxsize, boxsize, hfddc1, 0, 0, srccopymov eax, gsnake.headerpush (node ptr eax).data.xpop rect.leftpush (node ptr eax).data.yp

38、op rect.top.if gsnake.direct = eastadd rect.left, boxsize.elseif gsnake.direct = southadd rect.top, boxsize.elseif gsnake.direct = westsub rect.left, boxsize.elsesub rect.top, boxsize.endifpush rect.leftpop ps.xpush rect.toppop ps.ymov eax, ps.xmov ebx, ps.y;ps存放的是下一個位置的坐標.if eax = gsnake.food.x & e

39、bx = gsnake.food.yinc gsnake.leninvoke wsprintf, offset buffer, offset scoremsg, gsnake.leninvoke senddlgitemmessage, hwnd, idc_sbr1, sb_settext, 1, offset bufferinvoke createfood, offset gsnake.else.if eax clientw | ebx clienth-sbr_men_cap-30;越界mov isover, 1.elseinvoke isexist, gsnake.header, addr

40、ps .if eax = truemov isover, 1.else;/擦除最后一個元素mov eax, gsnake.header.while eax != nullmov ebx, (node ptr eax).nextpush ebx.if ebx = nullpush (node ptr eax).data.xpop rect.leftpush (node ptr eax).data.ypop rect.toppush (node ptr eax).data.xpop rect.rightadd rect.right, boxsizepush (node ptr eax).data.

41、ypop rect.bottomadd rect.bottom, boxsize invoke fillrect, hdc, addr rect, hbrbackground invoke delfromtail, offset gsnake.header.break.endifpop eax.endw.endif.endif.endifinvoke addfromhead, offset gsnake.header, addr psinvoke bitblt, hdc, ps.x, ps.y, boxsize, boxsize, hsnkdc, 0, 0, srccopy.elseif umsg = wm_paintinvoke defwindowproc,hwnd,umsg,wparam,lparaminvoke fillrect, hdc, addr rect, hbrbackgroundinvoke bitblt, hdc, gsnake.food.x, gsnake.food.y, boxsize, boxsize, hfddc

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論