猜数字游戏程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计任务书
学生姓名:专业班级:自动化1004班
指导教师:工作单位:自动化学院
题目
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1.猜数字游戏程序设计随机产生一个0至149的数字(不显示),输入猜测数字,程序提示和所猜数字大小,直至正确,猜数正确后显示猜数的次数,程序采用汇编语言在PC机上完成。
2.画出简要程序流程图,编写程序。
3.撰写课程设计说明书。
内容包括:摘要、目录、正文、参考文献、附录(程序清单)。
正文部分包括:设计任务及要求、方案比较及论证、软件设计说明(软件思想,流程,源程序设计及说明等)、程序调试说明和结果分析、课程设计收获及心得体会。
时间安排:
2012年12月30日----- 12月31日查阅资料及方案设计
2013年01月01日----- 01月05日编程
2013年01月06 日----- 01月08日调试程序
2013年01月09 日----- 01月10日撰写课程设计报告
指导教师签名:20 年01 月11 日
系主任(或责任教师)签名:年月日
目录
摘要 (1)
1 汇编语言基础 (2)
1.1汇编语言简介 (2)
1.2汇编语言特点 (2)
2 设计原理分析 (3)
2.1随机数的产生 (3)
2.2子模块 (3)
2.3设计流程图 (4)
3 子程序分析 (5)
3.1RAN的主要算法 (5)
3.2INPUT的主要算法 (5)
3.3ENTER的主要算法 (6)
4源程序 (7)
4.1程序代码 (7)
4.2程序运行截图 (13)
心得体会 (15)
参考文献 (16)
摘要
该程序为玩家提供猜数字游戏的基本功能。
当用户选择开始游戏时,系统会在内部产生对应范围内的随机数,以供用户进行猜测,用户每次猜数字后系统会给出本次猜数字的结果提示,先比较用户猜测数字是否等于系统产生的随机数,若相等则提示用户猜数字成功。
如果用户猜测数字不等于系统产生的随机数,则提示该数字与随机数比较时大了还是小了,并输出比较结果,同时记录当前用户猜测的次数。
直至用户成功猜中随机数。
关键词:随机数的产生余数
1 汇编语言基础
1.1汇编语言简介
汇编语言(AssemblyLanguage)是面向机器的程序设计语言。
在汇编语合中,用助记符代替操作码,用地址符号或标号代替地址码。
这样用符号代替机器语言的二进制码,就把机器语言变成了汇编语言。
于是汇编语言亦称为符号语言。
使用汇编语言编写的程序,机器不能直接识别,要由一种程序将汇编语言翻译成机器语言,这种起翻译作用的程序叫汇编程序,汇编程序是系统软件中语言处理系统软件。
汇编程序把汇编语言翻译成机器语言的过程称为汇编。
作为一门语言,对应于高级语言的编译器,需要一个“汇编器”来把汇编语言原文件汇编成机器可执行的代码。
高级的汇编器如MASM,TASM等等为人们写汇编程序提供了很多类似于高级语言的特征,比如结构化、抽象等。
在这样的环境中编写的汇编程序,有很大一部分是面向汇编器的伪指令,已经类同于高级语言。
现在的汇编环境已经如此高级,即使全部用汇编语言来编写windows的应用程序也是可行的,但这不是汇编语言的长处。
汇编语言的长处在于编写高效且需要对机器硬件精确控制的程序。
1.2汇编语言特点
1.面向机器的低级语言,通常是为特定的计算机或系列计算机专门设计的。
2.保持了机器语言的优点,具有直接和简捷的特点。
3.可有效地访问、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端口等。
4.目标代码简短,占用内存少,执行速度快,是高效的程序设计语言。
5.经常与高级语言配合使用,应用十分广泛。
2 设计原理分析
2.1随机数的产生
真正意义上的随机数(或者随机事件)在某次产生过程中是按照实验过程中表现的分布概率随机产生的,其结果是不可预测的,是不可见的。
而计算机中的随机函数是按照一定算法模拟产生的,其结果是确定的,是可见的,这样可以认为这个可预见的结果其出现的概率是100%。
所以用计算机随机函数所产生的“随机数”并不随机,是伪随机数。
此程序的关键问题是如何产生一个1~100之间的随机整数(本程序中所涉及的数均指整数,以下不再赘述)。
可以调用BIOS的功能调用1AH号中断(MOV AH,0 INT 1AH)或者调用DOS系统功能调用21H号中断(MOV AH,2CH INT 21H)取系统时间,DH:DL=秒:1/100秒。
将DX中的内容赋给AX,并将AX 的高六位清零,然后AX除以150,则会产生0~149之间的余数。
2.2子模块
本程序共分为六个模块:
MAIN -------程序的入口点,程序运行后在DOS屏幕上显示主菜单,给出相关的操作提示,并调用RAN、GUESS、ENTER等子程序。
RAN -------调用相关的中断,取系统时间,产生一个0~149之间的随机数。
GUESS------本程序的重要模块,调用INPUT、PRINT、ENTER等子程序。
INPUT------用于玩家输入其所猜之数,并给出相关的输入提示。
PRINT------用于游戏结束时输入系统所产生的随机数。
ENTER-------用于回车换行
2.3设计流程图
设计流程图如图2-1所示。
图2-1设计流程图
3 子程序分析
3.1 RAN的主要算法
RAN PROC NEAR
PUSH AX
PUSH DX
MOV AH,0 ;读时钟计数器值
INT 1AH
MOV AX,DX
AND AH,3 ;将高6位清零
MOV DL,150 ;除以150,产生0~149余数,余数在AH 中
DIV DL
MOV AL,AH
MOV AH,0
MOV RANDOM,AX ;将随机数保存于RANDOM中
MOV AH,09H
LEA DX,MESS2
INT 21H
CALL NEAR PTR ENTER
POP DX
POP AX
RET
RAN ENDP
3.2 INPUT的主要算法
INPUT PROC NEAR
MOV BX,0
INL1:MOV AH,01H
INT 21H
CMP AL,0DH
JZ INEXIT
CMP AL,30H
JAE INL2
CMP AL,08H
JE INL1
CALL NEAR PTR ENTER
MOV AH,09H
LEA DX,MESS9
INT 21H
INL2:CMP AL,39H
JBE INL3
CALL NEAR PTR ENTER
MOV AH,09H
LEA DX,MESS9
INT 21H
JMP INL1
INL3:AND AL,0FH
MOV AH,0
XCHG BX,AX
MOV CX,10
MUL CX
ADD BX,AX
JMP INL1 INEXIT:
MOV INNUM,BX
RET
INPUT ENDP
3.3 ENTER的主要算法
ENTER PROC NEAR
PUSH AX
PUSH DX
MOV AH,02H
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
POP DX
POP AX
RET
ENTER ENDP
4 源程序
4.1程序代码
DATA SEGMENT
RANDOM DW ? ;用于保存产生的随机数
INNUM DW ? ;用于保存玩家输入的数
JISHU DW 0 ;用于保存玩家猜数的次数
MENU DW 0
DB 0DH,0AH,"*----------------------------------------------------*"
DB 0DH,0AH,"* *"
DB 0DH,0AH,"* MAIN MENU *"
DB 0DH,0AH,"* *"
DB 0DH,0AH,"* S.START THE GAME *"
DB 0DH,0AH,"* *"
DB 0DH,0AH,"* E.EXIT THE GAME *"
DB 0DH,0AH,"* *"
DB 0DH,0AH,"*----------------------------------------------------*"
DB 0DH,0AH,"$"
TITLE1 DB 0DH,0AH," NUMBER-GUESSING GAME",0DH,0AH,"$"
MESS1 DB 0DH,0AH,"NUMBER-GUESSING GAME BEGINS.$" MESS2 DB 0DH,0AH,"THE RANDOM NUMBER HAS BEEN GENERATED.$"
MESS3 DB 0DH,0AH,"PLEASE INPUT THE NUMBER YOU
GUESS(DECIMAL,BETWEEM 0 AND 149):$"
MESS4 DB 0DH,0AH,"IT IS BIGGER ,PLEASE REGUESS:$:"
MESS5 DB 0DH,0AH,"IT IS SMALLER,PLEASE REGUESS:$"
MESS6 DB 0DH,0AH,"CONGRATULATIONS,YOU GUESSED!$" MESS7 DB 0DH,0AH,"THE RANDOM NUMBER IS $"
MESS8 DB 0DH,0AH,"PLEASE INPUT YOUR CHOICE:$"
DATA ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA
BEGIN:
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
CALL NEAR PTR ENTER
MOV AH,09H
LEA DX,TITLE1
INT 21H
MOV DX,OFFSET MENU
INT 21H
LEA DX,MESS8
INT 21H
MOV AH,01H
INT 21H
CALL NEAR PTR ENTER ML1: CMP AL,'S'
JE ML2
ML2: MOV JISHU,0
MOV AH,09H
LEA DX,MESS1
INT 21H
CALL NEAR PTR ENTER
CALL NEAR PTR RAN
CALL NEAR PTR GUESS
MOV AH,09H
LEA DX,MESS8
INT 21H
MOV AH,01H
INT 21H
CALL NEAR PTR ENTER ML3:CMP AL,'E'
JE EXIT
ML4:MOV AH,09H
MOV AH,01H
INT 21H
CALL NEAR PTR ENTER
JMP ML1
EXIT:CALL NEAR PTR ENTER MOV AH,4CH
INT 21H
RET
MAIN ENDP
RAN PROC NEAR
PUSH AX
PUSH DX
MOV AH,0 ;读时钟计数器值
INT 1AH
MOV AX,DX ;将高6位清零
AND AH,3
MOV DL,150 ;除以150,产生0~149余数,余数在AH中DIV DL
MOV AL,AH
MOV AH,0
MOV RANDOM,AX ;将随机数保存于RANDOM中
MOV AH,09H
LEA DX,MESS2
INT 21H
CALL NEAR PTR ENTER
POP DX
POP AX
RET
RAN ENDP
GUESS PROC NEAR
MOV AH,09H
LEA DX,MESS3
INT 21H
ADD JISHU,1
GL:CALL NEAR PTR INPUT
MOV AX,INNUM
MOV BX,RANDOM
CMP AX,BX
JA GL1
JB GL2
CALL NEAR PTR ENTER
MOV AH,09H
LEA DX,MESS6
INT 21H
CALL NEAR PTR ENTER
LEA DX,MESS7
INT 21H
CALL NEAR PTR PRINT
JMP GEXIT1
GL1:CALL NEAR PTR ENTER
MOV AH,09H
LEA DX,MESS4
INT 21H
ADD JISHU,1
JMP GL
GL2:CALL NEAR PTR ENTER MOV AH,09H
LEA DX,MESS5
INT 21H
ADD JISHU,1
JMP GL
GEXIT1:
CALL NEAR PTR ENTER
CALL NEAR PTR ENTER
RET
GEXIT2:
CALL NEAR PTR ENTER
MOV AH,09H
CALL NEAR PTR ENTER
LEA DX,MESS7
INT 21H
CALL NEAR PTR PRINT
CALL NEAR PTR ENTER
CALL NEAR PTR ENTER
RET
GUESS ENDP
PRINT PROC NEAR
MOV AX,RANDOM
MOV BL,100
DIV BL
MOV BL,AH
CMP AL,0
JE PL1
MOV DL,AL
OR DL,30H
MOV AH,02H
INT 21H
PL1:MOV AL,BL
MOV AH,0
MOV BL,10
DIV BL
MOV BL,AH
CMP AL,0
JE PL2
MOV DL,AL
MOV AH,02H
INT 21H
PL2:MOV DL,BL
OR DL,30H
MOV AH,02H
INT 21H
RET
PRINT ENDP
INPUT PROC NEAR
MOV BX,0
INL1:MOV AH,01H
INT 21H
CMP AL,0DH
JZ INEXIT
CMP AL,30H
JAE INL2
CMP AL,08H
JE INL1
CALL NEAR PTR ENTER
MOV AH,09H
INL2:CMP AL,39H
JBE INL3
CALL NEAR PTR ENTER
MOV AH,09H
JMP INL1
INL3:AND AL,0FH
MOV AH,0
XCHG BX,AX
MOV CX,10
MUL CX
ADD BX,AX
JMP INL1
INEXIT:
MOV INNUM,BX
RET
INPUT ENDP
ENTER PROC NEAR
PUSH AX
PUSH DX
MOV AH,02H
MOV DL,0DH
INT 21H
INT 21H
POP DX
POP AX
RET ENTER ENDP CODE ENDS END BEGIN
4.2程序运行截图:
利用16位编译系统调试程序如图4-1所示
图4-1 利用16位编译系统调试程序游戏开始界面如图4-2所示
图4-2 游戏开始界面
摁S后开始游戏如图4-3所示
图4-3 摁S后开始游戏猜测直到数字正确如图4-4所示
图4-4 猜测直到数字正确
5心得体会
这次的课设算是最为艰难的一次了吧,甚至最后还换了一个题目,实在是觉得挺不好过的,最后没有做出最开始的题目,在网上和书上寻找资料的时候,实在是找不到相关的资料,去向大四的学长门请教,他们也都说帮不上忙。
在苦恼了很久之后最终还是换了一个题目,这个题目十分有趣,和以前玩的一个游戏特别类似,而现在可以在程序上把它表达出来让我感到十分兴奋,这让没有做出先前题目的郁闷也消了一些。
这个课题的难点主要是在随机数的产生,有用函数产生的伪随机数和随机调用计算机相关信息产生随机数的方法,最终是通过DOS 调用产生随机数并存在RAM中,在查找了许多资料并重新温习了一遍课本的有关知识之后,最终完成了这个程序,并发现了以前知识学习中的很多不足,巩固了所学习的知识,并且让人对或许有些死板的汇编语言产生了新的热情。
这次的课程设计收获颇多,希望寒假自己能在家找到资料,争取在把倍频信号发生器做出来。
参考文献
[1]彭虎、周佩玲、傅忠谦.微机原理与接口技术(第3版)[M].电子工业出版社,
2011
[2]宋杰、汪志宏、江敏.微机原理与接口技术课程设计[M].机械工业出版社,2005
[3]李现国、张艳. Proteus仿真在微机原理及接口技术教学中的应用. 实验技术与
管理, 2010年12月第27卷第12期
[4]黄明,梁旭,常征著.汇编语言程序设计习题详解[M].北京:机械工业出版社,
2004
[5]李群芳,张士军,黄建编著.单片机微型计算机与接口技术[M].电子工业出版
社,2005
[6]周明德.微型计算机系统原理及应用[M].北京:清华大学出版社,2007年。