387.A汇编课程设计猜数字游戏的设计与实现 课程设计正文_第1页
387.A汇编课程设计猜数字游戏的设计与实现 课程设计正文_第2页
387.A汇编课程设计猜数字游戏的设计与实现 课程设计正文_第3页
387.A汇编课程设计猜数字游戏的设计与实现 课程设计正文_第4页
387.A汇编课程设计猜数字游戏的设计与实现 课程设计正文_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课 程 设 计题 目猜数字游戏的设计与实现学 院计算机科学与技术学院专 业计算机科学与技术班 级计算机 班姓 名 指导教师 2010年1月14日 猜数字游戏的设计与实现1. 问题描述 设计一个猜数字的游戏,程序运行后自动产生一个1100之间的随机整数。游戏开始后,程序根据游戏者输入的数字与所需猜测数字进行比较并给出响应,游戏者根据程序给出的响应再次猜数字,最后得到正确数字。程序应有相应的操作、输入和输出提示,用户界面要求友好,最好是菜单式的界面。2.简要的分析与概要设计 此程序的关键问题是如何产生一个1100之间的随机整数(本程序中所涉及的数均指整数,以下不再赘述)。我们可以调用bios的功能

2、调用1ah号中断(mov ah,0 int 1ah)或者调用dos系统功能调用21h号中断(mov ah,2ch int 21h)取系统时间,dh:dl=秒:1/100秒。将dx中的内容赋给ax,并将ax的高六位清零,然后ax除以100,则会产生099之间的余数,余数保存在ah中,再将ah加1,则可得到一个1100之间的随机数。 本程序共分为六个模块: main -程序的入口点,程序运行后在dos屏幕上显示主菜单,给出相关的操作提示,并调用ran、guess、crlf等子程序。 ran -调用相关的中断,取系统时间,产生一个1100之间的随机数。 guess -本程序的重要模块,调用input

3、、print、crlf等子程序。 input -用于玩家输入其所猜之数,并给出相关的输入提示。 print -用于游戏结束时输入系统所产生的随机数。 crlf -用于回车换行 crlf guessranmain 各模块之间的调度关系如下: guess printcrlf input crlf crlf3.详细的算法描述 3.1 main的主要算法 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 crlf mov ah,09h lea

4、 dx,title1 int 21h mov dx,offset menu int 21h lea dx,mess10 int 21h mov ah,01h int 21h call near ptr crlf ml1: cmp al,s jne ml3 ml2: mov count,0 mov ah,09h lea dx,mess1 int 21h call near ptr crlf call near ptr ran call near ptr guess mov ah,09h lea dx,mess10 int 21h mov ah,01h int 21h call near ptr

5、crlf ml3:cmp al,r je ml2 ml4:cmp al,e je exit ml5:cmp al,h jne ml6 mov ah,09h mov dx,offset help int 21h lea dx,mess10 int 21h mov ah,01h int 21h call near ptr crlf jmp ml1 ml6:mov ah,09h lea dx,mess9 int 21h mov ah,01h int 21h call near ptr crlf jmp ml1 exit:call near ptr crlf mov ah,4ch int 21h re

6、tmain endp3.2 ran的主要算法 ran proc near push ax push dx mov ah,0 ;读时钟计数器值 int 1ah mov ax,dx and ah,3 ;将高6位清零 mov dl,100 ;除以100,产生099余数,余数在ah中 div dl add ah,1 ;ah加1,产生1100之间的数 mov al,ah mov ah,0 mov random,ax ;将随机数保存于random中 mov ah,09h lea dx,mess2 int 21h call near ptr crlf pop dx pop ax retran endp3.3

7、 guess的主要算法 guess proc near mov ah,09h lea dx,mess3 int 21h add count,1 gl:call near ptr input mov ax,innum mov bx,random cmp ax,bx ja gl1 jb gl2 call near ptr crlf mov ah,09h lea dx,mess6 int 21h call near ptr crlf lea dx,mess7 int 21h call near ptr print jmp gexit1 gl1:cmp count,06h ja gexit2 call

8、 near ptr crlf mov ah,09h lea dx,mess4 int 21h add count,1 jmp gl gl2:cmp count,06h ja gexit2 call near ptr crlf mov ah,09h lea dx,mess5 int 21h add count,1 jmp glgexit1: call near ptr crlf call near ptr crlf retgexit2: call near ptr crlf mov ah,09h lea dx,mess8 int 21h call near ptr crlf lea dx,mes

9、s7 int 21h call near ptr print call near ptr crlf call near ptr crlf retguess endp3.4 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 crlf mov ah,09h lea dx,mess9 int 21h inl2:cmp al,39h jbe inl3 call near ptr crlf

10、 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 inl1inexit: mov innum,bx retinput endp3.5 print的主要算法 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 mo

