微机原理汇编语言之猜数字游戏
千里之外费玉清-吃白食
猜数字游戏设计文档
(源代码是上传文档加上去的,见最后面)
一、 需求分析
首先,用户输入猜测次数, 游戏开始循环。
数字有四位,格式为: 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
N
判断是否生成4
个随机数
Y
比较输入结果 流程图:
N
判断一个字符是否
在系统生成的S3中
置 ‘ ?‘
N
Y
判断是否在对应下
标
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,'$$' 产生的4个数
NUM DB
5,0,5 DUP(?),0AH,0DH,'$$' 输入缓冲区
RESULT DB
'AAAA',0AH,0DH,'$$'
GUS DB 4
DUP(30H),0AH,0DH,'$$' 用户输入的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
;调用封装函数,将比较结果保存在GUS
POP BX
LEA DX,GUS 显示猜测结果
MOV AH,09H
INT 21H
LEA SI,RESULT 判断是否完全相同
LEA DI,GUS
MOV CX,4
REPZ CMPSB
JE OUT1
DEC BL
JNZ OUT2
;完全相同,转OUT1
;猜错,则猜测次数减1
LEA DX,
FAIL
MOV AH,09H
INT 21H
JMP OVER
OUT1:
LEA DX,WIN
MOV AH,09H
INT 21H
JMP
OVER
;次数为0,失败信息
;输出获胜信息
OUT2:
;提示重新输入随机数
MOV DX,OFFSET S4
MOV AH,09H
INT 21H
JMP GUESS
OVER:MOV AH,4CH
INT 21H
;----------封装函数RANDOM,产生4个不同随机数,并保存在S3----------
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 余数存BX,作随机数
JMP X1
X1: 使生成的随机数不重复
MOV CL,4
LEA DI,S3
MOV AL,BL
CLD
;清DF,每次扫描后指针增量
REPNZ SCASB
;直到找到相同随机数或CX=0
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
;猜数初始化
MOV DX,OFFSET S2 提示用户输入4个数
MOV AH,09H
INT 21H
LEA DX,NUM 用户输入4个数
MOV AH,0AH
INT 21H
LEA SI,NUM+2 缓冲区随机数入GUS
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
MOV
BX,SI
MOV DL,4 DL为当前未比较的随机数个数
FOUND1:
MOV CX,4
LEA
DI,S3
MOV AL,[SI]
CLD
REPNZ SCASB
JZ FOUND2
MOV AL,'?'
MOV [SI],AL
JMP
TEMP
FOUND2:
MOV CX,SI
SUB CX,BX
LEA BP,S3
DEC DI
SUB DI,BP
CMP DI,CX
JZ FOUND3
MOV AL,'B'
MOV [SI],AL
JMP TEMP
FOUND3:
MOV AL,'A'
MOV [SI],AL
JMP TEMP
TEMP:
INC SI
DEC DL
;判断一个随机数是否在S3中,不在则置‘?’
;每次循环都会重置
一个随机数送AL
;扫描字符串S3,直到找到随机数或CX=0
在S3中,转FOUND2
;判断关键字是否在对应下标位置,不在则置‘B’
;在对应位置,转FOUND3
不在对应位置
;置A
;猜测循环判断和输出猜测结果
CMP
DL,0
JNZ FOUND1
POP AX
POP DX
POP CX
RET
COMPARE ENDP
COSEG ENDS
END
START
若4个随机数未比较完,转FOUND1