汇编语言推箱子课程设计.doc_第1页
汇编语言推箱子课程设计.doc_第2页
汇编语言推箱子课程设计.doc_第3页
汇编语言推箱子课程设计.doc_第4页
汇编语言推箱子课程设计.doc_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘 要本次课程设计是通过编写汇编语言程序,实现字符图形的显示,我们这组是每人用汇编语言程序实现不同的字符显示,我的是显示字符安全。具体实现方法可以在DOS环境下完成。编写完程序后分析并理解每条程序的意思,并解释主要程序的意思,最后调试出所要求的字符。在程序编写前,我首先对自己显示的图形进行了设计,确定了每个数字相对于前一个数字的位置,以便在编写程序的时候正确定义字符的属性,也为在显示的时候能够显示较好的效果,打下了基础。本次实验实验的编写环境是MASM,编译、链接也是在该环境下实现的。程序的运行我使用的是DOS环境。通过参考网上的一些原程序,我发现要编写好该程序,首先应该对BIOS的中断10熟悉,因此程序编写前,我先认真学习了该BIOS中断的有关功能。万事开头难,一旦了解了设计此程序的原理,并在此基础上掌握相关的技术,其他的工作也就跟着展开来。 本次课程设计,是使用汇编作为开发语言实现功能要求。总所周知,汇编是一个低级语言,对硬件有很大的依赖性,在使用上也不及高级语言方便,但其在执行效率上比高级语言有很大的优势。本次课程设计,一方面让我们再次熟悉汇编指令,再次对算法的设计有一定的要求。另一方面让我们对较大汇编程序的编写有一个清晰的过程,学习把一个教大问题分解成若干个小问题,即子程序是一个良好的编程习惯。掌握汇编指令,学习的理论知识应用于解决实际的问题。关键词:推箱子,休闲娱乐,拓展思维AbstractThis course is designed by write assembly language program to realize the character graphic display, each of our group is in assembly language program to realize the different characters, according to my is the character - security. Concrete implementation method can be done in the DOS environment. After writing the program analysis and understand the meaning of each program, and explain the meaning of the main program, the final debugging the required characters. Before I write, I first has carried on the design to their own display graphics, identified before every number relative to the position of a number, so that at the time of write programs correctly define the character attributes, also for the display of time can show good effect, laid the foundation. This experiment experimental writing environment is MASM, compile, link, also is in the ?The curriculum design, assembly as a development language realization is the use of functional requirements. Known, the assembly is a low-level language, have great dependence on hardware, also as a high-level language in use is convenient, but its on the execution efficiency than a high-level language has a great advantage. The curriculum design, on the one hand, let us be familiar with assembly instruction again and again to the design of algorithm has certain requirements. On the other hand let us on large assembler. Write a clear, the process of learning a teaching big problem is decomposed into several small problems, namely the subroutine is a good programming habits. Master the assembly instruction, learning theoretical knowledge is applied to solve the actual problem.Key words: Sokoban game, recreation, creative thinking目 录 摘 要11、绪论41.1课题研究背景和意义41.2推箱子游戏发展现状41.3设计方案52、程序设计说明及代码72.1初始化模块72.2功能控制模块(功能实现)122.3游戏数据模块162.4游戏设计模块182.4.1. 数据类的设计与实现182.4.2设定数据结构183、游戏数据流程和设计方案203.1数据流程和功能介绍203.2设计目的203.3主流程界面设计203.4游戏设计任务和功能21 4.程序调试记录24 5总结28参考文献29致 谢30 291、绪论1.1课题研究背景和意义推箱子是一款来自日本的古老游戏,其设计目的是训练人的逻辑思维能力。游戏场景一般是设定在空间狭小的仓库中,要求把箱子摆放到指定位置。这就要求玩家巧妙的运用有限的空间和通道,合理的安排箱子的位置和移动次序才可能完成任务。随着计算机游戏的发展,很多编程爱好者基于该游戏的思想开发了出各种版本、各种类型的推箱子。这其中也包括很多手机版本的实现,伴随着手机与计算机的普及,很快推箱子游戏便进入了千家万户。如今,游戏机风行的程度,是第一台电子游戏机的研制者诺兰?布什纳尔先生始料不及的。在全世界最大的城市,直至最小的村庄,从纽约最辉煌的游乐场,到高加索最小的乡镇儿童娱乐点,在千家万户,正在进行着千千万万这样的“战斗”,伴随着无数成功与失败,兴奋与懊丧。游戏机带来了一个全球性的疯狂症,其他任何娱乐与之相比都望尘莫及。然而,究竟是什么原因使游戏机如此风行呢?在回顾了游戏机发展简史之后,我们不难悟出,技术进步在游戏机发展过程中起到了极大的促进作用。但是,技术进步绝不是游戏机风行的唯一因素。随着终端设备开发能力的加强,作为娱乐终端的游戏机也得到了很大程度的发展。这也加速了游戏机在全球风行程度,所以对于游戏机的研究和设计具有很重要的意义,这也是本课题研究的来源。1.2推箱子游戏发展现状本文针对推箱子游戏机的设计首先介绍了选题的要求,之后详细叙述了软件和硬件的设计过程。最后论文对设计进行了总结,对设计中可以进一步改善的地方提出了建议。在时钟脉冲的作用下,各个按键都能按照事先设定好的规则进行游戏控制。确定键能使界面从初始化显示切换到游戏界面显示,上下左右键控制箱子的移动方向,如果可以移动则移动方块同时跟踪人物的位置及刷新动态数组的内容。在游戏的同时程序会随时记录玩家所走的游戏步数、游戏时间,直至本关通过,在进入下一关的同时更新地图并刷新游戏步数和时间。选关键用于选择游戏关数,在游戏过程中这个键任何时候都有效,当按下选关键后,游戏地图返回第一关,再次按下时游戏进入二关,这样每按下一次键游戏关数加一,如果游戏到了第最后一关将自动返回第一关1.3设计方案1.3.1. 模块划分本游戏分五个模块(1)初始化模块,对游戏界面进行初始化操作,包括界面切换、控制声音播放和游戏的暂停与恢复,以及手机返回键的设置。(2)功能实现模块,主要是对游戏中各个环节进行绘制,设计出系统地图,记录玩家所用步骤,对玩家触屏的设定,针对不同的手机分辨率绘制界面,音乐功能调用,游戏中所有文字的提示信息以及游戏中背景和文字颜色大小等设置的实现。(3)游戏设计模块,实现玩家控制小乌龟的操作,使之能够操作箱子到各个位置,以完成游戏设定的任务。(4)游戏数据模块,主要是对玩家编辑的自定义地图和玩家选择系统设置状态的保存,以及游戏数据合理性的判断。(5)功能控制模块,控制游戏功能的实现,包括创建菜单、调用系统音乐、获取当前系统状态、获取游戏界面图标等参数、保存游戏。1.3.2 系统功能结构图图1.1系统功能结构图2、程序设计说明及代码2.1初始化模块(1)设计游戏所需的一个简单的窗口应用程序,程序预处理部分包括加载头文件、定义全局变量和定义数据结构,并对它们进行初始化工作,游戏从第一关开始,按上下左右方向键控制小人移动来推动箱子,可以在游戏中的任何时候按Esc键退出。如果游戏无成功希望,可以按空格键回到当前任务的开始状态;如果成功完成当前关,则进入下一关,如果当前关是最后一关,则显示通关信息,提示游戏结束。【程序如下】:.386.model flat,stdcalloption casemap:noneinclude CBox.incinclude StoreHouse.inc.const MAP_TOP equ 32 MAP_LEFT equ 1 xBmBack dd 0 xBmWall dd 30 xBmRoad dd 60 xBmBox1 dd 90 xBmBox2 dd 120 xBmObject dd 150 xBmMan dd 180 szCaption db RedBox,0 szLoadError db Load Resource Error! ,0 szAlreadyMaxGate db Already Max Gate!,0 szOutOfRange db Out of Range!,0 szSuccessMsg db Your are success!,13,10,Are you want to next gate?,0 FmtStr db val = %d,0 FmtGate db - No.%d,0.data? bmToolbar dd ? BackDc dd ? hBitMap dd ? szErrorMessage db 256 dup (?) Map db 14D*12D dup (?) ; 14 x 12 Grid ManXPos dd ? ManYPos dd ? CurrGate dd ? CurrStep dd ? .codestart:invoke GetModuleHandle,NULLmov hInstance,eaxinvoke GetCommandLinemov CommandLine,eaxinvoke InitCommonControlsinvoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULTinvoke ExitProcess,eaxWinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORDLOCALwc:WNDCLASSEXLOCALmsg:MSGmovwc.cbSize,SIZEOF WNDCLASSEXmovwc.style,CS_HREDRAW or CS_VREDRAWmovwc.lpfnWndProc,OFFSET WndProcmovwc.cbClsExtra,NULLmovwc.cbWndExtra,DLGWINDOWEXTRApushhInstpopwc.hInstancemovwc.hbrBackground,COLOR_BTNFACE+1movwc.lpszMenuName,OFFSET MenuNamemovwc.lpszClassName,OFFSET ClassNameinvoke LoadIcon,NULL,IDI_APPLICATIONmovwc.hIcon,eaxmovwc.hIconSm,eaxinvoke LoadCursor,NULL,IDC_ARROWmovwc.hCursor,eaxinvoke RegisterClassEx,addr wcinvoke CreateDialogParam,hInstance,addr DlgName,NULL,addr WndProc,NULLinvoke ShowWindow,hWnd,SW_SHOWNORMALinvoke UpdateWindow,hWnd.while TRUEinvoke GetMessage,addr msg,NULL,0,0 .BREAK .if !eaxinvoke TranslateMessage,addr msginvoke DispatchMessage,addr msg.endwmoveax,msg.wParamretWinMain endpWndProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAMLOCAL ps :PAINTSTRUCTLOCAL Dc:HDCmoveax,uMsg.if eax = WM_KEYDOWN invoke KeyDownProc,wParam.elseif eax=WM_INITDIALOGpushhWinpophWndinvoke GetDlgItem,hWin,IDC_TBRMAINinvoke DoToolBar,hInstance,eaxinvoke LoadRes.if eax = FALSE invoke MessageBox,hWin,Addr szErrorMessage, Addr szLoadError,MB_ICONERROR.endifinvoke InitStBarinvoke SelectGate,1.elseif eax=WM_COMMANDmoveax,wParamandeax,0FFFFh.if eax=IDM_FILE_EXITinvoke SendMessage,hWin,WM_CLOSE,0,0.elseif eax=IDM_HELP_ABOUTinvoke ShellAbout,hWin,addr AppName,addr AboutMsg,NULL.elseif eax = IDC_TBB_NEW invoke SelectGate,CurrGate.elseif eax = IDC_TBB_PREV mov eax, CurrGate dec eax invoke SelectGate,eax.elseif eax = IDC_TBB_NEXT invoke NextGate.elseif eax = IDC_TBB_ABOUT invoke ShellAbout,hWnd,Addr AppName,Addr AboutMsg,NULL .endif.elseif eax=WM_PAINT invoke BeginPaint,hWin,Addr ps mov Dc,eax invoke WMPaint,Dc invoke EndPaint,hWin,Addr ps.elseif eax=WM_CLOSEinvoke DestroyWindow,hWin.elseif uMsg=WM_DESTROY invoke FreeResinvoke PostQuitMessage,NULL .elseinvoke DefWindowProc,hWin,uMsg,wParam,lParamret.endifxor eax,eaxret2.2功能控制模块(功能实现)(2)小人移动的方向有4个,move()函数(处理小人移动的函数)对这4个方向移动的处理都一致,只是调用函数时的参数有所不同。首先判断小人移动的方向,然后根据小人所处世的当前状态、下一步状态或者下下一步状态进行适当的处理。KeyDownProc endpManMove proc vKey :DWORDLOCAL NewX:DWORDLOCAL NewY:DWORDLOCAL NewX2 :DWORDLOCAL NewY2 :DWORDLOCAL M1 :byteLOCAL M2 :byteLOCAL nPos1 :DWORDLOCAL nPos2 :DWORD push esi mov eax,ManXPos mov NewX,eax mov NewX2,eax mov eax,ManYPos mov NewY,eax mov NewY2,eax mov eax ,vKey .if eax = VK_UP dec NewY dec NewY2 dec NewY2 .elseif eax = VK_DOWN inc NewY inc NewY2 inc NewY2 .elseif eax = VK_LEFT dec NewX dec NewX2 dec NewX2 .elseif eax = VK_RIGHT inc NewX inc NewX2 inc NewX2 .else ret .endif mov esi ,offset Map ; Pos = y*14 + x ; Get M1 mov eax,NewY mov ebx,14D mul bx add eax,NewX mov ebx,eax mov nPos1,eax mov al ,esiebx mov M1,al ; Get M2 mov eax,NewY2 mov ebx,14D mul bx add eax,NewX2 mov ebx,eax mov nPos2,eax mov al ,esiebx mov M2,al mov al,M1 .if (al = MAP_ROAD | al = MAP_OBJECT ) push NewX pop ManXPos push NewY pop ManYPos .elseif al = MAP_BOX1 ; push box mov al ,M2 .if al = MAP_ROAD ; push ok mov ebx,nPos2 mov al,MAP_BOX1 mov esiebx,al mov ebx,nPos1 mov al,MAP_ROAD mov esiebx,al push NewX pop ManXPos push NewY pop ManYPos .elseif al = MAP_OBJECT mov ebx,nPos2 mov al,MAP_BOX2 mov esiebx,al mov ebx,nPos1 mov al,MAP_ROAD mov esiebx,al push NewX pop ManXPos push NewY pop ManYPos .endif .elseif al = MAP_BOX2 mov al,M2 .if al = MAP_ROAD mov ebx,nPos2 mov al,MAP_BOX1 mov esiebx,al mov ebx,nPos1 mov al,MAP_OBJECT mov esiebx,al push NewX pop ManXPos push NewY pop ManYPos .elseif al = MAP_OBJECT mov ebx,nPos2 mov al,MAP_BOX2 mov esiebx,al mov ebx,nPos1 mov al,MAP_OBJECT mov esiebx,al push NewX pop ManXPos push NewY pop ManYPos .endif .else .endif invoke Repaint pop esi ret2.3游戏数据模块(3)函数实现的功能分别是人空地移动箱子到空地、从目的地移动箱子到空地、从空地移动箱子到目的地和中从目的地移动箱子到目的地。X、y指明小人当前所处的位置,字符a表示移动的方向,有“u”、“d”、“l”和“r”4个值,分别表示向上、下、左、右移动。这几个函数的实现原理大致相似。对于前面两个函数,首先判断移动的方向,人小人所在的位置沿着移动的方向移动一步画小人,移动两步画箱子,并设置状态为“b”;对于后面两个参数,首先判断移动的方向,从小人所在的位置沿着移动方向移动一步画小人,移动两上在目的地画箱子,并设置状态为“i”,表明箱子在目的地上。ManMove endpXYtoPos proc x:DWORD,y:DWORD; pos = y *14 + x Zero-Based mov eax, y mov ebx, 14D mul bx add eax ,x retXYtoPos endpRepaint proc LOCAL R:RECT invoke GetClientRect,hWnd,Addr R invoke InvalidateRect,hWnd,Addr R,0 retRepaint endpCheck proc ; Check Success and return true or falseLOCAL Result :DWORD push esi push TRUE pop Result lea esi,Map mov ecx, 14D*12D mov ebx ,01: mov al ,esiebx inc ebx cmp al,MAP_OBJECT jz 2 dec ecx jnz 1 jmp ExitCheck2: push FALSE pop ResultExitCheck: mov eax,Result pop esi ret2.4游戏设计模块2.4.1. 数据类的设计与实现该类主要用于对地图数据的保存与提取,在保存时,判断玩家编辑的地图是否合理,如果不合理则提示相应信息,只有合理的地图才能保存。在提取地图信息的时候也进行一次检查,如果编辑地图不合理则载入默认设置。关键代码及说明如下:通过public static boolean exportDataToFile(int editDataArray)方法将地图数据写入到文件中;通过public static boolean checkUserFile()检查用户编辑数据是否合理;通过public static int importDataFromFile()从文件中读取数据载入地图。2.4.2设定数据结构例如行列数必须在15*15之间,玩家绘制地图时,当前所选游标实现添加、删除、替代等功能,判断玩家是否完成任务。Check endpInitStBar procLOCAL StbarHandle :DWORD invoke GetDlgItem,hWnd,IDC_SBR1 mov StbarHandle,eax invoke SendMessage,StbarHandle,SB_SIMPLE,1,0 ;invoke SendMessage,StbarHandle,SB_SETPARTS,1,150 retInitStBar endpShowMessage proc Val:DWORD push eax invoke wsprintf,Addr szErrorMessage,Addr FmtStr,Val invoke MessageBox,hWnd,Addr szErrorMessage,Addr szCaption,MB_ICONINFORMATION pop eax retShowMessage endpend start3、游戏数据流程和设计方案3.1数据流程和功能介绍本设计基本实现了可以在PC平台上运行的推箱子游戏,本游戏分五个模块:1、初始化模块;2、功能实现模块;3、游戏设计模块;4、游戏数据模块;5、功能控制模块。本游戏是一款益智类游戏,所以操作十分简单。游戏中玩家可以用键盘的上、下、左、右键控制小人的移动位置,也可以直接触摸手机屏幕完成相应操作。游戏规则也十分简单,玩家在一个有限空间内,将木箱放到指定的位置。箱子只能推不能拉,而且一次只能推动一个箱子,胜利条件是把所有箱子都推到目的地。3.2设计目的(1)此次的设计是开发一款可在PC平台上运行的推箱子游戏程序,可流畅运行游戏,编辑地图等(2)进一步学习和掌握汇编语言程序的编写和应用的方法,通过较大规模程序的编写,提高编写汇编语言程序的水平和学习程序调试方法。3.3主流程界面设计在策划推箱子游戏时,首要考虑到要设计一个优美的游戏界面,操作起来更加人性化,即玩家可以用键盘的上、下、左、右键控制小乌龟的移动位置,也可以直接触摸手机屏幕完成相应操作。在画面方面也要更加清新,方便各个年龄段的玩家使用。我对这个游戏的定义是一个轻量级的益智游戏,不存在复杂的情节,做的主要工作为设计游戏各关仓库的形状、大小、可通过区域、各关中箱子的初始位置与目的地。当然在正式开始编写程序时,需要上网搜集了游戏中要用到的图片、声音等,收集一些有用的素材。推箱子游戏初始化模块画图模块移动箱子模块移动小人模块功能控制模块图2.1 界面设计图图2.2数据流程图3.4游戏设计任务和功能3.4.1. 基本要求 (1)每关卡箱子数目不定;(2)主角和箱子只能呆在通道及目标位置上移动,不能穿墙;(3)主角不能穿过箱子;(4)箱子数量和目标位置数量相等(但每个箱子并不和唯一的目标位置一 一对应);(5)主角可以移动和推动木箱(响应键盘方向键);(6)主角只能往前推动箱子,不能向后或者向侧面拉箱子;(7)主角不能同时推动两个箱子;(8)箱子移动方向正前方紧挨墙壁,不可推动;(9)允许撤销以及重做游戏步骤;(10)将所有箱子推到设定位置则通过本关,自动进入下一关卡; (11)记录每一关中玩家的移动步数;3.4.2. 地图编辑器(1)可通过地图编辑器生成地图;(2)地图由小正方块拼接组成;(3)地图中每一格可以是墙、通道、木箱、目标位置;(4)游戏主角所在位置同时必须是通道或者目标位置;(5)一张地图中主角数目有且仅有一个;(6)一张地图中箱子数目必须与目标位置数目相等;(7)允许对正在编辑的地图清除或者替换某一格中的内容;(8)地图中一格不允许墙、通道、木箱、目标位置中两个及以上共存,最 后添加的类型为该格代表的类型; (9)通过地图编辑器生成的地图可以被游戏程序调用;3.4.3. 扩展功能(1)保存自定义地图,重启程序后依然可以编辑和调用运行该地图;(2)屏幕分辨率自适应;(3)资源文件支持简体中文和英文; (4)菜单功能,玩家通过看目录按对应的键可以进入对应的功能菜单,其中1进入游戏,2选择游戏关卡,3游戏帮助指南 ,4退出游戏。(5) 游戏功能: 玩家可以通过操纵键盘中的上下左右键进入游戏进行各种操作来完成游戏。(6)循环功能:当玩家正在游戏的时候如果某一步走错了,导致游戏无法完成,可以随时重新开始游戏来完成关卡,游戏过程中可以随时按Ctrl+V退出游戏。(7)顺序功能: 当玩家完成了某一关之后,随着进入下一关门可以按顺序进入下一关,继续开始更有挑战的关卡,如果该关是最后一关,则显示通关完成。4.程序调试记录 程序调试,是将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法错误和逻辑错误的过程。这是保证游戏正常运行的必不可少的步骤。编完计算机程序,得调试所写程序是否正确,是否能满足所要求的功能启动游戏后便可直接进入游戏主界面,主界面上玩家可以自由选择对游戏的操作。该游戏的运行步骤与调试结果如下:1. 启动游戏后游戏主界面,效果如图所示。图3.1游戏启动图2.当你完成某一关卡时,弹出一对话框,点击“确定”进行下一关卡,点击“取消”继续该关卡。图3.2通关图3. 点击“,”即可进入玩家自己已经编辑好的游戏中,界面设计和系统设置的关卡相同,过关之后,自动进入系统设置的第一关卡。效果如图所示。图3.3选择关卡图4. 点击“文件”,即可进入玩家自行编译游戏仓库中。玩家可以在该标题栏中选择关卡难度或退出该游戏。图3.4自行编译关卡图5. 点击“编译”,即可进入玩家自行编译游戏仓库中。玩家可以在游戏的格中按照自己的意愿设计关卡(需要符合游戏自身规定)。该界面共有9个选项键,分别是墙、路、目的地、箱子、小人、锁定、删除、保存、返回主菜单,玩家可以通过对应的数字按键或直接触控屏幕实现对应功能。效果如图所示。图3.5 选择功能图6. 点击游戏其他位置时,则弹出如下图所示的对话框,点击“确定”恢复正常。图3.6错误恢复图7. 点击“工具栏”,则可以调试游戏。该界面介绍了关于本游戏的一些修改方法。效果如图所示。图3.7调试游戏图8. 点击“退出”,则会退出游戏。图3.8退出游戏图5总结一周的汇编语言课程设计结束了,我的收获很大。通过

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论