11、v bl,10 div bl mov bl,ah cmp al,0 je pl2 mov dl,al or dl,30h mov ah,02h int 21h pl2:mov dl,bl or dl,30h mov ah,02h int 21h retprint endp3.6 crlf的主要算法crlf proc near push ax push dx mov ah,02h mov dl,0dh int 21h mov dl,0ah int 21h pop dx pop ax retcrlf endp3.7 数据段的定义 data segment random dw ? ;用于保存产生的随

12、机数 innum dw ? ;用于保存玩家输入的数 count dw 0 ;用于保存玩家猜数的次数 menu ;主菜单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,* r.replay the game * db 0dh,0ah,* * db 0dh,0ah,* e. exit the game * db 0dh,0ah,* * db 0dh,0ah,* h. ask for help *

13、 db 0dh,0ah,* * db 0dh,0ah,* db 0dh,0ah,$ help ;帮助信息 db 0dh,0ah,* db 0dh,0ah,* * db 0dh,0ah,* helpinformation: * db 0dh,0ah,* * db 0dh,0ah,* 1.if you want to start the game,please press key s.* db 0dh,0ah,* * db 0dh,0ah,* 2.if you want to replay,please press key r. * db 0dh,0ah,* * db 0dh,0ah,* 3.if

14、 you want to exit,please key e. * db 0dh,0ah,* * db 0dh,0ah,* 4.when you play,you have only 7 chances at one time. * 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 g

15、enerated.$ mess3 db 0dh,0ah,please input the number you guess(decimal,betweem 1 and 100):$ mess4 db 0dh,0ah,the number you guess is bigger ,please reguess:$: mess5 db 0dh,0ah,the number you guess is smaller,please reguess:$ mess6 db 0dh,0ah,congratulations,you guessed!$ mess7 db 0dh,0ah,the random n

16、umber is $ mess8 db 0dh,0ah,you have guessed too many times,game over!$ mess9 db 0dh,0ah,the input is incorrect,please reinput:$ mess10 db 0dh,0ah,please input your choice:$data ends4.程序的测试与运行结果4.1 调试过程中出现的问题 在masm5中调试出现以下问题: (1)suiji.asm:error a2009:symbol not defined:ml1suiji.asm:error a2009:symbo

17、l not defined:ml1(2)suiji.asm:error a4031:operand types must match suiji.asm:error a4031:operand types must match (3)suiji.asm:warning a4085:end of file, no end directive end of file encountered on input file (4)suiji.asm:error a2061:improper use of segment register (5)suiji.asm:warning a4016:reserv

18、ed word used as symbol: cl 4.2 运行结果 调试成功后运行如下: a.主菜单: b.帮助信息:c.7次以内猜对的结果: d.7次以内猜不对的结果:5.使用说明 1.程序经过汇编、连接、运行后,屏幕上将显示猜数字游戏的主菜单。如下所示: main menu s. start the game r. replay the game e. exit the game h. ask for help 玩家在键盘上敲击 s 键时,游戏开始;敲击e键时,退出游戏。如果玩家需要帮助,则可以敲击h键。 2一次游戏中,玩家最多只能猜数字7次。如果玩家在7次内猜中,程序会给出提示信息“

19、congratulations,you guessed!” ;如果没猜中,则游戏给出提示信息“you have guessed too many times,game over!”。 3.如果玩家在一次游戏后想接着玩,则可以敲击r键时,游戏重新开始;如果不想接着玩,则可以敲击e键退出游戏。6.总结 6.1设计的特点 该课程设计的特点在于程序运行后产生随机数的过程比较巧妙。它是调用了bios功能调用的1ah号中断,读取系统时钟。然后进行除法运算得到余数,再进行加法运算得到符合要求的随机数。 此课程设计的另外一个特点是定义了多个子程序,将各功能模块化,便于在调试过程中查找错误和修改,不会影响其他模

20、块。6.2设计的不足 设计的不足之处在于,在猜数字游戏的程序中没有时间计时器去限制玩家猜一次数的时间,因而在游戏中也就没有暂停和继续两个功能。不能符合现实。6.3收获与体会 一周的汇编语言课程设计结束了,我的收获可以说是很大。通过这次的课程设计和对编程过程中遇到的问题的思考,有效地提高了我对汇编语言的认识和理解,切实地提高了我的编程能力,弥补了我的不足。通过这次课程设计,我对课本上和老师讲过的知识有了更深入的理解和体会,能用汇编语言熟练地运用顺序、选择、循环三大结构进一步掌握常用指令的功能。我进一步掌握了子程序的定义和调用及debug指令的运用。在整个程序的编写过程中,调试占了很大一部分的时间

