课程设计打字游戏_第1页
课程设计打字游戏_第2页
课程设计打字游戏_第3页
课程设计打字游戏_第4页
课程设计打字游戏_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

PAGEPAGE2汇编语言课程设计设计题目:指法练习班级:计算机04-4班学号:20042390作者:王丰指导老师:郑利平日期:2007.1.5汇编语言课程设计报告<打字游戏>课程设计目的课程设计使学生更进一步理解和掌握汇编语言知识、程序设计的方法和技巧,使学生能够使用汇编语言分析、设计中小型程序的能力。通过课程设计,有助于学生更好的了解整个课程的知识体系,锻炼学生运用本课程的知识解决更复杂的实际问题的能力,从而为后续课程的学习、毕业设计以及将来的实际工作打好坚实的基础。二、设计题目指法练习设计要求1、从屏幕上方以一定的时间间隔随机落下可显示字符,字符的出现位置亦是随机的;2、在多个字符下落的过程中可输入任意键,若键入与其中的任意一个字符相匹配的键,则该字符高亮显示并发出蜂鸣声,同时计分;3、按ESC键结束练习并显示命中率;4、再次按ESC键退出。四、设计环境硬件:PC机,软件:masm5.0设计分析指法练习,是在屏幕上以一定的时间间隔随机的下落一写字符,我在程序中的设计方法是从屏幕的第一行开始显示一个字符,然后在用一个时间延时函数延时一段时间,再在此位置显示空格字符,延时后在同一列的下一行显示原字符,如此循环,中间如果有输入正确的字符,则,循环停止,并同时将此字符高亮显示,方法是改变此字符的属性,并将score加1,然后光标移到第一行还是新的循环.若输入中间字符不正确,循环到21行时,则扬声器发出蜂鸣声,同时life减1.设计中要求每次下落的字符是随机的,我在程序中的设计方法是取系统时间1/100秒,然后将此时间模取26,将得到余数加上61,将此作为输出字符的ASCLL码,如此循环78次,将这些字符存入letter缓冲区,并在屏幕最上方显示出来.开始下落的字母的位置也是随机的,同样取系统时间,,由于一行最多只能有78个字符,所以当取的时间大于等于78时,应减去78,将得到的结果作为取字符的位置,此种随机虽然不是很严谨,但用在此程序中还是很不错的.题目中还要求计算命中率,由于在游戏开始的同时开始了记分,所以在结束游戏时,将得分和错误统计出来,很容易计算出命中率,这里就不做多余的叙述.在题目的要求的基础上,我还给游戏增加了几个难度,其实也很简单,就是控制字母下落的速度,方法是改变每次字符显示的时间间隔,这样从屏幕上看,字母下落就会有快慢.程序的模块程序设计时,我没有分模块,只有实现个别功能的几个子程序,分别是发声程序,延时程序,和命中率计算与显示程序,这在原代码中均有注释,在此就不在详细叙述.课程设计心得由于课程设计开始的比较早,所以有时间去准备.开始时在网上看了一些资料和例子,搞清楚了程序设计的基本原理.最开始不明白的地方就是如何让字符下落,后来发现就是不停的在屏幕的不同位置显示该字符,加以延时,看起来就像是字符不断的从上面掉下来.随机问题也是本程序的一个难点,看过资料后知道汇编中没有现成的完美的随机函数.所以我就想到取系统时间来制造随机数,因为时间时刻都在变化,而且打字的时间也不一定,结果游戏的随机性还不错,呵呵这学期汇编的学习,自己感觉还不错,平时也练习了不少.从汇编程序的学习中,我觉得自己突然一下子明白了一般程序设计的原理,看程序时,不再感觉茫然,自己写点小程序时,也知道该如何下手.算法上也学到了不少新的东西,总算劳有所获吧!本打算把程序的运行流程图画出来,无奈,最近考试太多,时间实在不够啊,只有在程序中直接注释了,其实程序的思路很清晰,相信大家多能看懂最后,感谢郑利平老师一学期来指导和帮助,也感谢我们班的桑磊同学在课程设计中给我解答疑问!八、源程序如下:;=======================================================================;打字游戏程序;=======================================================================init_gamemacroop1,op2,op3,op4,op5,op6;循环输出,用于初始化界面movcx,0movdh,op1;起行movdl,op2;起列op6:movah,02hmovbh,00hint10hpushcxmovah,0ahmoval,op3;要显示的字符movcx,01hmovbh,00hint10hpopcxinccxincop4;指出循环输出的是行还是列cmpcx,op5;循环次数jneop6endm;=======================================================cleanmacroop1,op2,op3,op4;用于清屏,分别是起止的行和列movah,6movbh,00010111bmoval,0movch,op1movcl,op2movdh,op3movdl,op4int10hmovah,2movbh,0movdh,0movdl,0int10hendm;======================================================menumacroop1,op2,op3;用于屏幕上文字的输出movcx,0movah,02hmovbh,00hmovdh,op1movdl,op2int10hleadx,op3movah,9int21hendm;=======================================================datasegmentfgfdb'===============================================$';分隔符menu1db'1.startgame$'menu2db'2.selectlevel$';主界面上显示的内容menu3db'3.exit$'menu4db'selectnumberofmenu:$'menu5db'author:wangfeng$'menu6db'NO.:20042390$'menu7db'1.veryeasy$'menu8db'2.normal$';难度的选择menu9db'3.hard$'menu10db'4.return$'menu11db'data:2006.12.24$'meg1db'pressanykeytostartthegame...$';游戏开始之前的提示meg2db'pressesckeyreturnmainmenu$'meg3db'pressspacekeyforpause$'meg4db'whenthegamewaspaused,pressesetoquit!$'meg5db'life:$';生命数meg6db'score:$';分数meg7db'hittheletternum:$'meg8db'missletternum:$'meg9db'theshootingis:$'madb0mbdb0sped1dw0speeddw3000d;游戏的速度,也决定了游戏的难度lettersdb78dup(0);上方显示的字母lifedb39hpositiondb1;上方字母的位置用于控制落下的字母time_mdb0time_sdb0xmuldb13ndb26score1db0leveldb1hangdb0linedb0fen1db0fen2db0fen3db0fen4db0fen5db0stringdb'100%$'errordb0dataends;============================================codesegmentassumecs:code,ds:data;,ss:stackstart:movax,datamovds,ax;这里是几个数据的初始化movposition,1movspeed,3000movlevel,1movsped1,50000moverror,0movscore1,0jiemian:movah,01hmovcx,00horch,00010000bint10h;置光标类型,用于隐藏光标clean0,0,24,79;下面这些是游戏的初始化init_game0,0,08h,dl,80,sk1init_game24,0,08h,dl,80,sk2init_game0,0,08h,dh,25,sk3init_game0,79,08h,dh,25,sk4menu5,15,fgfmenu7,25,menu1;界面显示menu9,25,menu2menu11,25,menu3menu13,15,fgfmenu15,25,menu4menu17,55,menu5menu19,55,menu6menu21,55,menu11movah,2movbh,0movdh,15movdl,47int10h;把光标放在合适的位置movah,0ahmoval,''movbh,00hmovcx,01hint10h;在选择时屏蔽其他的按键,使之不出现在屏幕上movah,1int21hinput:cmpal,'1'jebegin;当输入字符是1时,;跳转到begin开始游戏cmpal,'2'jeto_speed_c;当输入字符是2时,跳转,;由于不能直接跳转到;speed_c故用了个转移cmpal,'3'jeto_exitcmpal,1bhjeto_exit_dto_otherkey:jmpotherkeyto_exit:movah,1int21hcmpal,0dhjneto_otherkeyjmpexitto_speed_c:jmpspeed_cto_exit_d:jmpexit;===================================begin:movah,1int21hcmpal,0dhjneto_otherkeyclean1,1,23,78play_message:;显示有关游戏提示menu10,18,meg1menu12,18,meg2menu14,18,meg3menu16,18,meg4movah,07hint21hcmpal,1bh;按任意键继续,;不把输入的字符显示在屏幕上jeto_jmjmpplayto_jm:jmpjiemianplay:clean1,1,23,78movlife,39hmovah,2movbh,0movdh,1movdl,1int10hmovbx,0leasi,lettersoutput_letters:;显示上方字母movah,2chint21hmoval,dlmovah,0divnmovdl,ahadddl,61hmov[si],dlmovah,2int21hmovcx,14987callwaitfincsiincbxcmpbx,78jenextjmpoutput_lettersnext:menu23,70,meg5menu23,30,meg6;生命数的相关显示pushdxmovah,2movbh,0movdh,23movdl,76int10hmovah,0ahmoval,lifemovbh,0movcx,1int10hmovah,2movbh,0movdh,23movdl,43int10hmovah,0ahmoval,score1moval,30hmovbh,0movcx,1int10hpopdxjmpgamesub_p:subposition,78cmpposition,0jnenext3incpositionnext3:jmpgame_nextgame:leasi,lettersmovah,2ch;伪随机算法,方法是读取1/100秒,int21hmoval,dlmovposition,alcmpposition,0jnenext2incpositionnext2:cmpposition,78;和78比较,大于则减去78jasub_pgame_next:addsi,wordptrpositiondecsimovdl,position;position就代表的是列movah,02hmovdh,1movbh,0int10h;置光标位置movbl,12htemp:movcx,0nextrow:pushcxmovcx,0yanchi:;延迟pushcxmovcx,0yanchi1:addcx,1cmpcx,sped1;延迟jneyanchi1pushdxmovah,06hmovdl,0ffhint21hpopdxjzpass;不输入则跳转passcmpal,""jepause1;空格,暂停jmpskip1pause1:jmppauseskip1:cmpal,1bhjedisplay;esc,返回到开始时的界面cmpal,[si]jeto_disappear;正确输入,字母消失pass:popcxinccxcmpcx,speed;speed,字母下落速度jeprint1jmpyanchiprint1:jmpprintto_disappear:movbh,0movah,3int10hmovhang,dhmovline,dlmovbh,0movah,9movcx,1movbl,1chint10hmovah,2movbh,0movdh,hangmovdl,lineint10hmovdl,[si]movah,2int21hcalldelay0jmpdisappear;跳到记分段display:clean1,1,23,78calldispmovah,1int21cmpal,1bhjeto_start1to_start1:jmpstartto_exit1:jmpexitpause:pushdxmovah,06hmovdl,0ffhint21hpopdxcmpal,1bh;暂停时输入大写的q,则退出游戏jedisplaycmpal,"";再次按空格,游戏继续jnepausejmppassprint:;在字母处输入空格填movah,0ahmovbh,0moval,""movcx,1int10hmovah,02hmovbh,0incdhint10h;光标下移一行movah,09hmoval,[si]movbh,0movcx,1int10h;输出字母popcxinccxcmpcx,21;如果落到第21行还没有消失,;则life减一,字母消失jeto_print_nextjmpnextrow;如果没到21行,继续下落to_print_next:pushaxmoval,errorincalmoverror,alpopaxcallsound1jmpprint_next;change_0:;jmpprint_nextdisappear:;正确输入后字母消失popcxpopcxmovah,0ahmovbh,0moval,""movcx,1int10hincscore1;此处代码是为了同步输出得分;和当前life的剩余值pushaxpushbxmoval,score1movah,0movbl,10divblmovfen1,almovfen2,ahpopbxpopaxmovah,2movbh,0movdh,23movdl,43int10hmovah,0ahmovbh,0moval,""movcx,1int10hmovah,0ahmoval,fen1addal,30hmovbh,0movcx,1int10hmovah,2movbh,0movdh,23movdl,44int10hmovah,0ahmovbh,0moval,""movcx,1int10hmovah,0ahmoval,fen2addal,30hmovbh,0movcx,1int10hmovdh,hang;输入正确后,;将该字符在原位置高亮显示movdl,linemovbh,0movah,2int10hmovah,9movbh,0moval,''movcx,1movbl,17hint10hjmphitto_over:jmpstartprint_next:;life减为0时,游戏结束sublife,1cmplife,30hjeto_overmovah,0ahmoval,""movbh,0movcx,1int10hmovah,02hmovdh,23movdl,76movbh,0int10h;更新lifemovah,0ahmoval,lifemovbh,0movcx,1int10hhit:;重新把光标移到顶端movah,02hmovbh,0movdh,1movdl,positionint10hmovah,2chint21hmoval,dlmovah,0divnaddah,61hmov[si],ah;重新在空格处设置一个字母movah,0ahmovbh,0movcx,1moval,[si]int10hjmpgamespeed_c:;速度选择movah,1int21hcmpal,0dhjneotherkeyjmpspeed_jmotherkey:;隐藏非法的字符pushaxmovah,2movbh,0movdh,15movdl,48int10hmovah,0ahmoval,""movbh,00hmovcx,01hint10hmovah,2movbh,0movdh,15movdl,47int10hpopaxmovdx,axmovah,2int21hjmpinputspeed_jm:;难度选择的界面clean1,1,23,78menu6,15,fgfmenu8,30,menu7menu10,30,menu8menu12,30,menu9menu14,30,menu10menu16,15,fgfmenu18,25,menu4choose_speed:movah,2movbh,0movdh,18movdl,47int10hmovah,1int21hchoose_next:cmpal,'1'jespeed1_1jmpspe2speed1_1:jmpspeed1spe2:cmpal,'2'jespeed2_2jmpspe3speed2_2:jmpspeed2spe3:cmpal,'3'jespeed3_3jmpspe4speed3_3:jmpspeed3spe4:cmpal,'4'jeh_jmcmpal,1bhjeh_jm_dh_jm:movah,1int21hcmpal,0dhjneotherkey1jmpjiemianh_jm_d:jmpjiemianspeed1:movsped1,50000djmpbeginspeed2:movsped1,40000djmpbeginspeed3:movsped1,20000djmpbeginotherkey1:pushaxmovah,2movbh,0movdh,20movah,2movbh,0movdh,15movdl,46int10hexit:;退出游戏movah,6movbh,7moval,0movch,0movcl,0movdh,24movdl,80int10hmovah,2movbh,0movdh,0movdl,0int10h;清屏movah,4chint21hwaitfprocnearpushaxwaitf1:inal,61handal,10hcmpal,ahjewaitf1movah,alloopwaitf1popaxretwaitfendpsound1proc;一个扬声器实验代码直接抄过来的呵呵pushcxpushaxmovcx,1000hinal,61handal,11111100bout61h,alagain:xoral,2out61h,alpushcxmovcx,0ffffhcontinue:noploopcontinuepopcxloopagainpopaxpopcxsound1endpretdelay0procpushcxpushaxmovcx,0ffffhdelay1:nopmovax,1000hdelay2:decaxjnzdelay2loopdelay1popaxpopcxretdelay0endpdispprocnear;这一段代码是为了显示打字结果的menu5,15,fgfmenu7,25,meg7menu9,25,meg8menu11,25,meg9menu13,15,fgfpushaxpushbxmoval,score1movah,0movbl,10divblmovfen3,almovfen4,ahpopbxpopaxpushaxpushdxmovah,2movbh,0;显示正确的得分movdl,45

温馨提示

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

评论

0/150

提交评论