毕业设计论文小游戏贪吃蛇的详细设计.docx
《毕业设计论文小游戏贪吃蛇的详细设计.docx》由会员分享,可在线阅读,更多相关《毕业设计论文小游戏贪吃蛇的详细设计.docx(24页珍藏版)》请在冰豆网上搜索。
毕业设计论文小游戏贪吃蛇的详细设计
摘要
在我们空闲的时候,我们可以用一些我们学过的知识编一些东西,通过这些东西我们可以学习到汇编语言综合应用程序设计方法,还可以提高汇编语言实际应用能力,充分了解计算机硬件和软件,完成理论到实践的推进过程。
这个程序就是用我所学过的汇编知识编的一个小游戏,这个游戏的程序主要就是用汇编宏和子程序的知识来编制而成的,我们用宏和子程序定义了很多的模块,模块也就是在我们的程序中直接可以调用的一个独立的程序。
所以我们编写程序的时候可以很方便的用到它,所以那些基础知识也是我们编写程序的基础。
关键词汇编贪吃蛇小游戏
前言
现在有的一些人感觉生活都是很无聊的,特别是我们这些学生,所以有些时候肯定会玩各种各样的游戏的,有一些大的游戏,玩起来会话掉很多的时间,而且也会花掉大量精力的,所以在一些闲暇的时候一些小游戏会博得很多人的喜爱,例如:
俄罗斯方块,和一些格斗游戏等等。
然而这些小游戏的设计方法和软件有很多,所以也有很多不同的效果,本篇设计是采用汇编中宏定义和调用,子程序的调用等一些汇编知识编制而成的一个贪吃蛇小游戏,通过这个小游戏的制作,我们可以得到很多的益处,一方面我们可以不在浪费平时的一些空闲的时间了,而热中于我们自己喜欢的游戏;另一个方面我们制作完游戏还可以给自己或者别人来享受一下,同时自己也会有一种成就感。
特别当你用自己学到的知识制作出一个东西的时候,或者克服一个困难的时候你就会发现你自己的价值所在了,而且这还能促进你喜欢学习的念头。
一、系统分析……………………………………………………………………
二、系统总体设计……………………………………………………………
三、详细设计……………………………………………………………………
1、窗口化程序……………………………………………………………
2、建立小蛇和食物………………………………………………………
3、初始对话框……………………………………………………………
4、小蛇和食物的位置………………………………………………………
5、分配内存空间……………………………………………………………
6、调整链表大小……………………………………………………………
四、系统测试……………………………………………………………………
1测试方案及用例…………………………………………………………
2.测试结果及软件可靠性分析……………………………………………
3.游戏规则……………………………………………………………………
五、软件使用说明书……………………………………………………………
六、设计总结……………………………………………………………………
参考文献…………………………………………………………………………
致谢………………………………………………………………………………
程序清单………………………………………………………………………
一、系统分析
这个程序的总体的思想也就是主要用的就是宏和子程序的定义和调用,首先,定义了5个宏它们分别为:
屏幕初始化宏定义
在光标位置显示字符和属性定义
显示字符串宏定义
置光标位置宏定义
读光标位置的字符和属性宏定义。
它们在程序中起到主要的作用。
其次,就是子程序定义了,程序中定义了很多的子程序,其中有:
控制子程序
食物子程序,还有记分子程序等。
它们首先被主程序调用,然后它们之间再互相调用,这样构成了完整的游戏程序并实现其功能。
具体的设计思想是:
第一,对数据进行初始化,即对寄存器的初始化,比如对食物的初始化等。
第二,开始运行,判断是否符合条件,如果符合赢的条件的话,就会跳转到赢的那个子程序下,然后那个赢的子程序会调用记分的那个子程序,最后显示赢的信息和分数后再转到控制程序执行控制和其后的程序。
如果要是输的话,就会跳转到输的那个子程序下,然后那个输的子程序也会调用记分的那个子程序,最后显示得分和信息。
如果要是没有赢也没有输的话,那程序会跳到控制的子程序中,等控制完以后程序又会跳到程序判断的那个地方重复的执行。
这个就是完成这个游戏程序的整个思想。
二、系统总体设计
这个程序完成的功能就是和别的游戏一样,最初,给出一个初始化的界面,和一个4个方块组成的小蛇,我们要把那个最初给出那个小蛇穿过那个闪烁的小红黄相间的小方块,然后那个小方块就会变成我们那个小蛇上的组成单元一样的一个小方块,和在别的地方会在出现另一个小方块,我们接下来要做的就是要把那个小方块穿过来,然后我们那个小蛇就会变长了,然后在穿过小方块,就这样重复的做就行了,随着你的穿过你的小蛇就会越来越长了,这是你的得分就会越高,同时你难度也会变大的,因为如果你要碰到四周的变的话,或者你自己的那个小蛇首尾要是相连的话你就会输了,所以当你那个小蛇很长的时候,难度自然就会变大了。
动画贪吃蛇程序的流程图
三.详细设计
1.窗口化程序
.data
ClassNamedb"DLGCLASS",0;"snakeDlg",0
helpMsgdb"Help:
[Space]-PauseorStart|[Esc]-Exit|[Arrow]-Direction",0
scoreMsgdb"Length:
%d",0
gameoverdb"GAMEOVER!
",0
BkgndClrdd0000dd00h;0x00bbggrr
statusWidthdd280,350,-1
gSnakeSnakeSt<>
2.建立小蛇和食物
InitBmpproc,hWnd:
HWND
invokeGetDC,hWnd
movhdc,eax
;蛇体画片
invokeCreateCompatibleDC,hdc
movhSnkDC,eax
invokeLoadBitmap,hInstance,SnakeBmp
movhSnkBmp,eax
invokeSelectObject,hSnkDC,eax
;食物画片1
invokeCreateCompatibleDC,hdc
movhFdDC1,eax
invokeLoadBitmap,hInstance,FdBmp1
movhFdBmp1,eax
invokeSelectObject,hFdDC1,eax
;食物画片2
invokeCreateCompatibleDC,hdc
movhFdDC2,eax
invokeLoadBitmap,hInstance,FdBmp2
movhFdBmp2,eax
invokeSelectObject,hFdDC2,eax
3.初始对话框
WndProcprochWnd:
HWND,uMsg:
UINT,wParam:
WPARAM,lParam:
LPARAM
LOCALrect:
RECT
LOCALps:
PosSt
.ifuMsg==WM_CLOSE
invokeDestroyWindow,hWnd
.elseifuMsg==WM_CREATE
invokeGetWindowRect,hWnd,addrrect
invokeSetWindowPos,hWnd,HWND_NOTOPMOST,rect.left,rect.top,CLIENTW,CLIENTH,SWP_NOZORDER
.elseifuMsg==WM_INITDIALOG;此时对话框子控件都已经初始化好了
invokeSendDlgItemMessage,hWnd,IDC_SBR1,SB_SETPARTS,3,offsetstatusWidth
invokeSendDlgItemMessage,hWnd,IDC_SBR1,SB_SETTEXT,0,offsethelpMsg
invokeInitBmp,hWnd
invokeInitGame,hWnd
4.小蛇与食物的位置
pushrect.left
popps.x
pushrect.top
popps.y
moveax,ps.x
movebx,ps.y;ps存放的是下一个位置的坐标
5.分配内存空间
DelFromTailproc,ppNode:
dword
pushad
assumeeax:
ptrNode,ebx:
ptrNode
moveax,ppNode
moveax,dwordptr[eax]
cmpeax,0
jeLRET
.if[eax].next==NULL;只有一个元素,释放内在,将表头置空
invokeLocalFree,eax
moveax,ppNode
movDWORDptr[eax],0
jmpLRET
.endif
movebx,[eax].next
.while[ebx].next!
=NULL
moveax,[eax].next
movebx,[ebx].next
.endw
mov[eax].next,NULL
invokeLocalFree,ebx
6.调整链表大小
AddFromHeadproc,ppNode:
dword,pPos:
dword
pushad
assumeeax:
ptrNode,edx:
ptrPosSt
movedx,pPos
pushedx
invokeLocalAlloc,LPTR,sizeof(Node);会改变edx的值
popedx
movebx,[edx].x
mov[eax].data.x,ebx
movebx,[edx].y
mov[eax].data.y,ebx
movebx,ppNode
movebx,[ebx]
mov[eax].next,ebx
pusheax
moveax,ppNode
popDWORDptr[eax]
assumeeax:
nothing,edx:
nothing
popad
ret
AddFromHeadendp
四.系统测试
1.测试方案及用例
(1)在MASMPlus里编译snack.asm,编译无误后,接下来进行下一步测试。
(2)在所创建的窗口化程序里测试小蛇上,下,左,右,和吃食物及碰撞墙壁和自己发生的现象。
2.测试结果及软件可靠性分析
测试编译显示无误,出现界面
图4.1界面图
测试小蛇吃食物
图4.2吃食物图
吃食物成功
图4.3吃食物成功图
碰撞墙壁游戏结束
图4.4碰撞墙壁游戏结束
小蛇碰撞自己游戏结束
图4.5小蛇碰撞自己游戏结束图
3.游戏规则
贪吃蛇游戏是一款简单的益智类游戏,规则很简单,就是吃屏幕上的食物增加蛇的长度来提高分数,避免蛇撞墙和撞到自己导致游戏结束。
五.软件使用说明书
1、运行程序
在我们用的软件MASM32的目录下,我们可以找到snake.exe文件,双击就可以打开了。
2、玩游戏
我们通过键盘的上下左右键来控制里面我们的那个小蛇的,即键盘上的键,只需要
这四个键就可以了。
而且有空格键可以暂停或开始游戏,esc为退出游戏。
六.设计总结
这个小游戏程序主要用的技术包括三个方面:
第一个方面就是宏的定义及调用,这个程序当中多次用到宏汇编。
这不仅减少了程序的开销,而且还减少了程序运行的时间和一些存储空间。
第二个方面就是子程序的调用,这个程序中也有多处用到CALL的调用。
使用子程序不仅可以提供模块化程序设计的条件,而且便于程序的调试及修改等。
第三个方面就是其中的一些跳转的问题,这个用起来有点麻烦,但是这个用起来比较方便,所以文中很多很多的地方都用到这个跳转。
比如:
JMP,JNC,JC等。
在这个游戏的设计中,其实也遇到很多的困难,比如说一些寄存器使用冲突的问题,还有一些是宏的使用问题和当中跳转的问题等。
经过这一个小游戏程序的设计,我也深刻体会到这个汇编程序设计的意义所在了,原本在课堂上学的东西自己现在把它运用到现时的生活中的一些小的问题上,那种感觉和意义是无法用言语表达的,在这个过程当中我也知道了汇编这门课程的重要性了。
参考文献
1IBM-PC汇编语言程序设计沈美明等清华大学出版社。
28086/8088宏汇编语言程序设计教程第二版王正智/编电子工业出版社。
380X86汇编语言程序设计教程杨季文/等编清华大学出版社。
4钱晓捷.汇编语言程序设计(第二版).电子工业出版社,2003。
5罗云彬.Windows环境下32位汇编语言程序设计(第二版).电子工业出版社,2006。
6WindowsAPI函数参考手册.人民邮电出版社,2002。
致谢
在这将近一周的汇编语言课程设计里,将我们所学的基础知识加以应用的过程中,在很紧张的时间里完成了这次的课程设计任务。
但是在这样很短的时间里完成任务,我们遇到了很多汇编语法知识、程序总体设计思路、程序编程以及程序代码调试困难,幸好在刘树群老师的指导下,将一个个问题都得以解决,再次特别感谢刘老师在这次课设中的帮助。
并且要感谢我们小组的另外两名组员,我们各自分工明确并且相互帮助,才完成了这次的课程设计任务。
团队是每一个人组成的,只有每一个人分工明确且相互帮助下才能体现出团队的凝聚力,才能更好的完成每一个任务,在这次的课设任务里感谢我们小组以及参与到我们小组的每位成员,谢谢。
程序清单
.386
.modelflat,stdcall
optioncasemap:
none
include\masm32\include\windows.inc
include\masm32\include\kernel32.inc
include\masm32\include\user32.inc
include\masm32\include\gdi32.inc
includersrc.inc;resource.h
include\masm32\include\comctl32.inc;forstatusbar
includesnake.inc
includelist.inc
included:
\masmplus\include\masm32.inc;forRandom
includelib\masm32\lib\kernel32.lib
includelib\masm32\lib\user32.lib
includelib\masm32\lib\gdi32.lib
includelib\masm32\lib\comctl32.lib
includelibd:
\masmplus\lib\masm32.lib
WinMainproto:
DWORD,:
DWORD,:
DWORD,:
DWORD
AboutProcproto,hWnd:
HWND,uMsg:
UINT,wParam:
WPARAM,lParam:
LPARAM
WndProcprotohWnd:
HWND,uMsg:
UINT,wParam:
WPARAM,lParam:
LPARAM
.data
ClassNamedb"DLGCLASS",0;"snakeDlg",0
helpMsgdb"Help:
[Space]-PauseorStart|[Esc]-Exit|[Arrow]-Direction",0
scoreMsgdb"Length:
%d",0
gameoverdb"GAMEOVER!
",0
BkgndClrdd0000dd00h;0x00bbggrr
statusWidthdd280,350,-1
gSnakeSnakeSt<>
.data?
hInstanceHINSTANCE?
CommandLineLPSTR?
hdcdd?
hSnkDCdd?
hFdDC1dd?
hFdDC2dd?
hSnkBmpdd?
hFdBmp1dd?
hFdBmp2dd?
hbrBackgrounddd?
fPausedd?
isOverdd?
bufferdb100dup(?
)
.code
start:
invokeInitCommonControls
invokeGetModuleHandle,NULL
movhInstance,eax
invokeGetCommandLine
movCommandLine,eax
invokeWinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
invokeExitProcess,eax
Randomproc_r0:
DWORD
moveax,_r0
imuleax,23
addeax,123
andeax,7FFFH
ret
Randomendp
;将改变链表头,没有返回值
AddFromHeadproc,ppNode:
dword,pPos:
dword
pushad
assumeeax:
ptrNode,edx:
ptrPosSt
movedx,pPos
pushedx
invokeLocalAlloc,LPTR,sizeof(Node);会改变edx的值
popedx
movebx,[edx].x
mov[eax].data.x,ebx
movebx,[edx].y
mov[eax].data.y,ebx
movebx,ppNode
movebx,[ebx]
mov[eax].next,ebx
pusheax
moveax,ppNode
popDWORDptr[eax]
assumeeax:
nothing,edx:
nothing
popad
ret
AddFromHeadendp
;删除链表最后一个元素,无返回值
DelFromTailproc,ppNode:
dword
pushad
assumeeax:
ptrNode,ebx:
ptrNode
moveax,ppNode
moveax,dwordptr[eax]
cmpeax,0
jeLRET
.if[eax].next==NULL;只有一个元素,释放内在,将表头置空
invokeLocalFree,eax
moveax,ppNode
movDWORDptr[eax],0
jmpLRET
.endif
movebx,[eax].next
.while[ebx].next!
=NULL
moveax,[eax].next
movebx,[ebx].next
.endw
mov[eax].next,NULL
invokeLocalFree,ebx
LRET:
assumeeax:
nothing,ebx:
nothing
popad
ret
DelFromTailendp
FreeAllproc,ppNode:
dword
pusheax
moveax,ppNode
moveax,[eax]
.whileeax!
=0
push(Nodeptr[eax]).next
invokeLocalFree,eax
popeax
.endw
moveax,ppNode
movdwordptr[eax],0
popeax
ret
FreeAllendp
IsExistproc,pNode:
dword,pPos:
dword
pushebx
pushecx
pushedx
moveax,pNode
movedx,pPos
assumeeax:
ptrNode,edx:
ptrPosSt
.whileeax!
=NULL
movebx,[eax].data.x
movecx,[eax].data.y
.ifebx==[edx].x&&ecx==[edx].y
moveax,TRUE
.break
.endif
moveax,[eax].next
.endw
assumeeax:
nothing,edx:
nothing
popedx
popecx
popebx
ret
IsExistendp
WinMainprochInst:
HINSTANCE,hPrevInst:
HINSTANCE,CmdLine:
LPSTR,CmdShow:
DWORD
LOCALwc:
WNDCLASSEX
LOCALmsg:
MSG
LOCALhDlg:
HWND
movwc.cbSize,SIZEOFWNDCLASSEX
movwc.style,CS_HREDRAWorCS_VREDRAW
movwc.lpfnWndProc,OFFSETWndProc
movwc.cbClsExtra,NULL
movwc.cbWndExtra,DLGWINDOWEXTRA
pushhInst
popwc.hInstance
invokeCreateSolidBrush,BkgndClr
movhbrBackground,eax
movwc.hbrBackground,eax
movwc.lpszMenuName,IDR_MENU1
movwc.lpszClassName,OFFSETClassName
invokeLoadIcon,hInstance,SnakeIcon
movwc.hIcon,eax
movwc.hIconSm,eax
invokeLoadCursor,NULL,IDC_ARROW
movwc.hCursor,eax
invokeRegisterClassEx,addrwc
invokeCreateDialogParam,hInstance,IDD_DLG1,NULL,WndProc,NULL
movhDlg,eax
invokeShowWindow,hDlg,SW_SHOWNORMAL
invokeUpdateWindow,hDlg
.WHILETRUE
invokeGetMessage,ADDRm