华北科技学院课程设计说明书专业:网络工程课程名称: 汇编课程设计设计题目: 打字游戏设计设计时间: 2011-12-05 至2011-12-16 评语: ________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ 评阅成绩:____评阅教师:___课程设计报告的要求1、需求分析描述问题。
简述课题要解决的问题是什么,有什么要求和限制条件。
2、总体设计(程序设计组成框图、流程图)3、详细设计(模块功能说明(如函数功能、入口及出口参数说明,过程调用关系描述等))4、调试与测试:调试方法,测试结果的分析与讨论,测试过程中遇到的主要问题及采取的解决措施5、测试结果,用几组测试数据进行测试算法设计的正确性。
6、附录。
源程序清单和结果:源程序要加注释。
结果要包括测试数据和运行结果。
《汇编语言》课程设计案例一、问题述及其需求分析要求:利用汇编语言编写一个小的打字游戏容:编写程序,在打开的菜单页面中选择游戏的难度。
难度选择包括以下5个选择(1)very slow(2)slow(3)normal(4)fast(5)very fast在编写过程中包括以下几个部分:(1)初始化上部分的字母(2)获得下落的字母(3)字母下移,同时覆盖原来的字母(4)判断是否有输入(5)若无输入则下落到最后(6)覆盖原来的字符(7)重新进行循环二、总体设计主菜单流程图这个菜单部分主要是为了给不同水平的玩家选择游戏的速度,菜单上有对不同难度的描述,有助于玩家的选择。
在选择过后会跳出一个提示界面,提示在游戏时的一些注意事项,之后键入任意键进入游戏,开始游戏。
三、详细设计游戏程序框图此部分是进入游戏以后的设定,先初始化边框,同时将屏幕上方的字母初始化,将屏幕下方添加代表“生命”的笑脸,当笑脸全部消失,则游戏失败,退出游戏。
在游戏过程中,键入ESC建,则直接退出游戏。
字母下落部分流程图这个部分是游戏的核心部分。
主要的想法是在某个地方出现字母,然后延迟一段时间(延迟时间由游戏速度控制),判断是否有输入字符,同时判断字符是否为空格或者正确的字符。
输入的字符正确,则用空格覆盖当前的字符,同时产生下一个字母,重复上面的过程。
若没有输入字符,则用空格覆盖当前字符,将当前字符在下一格处显示出来,不断的重复,直到最后笑脸处,将笑脸用空格覆盖,同时产生一个新的字母。
四、编码和测试主菜单部分如下图所示:选择时效果如下图所示在输入的字符不是1~5或ESC键时,不会有任何反应,当多次键入1~5或ESC键时,按最后一次键入的有效,选择游戏难度后,键入ENTER键开始游戏。
进入游戏后提示信息如下图所示:这里用了一个INT 21H的中断,等待接收一个字符来继续程序。
同时给出了游戏过程中的一些提示。
游戏过程如下图所示:提示:在游戏过程中程序之识别大写字母,需要打开大写锁定进行游戏,否则不管输入正确与否,都不会有变化。
输入ENTER键继续,输入其他键没有任何变化。
失败以后的提示画面如下:键入ENTER键则返回主菜单,键入ESC键退出程序。
五.总结与体会当我拿到这次课程设计的题目选择时,有点无从下手的感觉,最后选择了这个打字游戏,因为我对游戏本来就有比较大的兴趣。
当是在写程序的过程中发现了很多很多的问题,比如最开始不知道该如何设计布局,设计游戏界面。
我上网找别人写好得程序,学习别人的布局方法,终于有了一点设计的思路,让我感觉有设计的想法了。
后来在设计游戏的时候发现不知道该如何产生下落的字母,起初是想使用一个产生随机数的模块,大体思路是调用系统的时间,然后再把它除上26,求出它的余数。
但是在使用的过程中发现不知道该如何控制它为字母,在使用的时候会出现一些乱码,所以我就放弃了。
后来就定义了一个无顺序的字母串,让它代替产生随机的字母,但是因为不是随机产生的,所以有一定的顺序,这是这个程序不足的地方。
再之后我发现不懂得如何控制游戏的速度,我就上网搜索,看别人的程序,最后发现可以使用一个循环,占用系统的CPU时间但不做任何处理,这样就可以当做延迟使用。
同时设定不同的延迟时间,来控制游戏速度。
在写程序的过程中我发现了很多原来上课没有说到的中断调用,比如INT 10H,INT 0AH等等,这些我们都没有见到过,但是在写程序的过程中又需要多次使用,这给我造成了很大的困扰。
我多次上网查找相关的资料和相关的实例,多次试验后终于初步了解了这些中断调用的用法。
这次的课程设计让我有很大的收获,不仅编写出了一个小游戏,还让我懂得应用一些原来课上没有机会用得一些知识。
但是编写的过程中还有很多的遗憾,比如无法产生随机数,或者计时出错等等问题。
在以后的学习中,要更注意。
附录:程序主要代码;**************************************; 宏部分;**************************************;宏名:INIT_GAME;功能描述:初始化游戏,设置游戏的边框等INIT_GAME MACRO OP1,OP2,OP3,OP4,OP5,OP6MOV CX,00HMOV DH,OP1MOV DL,OP2OP6:MOV AH,02HMOV BH,00HINT 10HPUSH CXMOV AH,0AHMOV AL,OP3MOV BH,00HMOV CX,01HINT 10HPOP CXINC CXINC OP4CMP CX,OP5JNE OP6ENDM;功能描述:初始化屏幕;参数:(OP1,OP2)为左上角坐标;(OP3,OP4)为右下角坐标CLEAR_SCREEN MACRO OP1,OP2,OP3,OP4 MOV AH,06HMOV AL,00HMOV BH,71HMOV CH,OP1MOV CL,OP2MOV DH,OP3MOV DL,OP4INT 10HMOV AH,02HMOV BH,00HMOV DH,00HMOV DL,00HINT 10HENDM;菜单宏,用于布局MENU MACRO OP1,OP2,OP3MOV AH,02HMOV BH,00HMOV DH,OP1MOV DL,OP2INT 10HMOV AH,09HLEA DX,OP3INT 21HENDM;*************************************** ; 主程序部分;***************************************CODE SEGMENTMAIN PROC FARASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATAMOV DS,AXMOV LETTER_COUNTER,00HMOV PRESENT_POSITION,1LEA SI,POSITION_FLAGMOV AH,00HMOV CX,00HINIT_POSTION_FLAG:MOV [SI],AHINC SIINC CXCMP CX,78DJNE INIT_POSTION_FLAGLEA DI,LETTERSLEA SI,LETTERS_BAKMOV CX,00HINIT_LETTERS: ;循环把LETTERS_BAK给LETTERSMOV AH,[SI]MOV [DI],AHINC SIINC DIINC CXCMP CX,78DJNE INIT_LETTERSMOV AH,00H ;循环把LIFE_FLAG赋值0LEA SI,LIFE_FLAGMOV CX,00HINIT_LIFE_FLAG:MOV [SI],AHINC SIINC CXCMP CX,78DJNE INIT_LIFE_FLAGMOV CX,00HMOV AH,01H ;设置光标大小OR CH,00010000BINT 10HCLEAR_SCREEN 00D,00D,24D,79DINIT_GAME 00D,00D,04H,DL,80D,NEXTSIGN1 ;设置屏幕的边框,光标的位置INIT_GAME 24D,00D,04H,DL,80D,NEXTSIGN2INIT_GAME 00D,00D,04H,DH,25D,NEXTSIGN3 INIT_GAME 00D,79D,04H,DH,25D,NEXTSIGN4MENU 01D,15D,MEG ;菜单信息的宏展开MENU 01H,61D,LINJIANGMENU 03D,20D,MEG1MENU 03D,60D,NOMENU 05D,15D,MEG2MENU 07D,15D,MEG3MENU 09D,15D,MEG4MENU 11D,15D,MEG5MENU 13D,15D,MEG6MENU 15D,15D,MEG7MENU 17D,15D,MEG11MENU 19D,15D,MEG9MENU 22D,15D,MEG10;************************************** ; 选择界面;**************************************;选择菜单部分INPUT: MOV AH,02HMOV BH,00HMOV DH,22DMOV DL,33DINT 10HMOV AH,0AH ;显示空字符MOV AL," "MOV BH,00HMOV CX,01HINT 10HMOV AH,01HINT 21HRETRY: CMP AL,"1";速度选择部分JE SPEED1CMP AL,"2"JE SPEED2CMP AL,"3"JE SPEED3CMP AL,"4"JE SPEED4CMP AL,"5"JE SPEED5CMP AL,"6"JE SPEED6CMP AL,1BHJE TO_OVER0JMP INPUTTO_OVER0:JMP OVERSPEED1: MOV AH,01HINT 21HCMP AL,0DH ;比较是否为回车 JNE OTHERKEYMOV AX,SPEED+2MOV SPEED,AXJMP BEGINSPEED2: MOV AH,01HINT 21HCMP AL,0DHJNE OTHERKEYMOV AX,SPEED+4MOV SPEED,AXJMP BEGINSPEED3: MOV AH,01HINT 21HCMP AL,0DHJNE OTHERKEYMOV AX,SPEED+6MOV SPEED,AXJMP BEGINSPEED4: MOV AH,01HINT 21HCMP AL,0DHJNE OTHERKEYMOV AX,SPEED+8MOV SPEED,AXJMP BEGINSPEED5: MOV AH,01HINT 21HCMP AL,0DHJNE OTHERKEYMOV AX,SPEED+10MOV SPEED,AXJMP BEGINSPEED6: MOV AH,01HINT 21HCMP AL,0DHJNE OTHERKEYMOV AX,SPEED+12MOV SPEED,AXJMP BEGINOTHERKEY: ; 处理重复输入的代码段,多次输入则覆盖PUSH AXMOV AH,02HMOV BH,00HMOV DH,22DMOV DL,34DINT 10HMOV AH,0AHMOV AL," "MOV BH,00HMOV CX,01HINT 10HMOV AH,02HMOV BH,00HMOV DH,22DMOV DL,33DINT 10HPOP AXMOV DX,AXMOV AH,02HINT 21HJMP RETRY;****************************************** ; 字母下落的代码段部分;****************************************** MOV AH,02HMOV BH,00HMOV DH,01HINT 10HMOV CX,00HNEXTROW:PUSH CX ; 新的一行MOV CX,00HOUT_CYCLE: ; 延迟PUSH CXMOV CX,00HIN_CYCLE:ADD CX,01HCMP CX,50000DJNE IN_CYCLEPUSH DXMOV AH,06HMOV DL,0FFHINT 21HPOP DXJZ PASS ; 如果键盘缓冲区部分为空,则跳转CMP AL,1BH ; 如果键入ESC,则返回主菜单 JE TO_START1CMP AL," ";如果键入SPACE,则游戏暂停JE PAUSECMP AL,[DI] ;输入字母正确!跳转!JE DISAPPEARPASS:POP CXINC CXCMP CX,SPEEDJE PRINTJMP OUT_CYCLEPAUSE: PUSH DX ;暂停处理MOV AH,06HMOV DL,0FFHINT 21HPOP DXCMP AL," "JNE PAUSEJMP PASSTO_START1: ;返回主菜单JMP STARTPRINT:;当本行没有输入字符时,用空格覆盖原来字符,同时字符下移一位MOV AH,0AHMOV AL," "MOV BH,00HMOV CX,01HINT 10HINC DH ;行号加一,下移一行MOV AH,02HMOV BH,00HINT 10HMOV AH,0AHMOV AL,[DI]MOV BH,00HMOV CX,01HINT 10HPOP CXINC CXCMP CX,21DJE PRINT_NEXT_LETTER ;循环结束,跳入处理空格处 JMP NEXTROW ; 下一行,重新进行判定DISAPPEAR: ; 击中字母后的相关处理POP CXPOP CXMOV AH,0AHMOV AL," "MOV BH,00HMOV CX,01HINT 10H ;输入正确时用空格覆盖当前字符;**************************************; 游戏失败后的相关处理;**************************************FAIL: MOV AH,0AHMOV AL," "MOV CX,01HINT 10HINC DHMOV AH,02HMOV BH,00HINT 10HMOV AH,0AHMOV AL,[DI]MOV BH,00HMOV CX,01HINT 10HMOV AH,02HMOV BH,00HMOV DH,12DMOV DL,17DINT 10HPUSH DXMOV AH,09HLEA DX,FAILMEGINT 21HPOP DXADD DH,2MOV AH,02HMOV BH,00HINT 10HMOV AH,09HLEA DX,FAILMEG0INT 21HRE: MOV AH,07HINT 21HCMP AL,0DHJNE RECLEAR_SCREEN 01,01,23,78 ;清屏,留下四周花边MOV AH,02HMOV BH,00HMOV DH,11DMOV DL,20DINT 10HPUSH DXMOV AH,09HLEA DX,FAILMEG1 ;显示提示字符串INT 21HPOP DXINC DHINC DHMOV AH,02HMOV BH,00HINT 10HMOV AH,09HLEA DX,FAILMEG2INT 21H。