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

萌到你眼炸
621次浏览
2021年01月01日 02:58
最佳经验
本文由作者推荐

歌曲放手去爱-悲歌行

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







判断是否生成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

欧美小清新头像-环境污染应急预案


儿童保健-你不是真正的快乐邓紫棋


谢师宴-描写长江的古诗句


主题婚礼布置-工作中的压力


圣物碎片-好习惯


关于爱祖国的诗歌-关于国庆的作文


新婚快乐祝福语-闲情偶寄


用烤箱烤饼干-七年级上册第一单元