微机原理总汇编语言之猜数字游戏
歌曲放手去爱-悲歌行
猜数字游戏设计文档
(源代码是上传文档加上去的,见最后面)
一、 需求分析
首先,用户输入猜测次数, 游戏开始循环。
数字有四位,格式为: 1234
每次用户输入一个数字,游戏都会显示四个字符:
A 代表数字和位置都正确
B 代表数字正确, 但是位置不对
代表没有这个数字
比如:
假如要猜的数字是4321, 用户输入4321, 程序显示AAAA,
用户获胜!
假如要猜的数字是4321, 用户输入1234, 程序显示BBBB
假如要猜的数字是4321, 用户输入5674, 程序显示B
假如要猜的数字是4321, 用户输入5678, 程序显示
如果在给定次数内,用户猜对,则用户胜利,游戏结束;
如果在给定的次数里,
用户没有猜到,则用户失败,游戏结束。
二、 概要设计
采用封装函数的思想,将 生成随机数、比较用户输入结果 分别封装成函数
游戏分成四个功能模块
1. 生成四个随机数
2.
用户输入猜测次数
3. 用户猜数
4. 显示猜测结果
戏
总体流程图:
开始游戏
生成随机数
输入游戏次数
输入数字
N
判断数字
游戏次数是否
用完
输出判断结果
N
fail
判断游戏是否
成功
N
success
Y
输出结果
游戏结束
生成随机数
流程图:
生成1个随机数
判断是否跟已有
重复
随机数重复
不重复
将随机数保存到S3
判断是否生成4
N
个随机数
Y
比较输入结果 流程图:
判断一个字符是否
N
在系统生成的S3
Y
置 ‘ ‘
判断是否在对应下
N
标
Y
置 ‘B’
置 ‘A’
判断4个字符是否
N
Y
比较完
三、 详细设计
1.
输入数字,游戏次数
使用DOS功能调用来实现键盘输入。输入单个字符(游戏次数)用1号功
能,输入字符串(数字)用9号功能。
2. 生成随机数
读取时钟数值,进行运算得到随机数。
3. 比较结果
首先将输入的数
字和生成的四位随机数进行比较,按照要求输出判断结果;
然后,判断游戏次数是否用完。
输出结果
按照要求输出结果,分游戏成功和游戏失败两种情况。
四、 运行调试
源代码:
DATA SEGMENT
S3 DB 4
DUP(30H),' :IS the random number. ',0AH,0DH,'$$'
NUM DB 5,0,5 DUP(),0AH,0DH,'$$'
RESULT DB
'AAAA',0AH,0DH,'$$'
GUS DB 4
DUP(30H),0AH,0DH,'$$'
用户输入的4个数
;产生的4个数
;输入缓冲区
S1 DB 'Please
input times from 1 to 9',0AH,0DH,'$$'
S2 DB
'Please input random number',0AH,0DH,'$$'
S4 DB 'Your input is wrong',0AH,0DH,'$$'
FAIL DB 'You have no time, You lost the
game!',0AH,0DH,'$$'
WIN DB 'Congratulations!
You succeed!',0AH,0DH,'$$'
DATA ENDS
STACK1 SEGMENT PARA STACK
DB 10
DUP(0)
STACK1 ENDS
COSEG SEGMENT
ASSUME CS:COSEG, DS:DATA
START:
MOV
AX,DATA
MOV DS,AX
MOV ES,AX
LEA SI,S3
CALL RANDOM
;调用封装的函数RANDOM产生随机数
;-------显示系统生成的4个随机数--------
MOV
DX,OFFSET S3
MOV AH,09H
INT
21H
;-------提示输入猜测次数,并保存在BL--------
MOV DX,OFFSET S1
MOV AH,09H
INT 21H
MOV AH,01H
INT 21H
SUB AL,30H
MOV
BX,0
MOV BL,AL
MOV AH,02H
MOV DL,0DH
INT 21H
MOV AH,02H
MOV DL,0AH
INT 21H
;输入次数
;猜测次数入BL
;回车换行
;--------------用户猜测---------------
GUESS:
PUSH BX
CALL
COMPARE
POP BX
LEA
DX,GUS
MOV AH,09H
INT 21H
;显示猜测结果
;调用封装函数,将比较结果保存在GUS
LEA SI,RESULT
LEA DI,GUS
MOV
CX,4
REPZ CMPSB
JE OUT1
DEC BL
JNZ OUT2
LEA DX, FAIL
MOV AH,09H
INT 21H
JMP OVER
OUT1: 输出获胜信息
;次数为0,失败信息
猜错,则猜测次数减1
完全相同,转OUT1
;判断是否完全相同
LEA DX,WIN
MOV
AH,09H
INT 21H
JMP OVER
OUT2: 提示重新输入随机数
MOV DX,OFFSET S4
MOV AH,09H
INT 21H
JMP GUESS
OVER:MOV AH,4CH
INT
21H
;----------封装函数RANDOM,产生4个不同随机数,并保存在S
3----------
RANDOM PROC
PUSH CX
PUSH DX
PUSH AX
STI
MOV BH,4
RAND:
;产生一个随机数
MOV AH,0
INT 1AH 读时钟计数器值,16位放在DX
MOV
AX,DX
MOV BL,73
MUL BL
AND AH,9 清高6位
MOV DL,10
DIV DL 除10,产生0~9余数
ADD
AH,30H
MOV BL,AH
JMP X1
;余数存BX,作随机数
X1: 使生成的随机数不重复
MOV CL,4
LEA DI,S3
MOV AL,BL
CLD 清DF,每次扫描后指针增量
;直到找到相同随机数或CX=0
;若找到相同的,则重新生成随机数
REPNZ SCASB
JZ RAND
JMP X2
X2:
;没找到
;随机数入字符串
MOV [SI],BL
INC SI
DEC BH
JNZ RAND
POP AX
POP DX
POP CX
RET
RANDOM ENDP
;-----封装的函
数COMPARE,根据用户输入的随机数,把比较结果保存在GUS中--------
COMPARE PROC
PUSH CX
PUSH DX
PUSH AX
STI
猜数初始化
;提示用户输入4个数 MOV
DX,OFFSET S2
MOV AH,09H
INT
21H
LEA DX,NUM
MOV
AH,0AH
INT 21H
LEA
SI,NUM+2
LEA DI,GUS
MOV CX,4
REP MOVSB
MOV AH,02H
MOV DL,0DH
INT 21H
MOV
AH,02H
MOV DL,0AH
INT 21H
LEA SI,GUS
;用户输入4个数
;缓冲区随机数入GUS
回车换行
MOV BX,SI
MOV DL,4
FOUND1:
;判断一个随机数是否在S3中,不在则置‘’
;DL为当前未比较的随机数个数
MOV CX,4
LEA DI,S3
MOV AL,[SI]
CLD
;每次循环都会重置
一个随机数送AL
REPNZ
SCASB
JZ FOUND2
MOV AL,''
MOV [SI],AL
JMP
TEMP
FOUND2:
;扫描字符串S3,直到找到随机数或CX=0
;在S3中,转FOUND2
;判断关键字是否在对应下标位置,不在则置‘B’
MOV
CX,SI
SUB CX,BX
LEA BP,S3
DEC DI
SUB DI,BP
CMP DI,CX
JZ FOUND3
MOV AL,'B' 不在对应位置
在对应位置,转FOUND3
MOV [SI],AL
JMP TEMP
FOUND3:
MOV AL,'A'
MOV [SI],AL
JMP TEMP
TEMP:
INC SI
DEC DL
CMP DL,0
JNZ FOUND1
POP
AX
POP DX
POP CX
RET
COMPARE ENDP
COSEG ENDS
END
START
置A
;猜测循环判断和输出猜测结果
;若4个随机数未比较完,转FOUND1