课程设计任务书学生姓名:专业班级:自动化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 NEARPUSH AXPUSH DXMOV AH,0 ;读时钟计数器值INT 1AHMOV AX,DXAND AH,3 ;将高6位清零MOV DL,150 ;除以150,产生0~149余数,余数在AH 中DIV DLMOV AL,AHMOV AH,0MOV RANDOM,AX ;将随机数保存于RANDOM中MOV AH,09HLEA DX,MESS2INT 21HCALL NEAR PTR ENTERPOP DXPOP AXRETRAN ENDP3.2 INPUT的主要算法INPUT PROC NEARMOV BX,0INL1:MOV AH,01HINT 21HCMP AL,0DHJZ INEXITCMP AL,30HJAE INL2CMP AL,08HJE INL1CALL NEAR PTR ENTERMOV AH,09HLEA DX,MESS9INT 21HINL2:CMP AL,39HJBE INL3CALL NEAR PTR ENTERMOV AH,09HLEA DX,MESS9INT 21HJMP INL1INL3:AND AL,0FHMOV AH,0XCHG BX,AXMOV CX,10MUL CXADD BX,AXJMP INL1 INEXIT:MOV INNUM,BXRETINPUT ENDP3.3 ENTER的主要算法ENTER PROC NEARPUSH AXPUSH DXMOV AH,02HMOV DL,0DHINT 21HMOV DL,0AHINT 21HPOP DXPOP AXRETENTER ENDP4 源程序4.1程序代码DATA SEGMENTRANDOM DW ? ;用于保存产生的随机数INNUM DW ? ;用于保存玩家输入的数JISHU DW 0 ;用于保存玩家猜数的次数MENU DW 0DB 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 YOUGUESS(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 ENDSCODE SEGMENTMAIN PROC FARASSUME CS:CODE,DS:DATABEGIN:PUSH DSSUB AX,AXPUSH AXMOV AX,DATAMOV DS,AXCALL NEAR PTR ENTERMOV AH,09HLEA DX,TITLE1INT 21HMOV DX,OFFSET MENUINT 21HLEA DX,MESS8INT 21HMOV AH,01HINT 21HCALL NEAR PTR ENTER ML1: CMP AL,'S'JE ML2ML2: MOV JISHU,0MOV AH,09HLEA DX,MESS1INT 21HCALL NEAR PTR ENTERCALL NEAR PTR RANCALL NEAR PTR GUESSMOV AH,09HLEA DX,MESS8INT 21HMOV AH,01HINT 21HCALL NEAR PTR ENTER ML3:CMP AL,'E'JE EXITML4:MOV AH,09HMOV AH,01HINT 21HCALL NEAR PTR ENTERJMP ML1EXIT:CALL NEAR PTR ENTER MOV AH,4CHINT 21HRETMAIN ENDPRAN PROC NEARPUSH AXPUSH DXMOV AH,0 ;读时钟计数器值INT 1AHMOV AX,DX ;将高6位清零AND AH,3MOV DL,150 ;除以150,产生0~149余数,余数在AH中DIV DLMOV AL,AHMOV AH,0MOV RANDOM,AX ;将随机数保存于RANDOM中MOV AH,09HLEA DX,MESS2INT 21HCALL NEAR PTR ENTERPOP DXPOP AXRETRAN ENDPGUESS PROC NEARMOV AH,09HLEA DX,MESS3INT 21HADD JISHU,1GL:CALL NEAR PTR INPUTMOV AX,INNUMMOV BX,RANDOMCMP AX,BXJA GL1JB GL2CALL NEAR PTR ENTERMOV AH,09HLEA DX,MESS6INT 21HCALL NEAR PTR ENTERLEA DX,MESS7INT 21HCALL NEAR PTR PRINTJMP GEXIT1GL1:CALL NEAR PTR ENTERMOV AH,09HLEA DX,MESS4INT 21HADD JISHU,1JMP GLGL2:CALL NEAR PTR ENTER MOV AH,09HLEA DX,MESS5INT 21HADD JISHU,1JMP GLGEXIT1:CALL NEAR PTR ENTERCALL NEAR PTR ENTERRETGEXIT2:CALL NEAR PTR ENTERMOV AH,09HCALL NEAR PTR ENTERLEA DX,MESS7INT 21HCALL NEAR PTR PRINTCALL NEAR PTR ENTERCALL NEAR PTR ENTERRETGUESS ENDPPRINT PROC NEARMOV AX,RANDOMMOV BL,100DIV BLMOV BL,AHCMP AL,0JE PL1MOV DL,ALOR DL,30HMOV AH,02HINT 21HPL1:MOV AL,BLMOV AH,0MOV BL,10DIV BLMOV BL,AHCMP AL,0JE PL2MOV DL,ALMOV AH,02HINT 21HPL2:MOV DL,BLOR DL,30HMOV AH,02HINT 21HRETPRINT ENDPINPUT PROC NEARMOV BX,0INL1:MOV AH,01HINT 21HCMP AL,0DHJZ INEXITCMP AL,30HJAE INL2CMP AL,08HJE INL1CALL NEAR PTR ENTERMOV AH,09HINL2:CMP AL,39HJBE INL3CALL NEAR PTR ENTERMOV AH,09HJMP INL1INL3:AND AL,0FHMOV AH,0XCHG BX,AXMOV CX,10MUL CXADD BX,AXJMP INL1INEXIT:MOV INNUM,BXRETINPUT ENDPENTER PROC NEARPUSH AXPUSH DXMOV AH,02HMOV DL,0DHINT 21HINT 21HPOP DXPOP AXRET ENTER ENDP CODE ENDS END BEGIN4.2程序运行截图:利用16位编译系统调试程序如图4-1所示图4-1 利用16位编译系统调试程序游戏开始界面如图4-2所示图4-2 游戏开始界面摁S后开始游戏如图4-3所示图4-3 摁S后开始游戏猜测直到数字正确如图4-4所示图4-4 猜测直到数字正确5心得体会这次的课设算是最为艰难的一次了吧,甚至最后还换了一个题目,实在是觉得挺不好过的,最后没有做出最开始的题目,在网上和书上寻找资料的时候,实在是找不到相关的资料,去向大四的学长门请教,他们也都说帮不上忙。