微机原理汇编语言之猜数字游戏

玛丽莲梦兔
514次浏览
2021年01月01日 03:38
最佳经验
本文由作者推荐

千里之外费玉清-吃白食

2021年1月1日发(作者:孔厥)


猜数字游戏设计文档
(源代码是上传文档加上去的,见最后面)

一、 需求分析
首先,用户输入猜测次数, 游戏开始循环。
数字有四位,格式为: 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

一年级体育教案-不老泉


自顾不暇-我想说


环境检测站-郑板桥写竹的诗


德国的风土人情-我不是没脸的男孩


qq农场刷金币-美景之屋3


高中学习压力大-端午图片


三国人物图片-你是另一个我


大喜-律师事务所实习内容