微机原理汇编语言之猜数字游戏.docx
《微机原理汇编语言之猜数字游戏.docx》由会员分享,可在线阅读,更多相关《微机原理汇编语言之猜数字游戏.docx(14页珍藏版)》请在冰豆网上搜索。
微机原理汇编语言之猜数字游戏
猜数字游戏设计文档
(源代码是上传文档加上去的,见最后面)
一、需求分析
首先,用户输入猜测次数,游戏开始循环。
数字有四位,格式为:
1234
每次用户输入一个数字,游戏都会显示四个字符:
A代表数字和位置都正确
B代表数字正确,但是位置不对
?
代表没有这个数字
比如:
假如要猜的数字是4321,用户输入4321,程序显示AAAA,用户获胜!
假如要猜的数字是4321,用户输入1234,程序显示BBBB
假如要猜的数字是4321,用户输入5674,程序显示?
?
?
B
假如要猜的数字是4321,用户输入5678,程序显示?
?
?
?
如果在给定次数内,用户猜对,则用户胜利,游戏结束;
如果在给定的次数里,用户没有猜到,则用户失败,游戏结束。
二、概要设计
采用封装函数的思想,将生成随机数、比较用户输入结果分别封装成函数
游戏分成四个功能模块
1.生成四个随机数
2.用户输入猜测次数
3.用户猜数
4.显示猜测结果戏
总体流程图:
N
N
fail
N
success
Y
生成随机数流程图:
重复
不重复
N
Y
比较输入结果流程图:
N
Y
N
Y
N
Y
三、详细设计
1.输入数字,游戏次数
使用DOS功能调用来实现键盘输入。
输入单个字符(游戏次数)用1号功能,输入字符串(数字)用9号功能。
2.生成随机数
读取时钟数值,进行运算得到随机数。
3.比较结果
首先将输入的数字和生成的四位随机数进行比较,按照要求输出判断结果;然后,判断游戏次数是否用完。
输出结果
按照要求输出结果,分游戏成功和游戏失败两种情况。
四、运行调试
源代码:
DATASEGMENT
S3DB4DUP(30H),':
IStherandomnumber.',0AH,0DH,'$';产生的4个数
NUMDB5,0,5DUP(?
),0AH,0DH,'$';输入缓冲区
RESULTDB'AAAA',0AH,0DH,'$'
GUSDB4DUP(30H),0AH,0DH,'$';用户输入的4个数
S1DB'Pleaseinputtimesfrom1to9',0AH,0DH,'$'
S2DB'Pleaseinputrandomnumber',0AH,0DH,'$'
S4DB'Yourinputiswrong',0AH,0DH,'$'
FAILDB'Youhavenotime,Youlostthegame!
',0AH,0DH,'$'
WINDB'Congratulations!
Yousucceed!
',0AH,0DH,'$'
DATAENDS
STACK1SEGMENTPARASTACK
DB10DUP(0)
STACK1ENDS
COSEGSEGMENT
ASSUMECS:
COSEG,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVES,AX
LEASI,S3
CALLRANDOM;调用封装的函数RANDOM产生随机数
;-------显示系统生成的4个随机数--------
;MOVDX,OFFSETS3
;MOVAH,09H
;INT21H
;-------提示输入猜测次数,并保存在BL--------
MOVDX,OFFSETS1
MOVAH,09H
INT21H
MOVAH,01H;输入次数
INT21H
SUBAL,30H
MOVBX,0
MOVBL,AL;猜测次数入BL
MOVAH,02H;回车换行
MOVDL,0DH
INT21H
MOVAH,02H
MOVDL,0AH
INT21H
;--------------用户猜测---------------
GUESS:
PUSHBX
CALLCOMPARE;调用封装函数,将比较结果保存在GUS
POPBX
LEADX,GUS;显示猜测结果
MOVAH,09H
INT21H
LEASI,RESULT;判断是否完全相同
LEADI,GUS
MOVCX,4
REPZCMPSB
JEOUT1;完全相同,转OUT1
DECBL;猜错,则猜测次数减1
JNZOUT2
LEADX,FAIL;次数为0,失败信息
MOVAH,09H
INT21H
JMPOVER
OUT1:
;输出获胜信息
LEADX,WIN
MOVAH,09H
INT21H
JMPOVER
OUT2:
;提示重新输入随机数
MOVDX,OFFSETS4
MOVAH,09H
INT21H
JMPGUESS
OVER:
MOVAH,4CH
INT21H
;----------封装函数RANDOM,产生4个不同随机数,并保存在S3----------
RANDOMPROC
PUSHCX
PUSHDX
PUSHAX
STI
MOVBH,4
RAND:
;产生一个随机数
MOVAH,0
INT1AH;读时钟计数器值,16位放在DX
MOVAX,DX
MOVBL,73
MULBL
ANDAH,9;清高6位
MOVDL,10
DIVDL;除10,产生0~9余数
ADDAH,30H
MOVBL,AH;余数存BX,作随机数
JMPX1
X1:
;使生成的随机数不重复
MOVCL,4
LEADI,S3
MOVAL,BL
CLD;清DF,每次扫描后指针增量
REPNZSCASB;直到找到相同随机数或CX=0
JZRAND;若找到相同的,则重新生成随机数
JMPX2;没找到
X2:
;随机数入字符串
MOV[SI],BL
INCSI
DECBH
JNZRAND
POPAX
POPDX
POPCX
RET
RANDOMENDP
;-----封装的函数COMPARE,根据用户输入的随机数,把比较结果保存在GUS中--------
COMPAREPROC
PUSHCX
PUSHDX
PUSHAX
STI
;猜数初始化
MOVDX,OFFSETS2;提示用户输入4个数
MOVAH,09H
INT21H
LEADX,NUM;用户输入4个数
MOVAH,0AH
INT21H
LEASI,NUM+2;缓冲区随机数入GUS
LEADI,GUS
MOVCX,4
REPMOVSB
MOVAH,02H;回车换行
MOVDL,0DH
INT21H
MOVAH,02H
MOVDL,0AH
INT21H
LEASI,GUS
MOVBX,SI
MOVDL,4;DL为当前未比较的随机数个数
FOUND1:
;判断一个随机数是否在S3中,不在则置‘?
’
MOVCX,4
LEADI,S3;每次循环都会重置
MOVAL,[SI];一个随机数送AL
CLD
REPNZSCASB;扫描字符串S3,直到找到随机数或CX=0
JZFOUND2;在S3中,转FOUND2
MOVAL,'?
'
MOV[SI],AL
JMPTEMP
FOUND2:
;判断关键字是否在对应下标位置,不在则置‘B’
MOVCX,SI
SUBCX,BX
LEABP,S3
DECDI
SUBDI,BP
CMPDI,CX
JZFOUND3;在对应位置,转FOUND3
MOVAL,'B';不在对应位置
MOV[SI],AL
JMPTEMP
FOUND3:
;置A
MOVAL,'A'
MOV[SI],AL
JMPTEMP
TEMP:
;猜测循环判断和输出猜测结果
INCSI
DECDL
CMPDL,0
JNZFOUND1;若4个随机数未比较完,转FOUND1
POPAX
POPDX
POPCX
RET
COMPAREENDP
COSEGENDS
ENDSTART
Welcome!
!
!
欢迎您的下载,
资料仅供参考!