1、猜数字游戏的设计与实现1 需求说明或问题描述1.1 问题描述程序运行后自动产生一个1100之间的随机整数,游戏开始,程序根据游戏者输入的数字与所需猜测数字进行比较,并给出响应,游戏者根据程序响应再猜数字,最后得到正确数字。1.2 需求说明程序应有操作提示,输入和输出,界面追求友好,最好是菜单式的界面。设计若干用例(测试数据),上级测试程序并分析(评价)所设计的程序。2 设计说明2.1 简要设计框图如下:2.2 简要分析思想首先通过指令在程序中产生随机数,由键盘输入的数字与其比较,如果大于随机数,则提示输入的数太大,请重新输入;如果小于随机数,则提示输入的数太小,请重新输入;如果等于随机数,则提
2、示正确;如果输入的数不是十进制数,则直接退出。3 详细的算法描述3.1随机数的产生通过查找各种资料知,随机数的产生也是一种算法,通过种子数据,计算出不同的随机数。但,此次试验,我通过对系统当前时间的提取来表示随机数,即用时间中的“秒”来作这个随机数。指令为:mov ah,2ch ;取系统时间,CH:CL=时间:分钟;DH=秒int 21h3.2 从键盘输入数据如果仅用指令:mov ah,01h Int 21h来从键盘读取数据,则只能取一个字符,即,只能读取一位数字;在试验中通过反复调试,可以对每次输入的数(存放于al中)与“回车”的ASCII比较,如果不是“回车”,则返回继续输入;如果是回车,
3、则跳出,完成数据的输入。每一次返回继续输入时,原来的al中的数据要以个位加入到bx中,即,bx=bx*10+al;这样可以保证输入的数据不会丢失。3.3 数据的比较用输入的数据(存放于bx中)与随机数(存放于a中:mov a,dx)比较;如果大于,则输出提示数据太大,请重新输入,并跳转到键盘输入数据指令;如果小于,则输出提示数据太小,请重新输入,并跳转到键盘输入数据指令;如果等于,则提示正确,并结束。其中,小于跳转用jb;大于跳转用ja;等于用jz。3.4 其他指令回车换行指令:为了保持程序输出结果的工整性,多用回车换行指令:MOV AH,02h MOV DL,0ah INT 21h MOV
4、DL,0dh INT 21h输出提示性语句指令:为使程序输出界面更互动化,常用提示性语句如:MOV AH,9MOV DX,OFFSET mess2MOV 21h退出语句:使用该语句退出整个程序:MOV AH,4CHINT 21H4 源程序与执行结果(含测试方法和测试结果)4.1 源程序5data SEGMENTmess1 db Please input your number:$mess2 db Your number is larger,please change your number:$mess3 db Your number is smaller,please change your
5、number:$mess4 db Thats the right number!$ a dw ?data ENDScode SEGMENT assume cs:code,ds:data begin:mov ax,datamov ds,ax mov ah,9mov dx,offset mess1int 21h MOV AH,02h MOV DL,0ah INT 21h MOV DL,0dh INT 21hmov ah,2ch ;取当前时间的秒为随机数int 21hmov al,dhmov ah,0mov a,axmov bx,0 l0:MOV AH,1 ;输入十进制数 INT 21h CMP A
6、L,0dhJZ l4cmp al,48jb exitcmp al,57ja exitAND AL,0fhMOV AH,0XCHG AX,BXMOV CX,10MUL CXADD BX,AXJMP l0 l4: MOV AH,02h MOV DL,0ah INT 21h MOV DL,0dh INT 21hcmp bx,a ;输入值与随机数比较jb l1 ;小于 cmp bx,a ;大于ja l2 cmp bx,a ;等于jz l3 l1:mov ah,9mov dx,offset mess3int 21h MOV AH,02h MOV DL,0ah INT 21h MOV DL,0dh INT
7、 21hmov ax,0mov bx,0jmp l0 l2:mov ah,9mov dx,offset mess2int 21h MOV AH,02h MOV DL,0ah INT 21h MOV DL,0dh INT 21hmov ax,0mov bx,0jmp l0 l3:mov ah,9mov dx,offset mess4int 21hexit:MOV AH,02h MOV DL,0ah INT 21h MOV DL,0dh INT 21hmov ah,4chint 21hcode ends end begin4.2 执行结果4.2.1 执行方法:masm 01.asmLink 010
8、14.2.2 结果:结果1:(正确)G:masm01Please input your number:55Your number is larger, please change your number:25Your number is smaller, please change your number:40Your number is larger, please change your number:30Your number is smaller, please change your number:35Your number is smaller, please change you
9、r number:37Thats the right number!结果2:(输入错误)G:masm01Please input your number:12Your number is smaller,please change your number:32Your number is larger,please change your number:45u(输入了非数字符号“u”)G:masm5 总结设计心得特点:我个人认为本次试验的最大难点就是产生随机数,然而通过查询,发现汇编中产生随机数的命令都很复杂,并且有些命令是我没有见过的,经过多次考虑,还是选择了使用秒针随机选中的数据作为随机数
10、。这或许是一个特点,也是一个不足!不足:虽然对汇编的基本指令格式印象深刻,但是,还是忘记了一些老师上课讲过的指令方法。比如说,十进制数字的输入,特别是输出,虽然本次实验没有输出十进制数,但是仔细回想一下的话,对我也是一个考验。另外,对各种int 21h的指令依然记得不甚牢靠,需要查找资料等。收获与体会:通过这次的课程设计,让我重温了一遍汇编语言的知识。重新熟悉了各种汇编指令。特别是对于算法思想有了一定的提高,各种汇编指令的小技巧,数据各种各样的操作指令序列让我感觉到,汇编语言也能够越学越让人沉入,容易让人感到成功的喜悦!展望:虽然程序已经写完,但是还是遗憾不能够弄懂真正的随机数是怎样产生的;另外,也因为这个程序小了点,所以没有用子程序的方法,我想如果加大程序,还是用子程序的方法会显得条理更加清楚明白。如果将题目中的数据改成浮点型,即会有小数产生,那么这个程序有改怎么写,其中,小数的输入,小数的随机取值,这些都是会遇到的问题!