打字游戏程序设计报告.doc

上传人:jian****018 文档编号:9614643 上传时间:2020-04-06 格式:DOC 页数:32 大小:125.50KB
返回 下载 相关 举报
打字游戏程序设计报告.doc_第1页
第1页 / 共32页
打字游戏程序设计报告.doc_第2页
第2页 / 共32页
打字游戏程序设计报告.doc_第3页
第3页 / 共32页
点击查看更多>>
资源描述
第二章 打字游戏程序设计内容要求和设计思想2.1 设计内容要求 要求设计的程序需包括:在游戏开始后,按回车键进入打字游戏;按ESC键返回主界面;按空格暂停;按大写字母E程序结束。26个字母中的任意一字母从屏幕落下,在下落的过程中键入落下的字母,如果正确,字母消失,分数增加;如果不正确,字母继续下落。接着继续下落其他字母,如果不正确的字母数大于10个,则游戏结束并返回到成绩界面。进入成绩界面后显示所得游戏分数,暂停大概2秒后返回到主菜单。2.2 整体设计思想程序首先通过宏的定义以及调用宏来画出游戏边框,再通过定义一个函数并调用MOV AH,09 INT 21H 来显示字符串, DS:DX定义字符串位置。游戏主程序调用BIOS INT 10 的9号功能实现对目标文本的颜色和定位。游戏主程序可以用MOV AH,00 INT 16H从键盘读取输入的字符再调用MOV AH,01 INT 21H 让键盘输入显示在屏幕中 AL输入的字符,用CMP指令对输入的文本和目标文本进行比较,再利用选择语句在打错字符后对wrong的基数加1,在打对字符后对right的基数加1,并调用清屏函数clear将该字符消除。对于要求柱形图实时显示正确和错误的数目,可以通过利用“*”在竖向上叠加来实现,字符串结束后直接退到dos环境。2.3 整体设计方案流程图开始欢迎界面结束速度选择1,2,3游戏运行游戏结束ESCEENTER输入字母并进行相关操作后返回显示成绩图2.1第三章 软件设计3.1 程序流程详细说明首先运行程序,进入主界面,通过键盘输入字符,先判断是否是“E”,是则直接退出,如果不是“E”,则进入下一步判断是否为数字1,是就按速度1下落字母,否就进入下一步判断,是否为数字2,是就按速度2下落字母,否就进入下一步判断,是否为数字3,是就按速度3下落字母,否就返回重新输入。字母随机下落的过程中,检查键盘是否输入ESC,是就返回到主界面,否就继续下落,接着判断玩家输入的字母跟下落的字母是否一样,是就清除该字母,并使RIGHT的基数加1,否就使WRONG的基数加1,接着判断WRONG是否大于10,否就又重新随机下落一字母,是游戏就结束并显示最终成绩,接着就返回到主界面等待新的指令。3.2程序流程图开始主界面键盘输入是否E是否1速度1是否2速度2是否3字母随机落下检查键盘是否ESC速度3输入字符正确结束下落字母消失 WRONG+1WRONG10显示最终成绩RIGHT+1图3.13.3 重点子程序分析3.3.1 随机产生字母 先初始定义一个由61个无序字母组成的字母列STRD,此字母列包含从A-Z 26个字母,将STRD的偏移地址存在DI中,又将字母列的备份存在SI中,定义一个计数寄存器CX,首先置CX为0,程序每产生一个随机字母后CX自动加1,并且比较每次循环时CX是否已经大于61,如果大于61则对屏幕初始化置0,如果大于则继续随机下落字母。3.3.2 字母的下落 字母的下落是整个程序的核心部分,实现该功能的原理是让字母在规定的时间间隔内多次显示,字母每次下移1位,同时上一位自动以空格代替,这样在视觉上就起到了字母自动下落的效果,下落的速度由我们自己决定,本程序中设置了三种速度。3.4 程序中使用的部分重要指令3.4.1通用数据转送指令MOV它表示把操作数(SRC),转送给目的操作数(DIST),源操作数不变,目的操作数被源操作数所替代。转送指令每次可以转送一个字节或一个字,可以实现CPU的内部寄存器之间的数据转送、寄存器和内存之间的数据转送,还可以将立即数送给CPU内部的寄存器。本设计中大量的用到了MOV指令,如MOV AH,0AH MOV AL,OP3 MOV CX,01H MOV BH,00H 等等,以实现起数据的传送。3.4.2 无条件转移指令JMP、CALL、RET(1)当程序中出现JMP指令时,无条件的跳至JMP后所跟的变量处。其主要有段内短转移、段内直接转移、段间直接转移、段内间接转移、段间间接转移、段内间接转移等操作。(2)CALL指令为调用子程序,其功能为保护程序断点后,转到子程序处执行。主要包括段内调用和段间调用。(3)RET返回指令,通常与CALL指令连用,从子程序返回主程序,通常放在子程序之后。也包括段内返回和段间返回。3.4.3 条件转移指令条件转移指令是根据执行该指令时CPU标志的状态而决定是否发生控制转移的指令。如果满足条件则程序转移到指定的目标地址;如果不满足则继续执行该条件下的下一条指令。一般与比较指令CMP连用。在本程序设计中主要用到“JE(相等转移)”、“JA(大于转移)”、“JNE(不相等转移)”等。3.4.4 堆栈操作指令PUSH、POP PUSH进栈指令的功能是将操作数推入堆栈。它的源操作数可以是16为通用寄存器、段寄存器或存储器中的数据字,打不能是立即数。堆栈是以“先进后出”的方式工作的一个存储区,栈区的段址由SS寄存器的内容确定。堆栈的最大容量可为64K,即一个段的最大容量。堆栈指针SP始终指向栈顶,其值可以从FFFEH(偶地址)开始,向低地址方向发展,最小为0。每次执行PUSH操作时,先修改SP的值,使SPSP - 2后,然后把操作数压入堆栈种SP指示的位置上,低位字节放在较低地址单元,高位字节放在交高地址单元中。POP出栈指令的功能是把当前的SP所指向的堆栈顶部的一个字送到指定的目的操作数中。它的目的操作数可以是16位通用寄存器,段寄存器或存储单元,但CS不能做目的操作数。每执行一次出栈操作,SPSP+2,即SP向高地址方向移动,指向新的栈顶。3.4.5 算数运算指令ADD、SUB、DIV、INC ADD加法指令,它的功能是将源操作数相加,结果送到目的操作数中,即目的源+目的。SUB减法指令,它的功能是将目的操作数减去源操作数,结果送回目的操作数,即目的目的 源。DIV无符号数除法指令,它的功能是对两个无符号二进制数进行除法操作。INC增量指令,它的功能是对目的操作数加1,结果送回目的操作数,即目的目的+1。ADD,SUB这两条指令的原操作数可以是寄存器、存储器或立即数,目的操作数只能是用寄存器和存储单元。使用时需注意源和目的操作数不能同时为存储器,而且他们的类型必须一致,即都是字节或字。DIV指令的原操作数可以是字节或字,如果源操作数为字节,16位被除数必须放在AX中,8位除数为原操作数,他可以是寄存器或存储单元,相除之后,8位商在AL中,余数在AH中。要是操作数为字,32位被除数在DX,AX中,其中DX为高位字,16位除数作源操作数,他可以是寄存器或存储单元。相除之后,AX中存16位商,DX存16位余数。要是被除数只有16位,除数也是16位,则必须将16位被除数送到AX中,再将DX寄存器清0,然后相除。INC指令的目的操作数可以在通用寄存器或内存种,这条指令主要用在循环程序中,对地址指针和循环计数器等进行修改。指令执行后影响AF、OF、PF、SF和ZF,但进位标志CF不受影响。 3.5 源程序及其说明 DIS MACRO STRING,X MOV AL,3 MOV AH,0 INT 10H MOV BP,SEG STRING MOV ES,BP MOV BP,OFFSET STRING MOV CX,15 MOV DH,X MOV DL,29 MOV BL,74H MOV AL,1 MOV AH,13H INT 10H ENDM DIS4 MACRO STRING,X,Y ;在指定位置以红底蓝字显示字符串 dis2 MOV AL,3 MOV AH,0 INT 10H MOV BP,SEG STRING MOV ES,BP MOV BP,OFFSET STRING MOV CX,Y ;显示字符串的长度 MOV DH,X ;行位置 MOV DL,29 ;列位置 MOV BL,74H ;显示字符串的属性74h MOV AL,1 MOV AH,13H INT 10H DIS3 DIS5 ENDM DIS1 MACRO STRING1,Y,M ;在指定位置处显示字符串 MOV AH,2 ;置光标位置 MOV BH,0 MOV DH,Y ;行标 MOV DL,M ;列标 INT 10H MOV AH,09H ;显示str1 MOV DX,SEG STRING1 MOV DS,DX MOV DX,OFFSET STRING1 INT 21H ENDM DIS2 MACRO ;宏进栈 PUSH AX PUSH BX PUSH CX PUSH DX ENDM DIS3 MACRO ;宏出栈 POP DX POP CX POP BX POP AX ENDM DIS5 MACRO S1,S2 DIS2 MOV AH,6D MOV AL,0 MOV AL,25D MOV BH,10100100B ;01111111b MOV CH,0 MOV CL,0 MOV DH,0 MOV DL,80 INT 10H DIS3 ENDM DIS6 MACRO Z1,Z2,Z3,Z4 ;画横向边框的宏 LOCAL C5 DIS2 MOV CX,Z1 ;循环次数 MOV DL,Z2 ;列 C5: MOV AH,2 ;置光标位置 MOV BH,Z3 ;页号 MOV DH,Z4 ;行 INT 10H PUSH DX MOV DL,2AH INT 21H POP DX INC DL LOOP C5 DIS3 ENDM DIS7 MACRO Q1,Q2,Q3,Q4 ;画竖边框的宏 LOCAL F1 DIS2 MOV CX,Q4 MOV DH,Q1 F1: MOV AH,2 ;置光标位置 MOV BH,Q2 MOV DL,Q3 INT 10H MOV DL,2AH INT 21H INC DH LOOP F1 DIS3 ENDM DATAS SEGMENT STR1 DB Welcome to play chars,0AH,0DH, $ STR2 DB Made by Zhou Liangfeng,0AH,0DH, $ STR3 DB 2010/1/8 ,0AH,0DH, $ STR4 DB Please choose speeding,0AH,0DH, $ STR5 DB Please press Enter to cintinue. ,0AH,0DH, $ STR7 DB speed 1,0AH,0DH, $ STR8 DB speed 2,0AH,0DH, $ STR9 DB speed 3,0AH,0DH, $ STR0 DB Select the number among 1-3,0AH,0DH, $ STRA DB ,0AH,0DH, $ STRB DB score: , i,0AH,0DH, $ STRC DB You choose: ,0AH,0DH, $ STRD DB hqfuvodepfdjygnhtrwgaerjrklubgsnyrsbntrsbngtrdjykuahtrgregfytjgfjytjktru, $ STRE DB RIGHT: , $ ST1 DB RIGHT: Pause,0AH,0DH, $ ST2 DB E : Quit,0AH,0DH, $ ST8 DB Esc: Back,0AH,0DH, $ ST3 DB Function Meun,0AH,0DH, $ ST4 DB please input. ,0AH,0DH, $ ST5 DB SPACE: Continue,0AH,0DH, $ ST6 DB Quitting. ,0AH,0DH, $ ST7 DB Press any key to continue,0AH,0DH,0AH,0DH,0AH,0DH,0AH,0DH,0AH,0DH,0AH,0DH,0AH,0DH, $ LENTH EQU $-STRD ;STRD的长度 R DB 1 M DB 0 N DB ? A DB 0 ;速度1选择标志 B DB 0 ;速度2选择标志 V DB 0 ;速度3选择标志 DATAS ENDS STACK1 SEGMENT DB 100 DUP (?) STACK1 ENDS CODES SEGMENT MAIN PROC FAR ASSUME CS:CODES,DS:DATAS,SS:STACK1 START: MOV AX,DATAS MOV DS,AX CALL CLEAR ;调用清屏函数,清除dos界面 CALL DISPLAY1 ;显示主欢迎界面 AG: MOV A,0 ;只相应的速度标志为0 MOV B,0 MOV V,0 TH2: MOV AH,7 ;无回显输入字符 INT 21H CMP AL,0DH ;如果是回车,则继续 JNE TH2 ;否则继续输入 TH1: CALL CLEAR ;调用清屏函数 DIS6 80,0,0,0 ;宏调用画上边框 DIS7 0,0,79,24 ;宏调用画右3边框 DIS7 0,0,0,25 ;宏调用画左1边框 DIS6 79,0,0,24 ;宏调用画下边框 DIS1 STR4,10,25 ;宏调用显示欢迎界面及速度选择项 DIS1 STR7,12,30 DIS1 STR8,14,30 DIS1 STR9,16,30 DIS1 STR0,20,16 THD: MOV AH,7 ;键盘等待输入相应的速度选项 INT 21H CMP AL,31H ;判断是否为1 JNE MODIFYA JMP THB ;是则转 ,JMP实现间接跳转 MODIFYA: CMP AL,32H ;判断是否为2 JNE MODIFYB JMP THC ;是则转 MODIFYB: CMP AL,33H ;判断是否为3 JNE THD ;不是则转 DIS4 STR9,12,10 ;速度3高亮度显示 DIS1 STRC,12,14 MOV V,1 ;速度3被选中的标志 JMP THA THB: DIS4 STR7,12,10 ;速度1高亮度显示 DIS1 STRC,12,14 MOV A,1 ;速度1被选中的标志 JMP THA THC: DIS4 STR8,12,10 ;速度2高亮度显示 DIS1 STRC,12,14 MOV B,1 ;速度2被选中的标志 THA: DIS6 80,0,0,0 ;宏调用画上边框 DIS7 0,0,79,24 ;宏调用画右3边框 DIS7 0,0,0,25 ;宏调用画左1边框 DIS6 79,0,0,24 ;宏调用画下边框 MOV AH,7 ;键盘等待确定输入 INT 21H CMP AL,0DH ;判断是否是回车确定 JNE THA ;不是则继续等待 CALL SLEEP2 ;屏幕暂停缓冲 CALL CLEAR ;调用清屏函数 CALL PAINT ;调用函数画游戏边框 CALL GOAL ;调用函数显示得分 CALL FALL ;调用下落函数 CMP N,1 ;是否确定退出 JE TH9 ;是则转 JMP AG ;不是继续 TH9: MOV AH,4CH ;返回dos界面 INT 21H MAIN ENDP;显示功能菜单函数 DISPLAY1 PROC NEAR DIS1 STR1,10,25 DIS1 STR2,13,29 DIS1 STR3,16,31 DIS1 STR5,21,19 DIS6 80,0,0,0 DIS6 79,0,0,24 DIS7 0,0,0,25 DIS7 0,0,79,24 RET DISPLAY1 ENDP;清屏函数,清除整个屏幕 CLEAR PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX MOV AH,6 MOV AL,0 MOV BH,7 MOV CH,0 MOV CL,0 MOV DH,24 MOV DL,79 INT 10H MOV DX,0 MOV AH,2 INT 10H DIS5 25D,10100100B DIS3 RET CLEAR ENDP;下落函数,核心子函数 FALL PROC NEAR LEA SI,STRD ;传递将要下落的字母子串 T1: INC SI ;加1以便寻找下一个字母 DIS2 MOV AH,6D ;置主游戏屏界面颜色 MOV AL,0 MOV AL,23D MOV BH,01101110B MOV CH,1 ;从左上第1行 MOV CL,26 ;从左上第26列 MOV DH,1 ;从右上第1行 MOV DL,54 ;从右上第54列 INT 10H DIS3 CALL RANDOM MOV DL,AH ;获得随机数,保存至dl中 dl 为字母下落的y坐标 ADD DL,26 ;基数为26,使其在范围之内 MOV DH,R MOV CX,23 AGA: MOV AH,2 ;置光标位置 MOV BH,0 INT 10H MOV AL,SI ;取下落字符 PUSH DX MOV DL,AL MOV AH,02H INT 21H POP DX PUSH AX ;AX,CX进栈,以防干扰 PUSH CX MOV CX,0 ;隐藏字母后面的光标 MOV AH,1 OR CH,00010000B INT 10H POP CX POP AX CALL SP_ADJ MOV AH,2 ;置光标位置 MOV BH,0 INT 10H PUSH DX MOV DL, ;显示空格 MOV AH,02H INT 21H INT 10H POP DX SUB AL,AL PUSH CX MOV CX,50000 DL2: LOOP DL2 POP CX PUSH DX MOV AH,6 MOV DL,0FFH INT 21H POP DX CMP AL,0 ;判断是否输入 JZ T0 ;没有 CMP AL,SI ;判断是否等于下落的字母 JE T7 ;等于下落的字母,则下落下一个字母 JNE X1 T7: INC M CALL POINT CALL BELL JMP T1 X1: CMP AL,20H JE TA JNE T3 TA: CALL PAUSE T3: CMP AL,45H JNE T0 CALL EXIT CMP N,1 JE T4 T0: CMP AL,1BH JNE T12 CALL CLEAR CALL DISPLAY1 JMP T4 T12: INC DH SUB CX,1 JZ MODIFYC JMP AGA MODIFYC: JMP T1 T4: RET FALL ENDP;时间延迟函数及速度1函数 SLEEP1 PROC PUSH CX MOV CX,550D LOOP1: PUSH CX MOV CX,550D LOOP2: PUSH CX MOV CX,550D LOOP3: NOP NOP LOOP LOOP3 POP CX LOOP LOOP2 POP CX LOOP LOOP1 POP CX RET SLEEP1 ENDP;时间延迟函数及速度2函数 SLEEP2 PROC PUSH CX MOV CX,400D LOOP4: PUSH CX MOV CX,400D LOOP5: PUSH CX MOV CX,400D LOOP6: NOP NOP LOOP LOOP6 POP CX LOOP LOOP5 POP CX LOOP LOOP4 POP CX RET SLEEP2 ENDP;时间延迟函数及速度3函数 SLEEP3 PROC PUSH CX MOV CX,280D LOOP7: PUSH CX MOV CX,280D LOOP8: PUSH CX MOV CX,280D LOOP9: NOP NOP LOOP LOOP9 POP CX LOOP LOOP8 POP CX LOOP LOOP7 POP CX RET SLEEP3 ENDP;时间延迟函数及速度3函数 SP_ADJ PROC CMP A,1 JE S1 CMP B,1 JE S2 CMP V,1 CALL SLEEP3 JMP S3 S1: CALL SLEEP1 JMP S3 S2: CALL SLEEP2 S3: RET SP_ADJ ENDP;画游戏边框 PAINT PROC NEAR DIS2 DIS6 80,0,0,0 ;宏调用画上边框 DIS7 0,0,55,25 ;宏调用画右1边框 DIS7 0,0,56,25 ;宏调用画右2边框 DIS7 0,0,79,24 ;宏调用画右3边框 DIS7 0,0,0,25 ;宏调用画左1边框 DIS7 0,0,24,25 ;宏调用画左2边框 DIS7 0,0,25,25 ;宏调用画左3边框 DIS6 79,0,0,24 ;宏调用画下边框 DIS1 ST3,6,3 DIS1 ST1,9,5 DIS1 ST5,11,5 DIS1 ST2,13,5 DIS1 ST4,17,3 DIS1 ST8,15,5 DIS3 RET PAINT ENDP;分数字符串显示函数 GOAL PROC NEAR DIS2 MOV AH,2 ;置光标位置 MOV BH,0 MOV DH,11 MOV DL,60 INT 10H MOV AH,09H ;显示str1 MOV DX,SEG STRE MOV DS,DX MOV DX,OFFSET STRE INT 21H DIS3 RET GOAL ENDP;打印实际得分 POINT PROC NEAR DIS2 MOV AH,2 ;置光标位置 MOV BH,0 MOV DH,11 MOV DL,67 INT 10H MOV AL,M CMP AL,10 JAE X9 ADD AL,30H MOV DL,AL MOV AH,02H ;显示得分 INT 21H JMP X10 X9: MOV AL,M MOV AH,0 MOV DL,10 DIV DL PUSH AX MOV AH,2 MOV BH,0 MOV DH,11 MOV DL,67 INT 10H ;打印十位 ADD AL,0 MOV DL,AL INT 21H POP AX MOV AL,AH MOV AH,2 MOV DH,11 MOV DL,68 INT 10H ADD AL,0 MOV DL,AL INT 21H X10: DIS3 RET POINT ENDP;暂停函数 PAUSE PROC NEAR DIS2 P1: MOV AH,07H ;无显示输入 INT 21H CMP AL,20H ;判断是否是继续的空格 JNE P1 ;不是则跳转 DIS3 RET PAUSE ENDP;退出函数 EXIT PROC NEAR DIS2 CALL CLEAR ;调用清屏函数 DIS1 ST6,12,28 DIS1 ST7,14,20 MOV AH,4CH INT 21H DIS3 RET EXIT ENDP;表示击中的函数 BELL PROC NEAR PUSH DX PUSH AX PUSH CX MOV DX,60000D ;turn on/of 60000d times IN AL,61H AND AL,11111100B SOUND: XOR
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 管理文书 > 工作总结


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!