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