21、。要想写好程序,弄懂程序,必须认真地对待每一个细节,熟练地掌握相关的命令。总之,通过这次的课程设计,我进一步熟悉了汇编语言的结构和使用方法,基本达到了能独立阅读、编制和调试一定规模的汇编语言程序的水平,并进一步培养了自己的实际动手能力。6.4展望 正如我在设计的不足中所提及的,由于自身的能力有限,所以在猜数字游戏的程序中没有时间计时器去限制玩家猜一次数的时间,因而在游戏中也就没有暂停和继续两个功能,不能符合现实。如果有可能,我将会在程序中增加时间计时器,限制玩家猜一次数的时间,并将在主菜单中增加“p.pause(暂停游戏)”和“c.continue(继续游戏)”两个选择项。7.参考文献 1 沈

22、美明、温冬婵等.ibm-pc 汇编语言程序设计(第2版).清华大学出版社.2001年8月 2 何友鸣、苏光奎、石曙东、徐爱芸等.汇编语言程序设计(第1版).武汉大学出版社.2006年3月 3 金汉军、金洋等.汇编语言程序设计(第1版).武汉大学出版社.2007年9月 4 杨季文等.80x86汇编语言程序设计教程.清华大学出版社.1999年3月 5 罗省贤、洪志全等.汇编语言程序设计教程.电子工业出版社.2004年1月源程序:data segment random dw ? ;用于保存产生的随机数 innum dw ? ;用于保存玩家输入的数 count dw 0 ;用于保存玩家猜数的次数 me

23、nu 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,* r. replay the game * db 0dh,0ah,* * db 0dh,0ah,* e. exit the game * db 0dh,0ah,* * db 0dh,0ah,* h. ask for help * db 0dh,0ah,* * db 0dh,0ah,* db 0dh,0ah,$ help db 0dh,0

24、ah,* db 0dh,0ah,* * db 0dh,0ah,*help information: * db 0dh,0ah,* * db 0dh,0ah,* 1.if you want to start the game,please press key s.* db 0dh,0ah,* * db 0dh,0ah,* 2.if you want to replay,please press key r. * db 0dh,0ah,* * db 0dh,0ah,* 3.if you want to exit,please key e. * db 0dh,0ah,* * db 0dh,0ah,*

25、 4.when you play,you have only 7 chances at one time. * 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

26、(decimal,betweem 1 and 100):$ mess4 db 0dh,0ah,the number you guess is bigger ,please reguess:$: mess5 db 0dh,0ah,the number you guess is smaller,please reguess:$ mess6 db 0dh,0ah,congratulations,you guessed!$ mess7 db 0dh,0ah,the random number is $ mess8 db 0dh,0ah,you have guessed too many times,g

27、ame over!$ mess9 db 0dh,0ah,the input is incorrect,please reinput:$ mess10 db 0dh,0ah,please input your choice:$data endscode segmentmain proc far assume cs:code,ds:data begin: push ds sub ax,ax push ax mov ax,data mov ds,ax call near ptr crlf mov ah,09h lea dx,title1 int 21h mov dx,offset menu int

28、21h lea dx,mess10 int 21h mov ah,01h int 21h call near ptr crlf ml1: cmp al,s jne ml3 ml2: mov count,0 mov ah,09h lea dx,mess1 int 21h call near ptr crlf call near ptr ran call near ptr guess mov ah,09h lea dx,mess10 int 21h mov ah,01h int 21h call near ptr crlf ml3:cmp al,r je ml2 ml4:cmp al,e je e

29、xit ml5:cmp al,h jne ml6 mov ah,09h mov dx,offset help int 21h lea dx,mess10 int 21h mov ah,01h int 21h call near ptr crlf jmp ml1 ml6:mov ah,09h lea dx,mess9 int 21h mov ah,01h int 21h call near ptr crlf jmp ml1 exit:call near ptr crlf mov ah,4ch int 21h retmain endpran proc near push ax push dx mo

30、v ah,0 ;读时钟计数器值 int 1ah mov ax,dx ;将高6位清零 and ah,3 mov dl,100 ;除以100,产生099余数,余数在ah中 div dl add ah,1 ;ah加1,产生1100之间的数 mov al,ah mov ah,0 mov random,ax ;将随机数保存于random中 mov ah,09h lea dx,mess2 int 21h call near ptr crlf pop dx pop ax retran endpguess proc near mov ah,09h lea dx,mess3 int 21h add count,

31、1 gl:call near ptr input mov ax,innum mov bx,random cmp ax,bx ja gl1 jb gl2 call near ptr crlf mov ah,09h lea dx,mess6 int 21h call near ptr crlf lea dx,mess7 int 21h call near ptr print jmp gexit1 gl1:cmp count,06h ja gexit2 call near ptr crlf mov ah,09h lea dx,mess4 int 21h add count,1 jmp gl gl2:cmp count,06h ja gexit2 c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论