课程设计打字游戏.doc
- 文档编号:14743303
- 上传时间:2023-06-26
- 格式:DOC
- 页数:15
- 大小:141KB
课程设计打字游戏.doc
《课程设计打字游戏.doc》由会员分享,可在线阅读,更多相关《课程设计打字游戏.doc(15页珍藏版)》请在冰点文库上搜索。
汇编语言课程设计
设计题目:
指法练习
班级:
计算机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,0
movdh,op1;起行
movdl,op2;起列
op6:
movah,02h
movbh,00h
int10h
pushcx
movah,0ah
moval,op3;要显示的字符
movcx,01h
movbh,00h
int10h
popcx
inccx
incop4;指出循环输出的是行还是列
cmpcx,op5;循环次数
jneop6
endm
;=======================================================
cleanmacroop1,op2,op3,op4;用于清屏,分别是起止的行和列
movah,6
movbh,00010111b
moval,0
movch,op1
movcl,op2
movdh,op3
movdl,op4
int10h
movah,2
movbh,0
movdh,0
movdl,0
int10h
endm
;======================================================
menumacroop1,op2,op3;用于屏幕上文字的输出
movcx,0
movah,02h
movbh,00h
movdh,op1
movdl,op2
int10h
leadx,op3
movah,9
int21h
endm
;=======================================================
datasegment
fgfdb'===============================================$';分隔符
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:
$'
madb0
mbdb0
sped1dw0
speeddw3000d;游戏的速度,也决定了游戏的难度
lettersdb78dup(0);上方显示的字母
lifedb39h
positiondb1;上方字母的位置用于控制落下的字母
time_mdb0
time_sdb0
xmuldb13
ndb26
score1db0
leveldb1
hangdb0
linedb0
fen1db0
fen2db0
fen3db0
fen4db0
fen5db0
stringdb'100%$'
errordb0
dataends
;============================================
codesegment
assumecs:
code,ds:
data;,ss:
stack
15
start:
movax,data
movds,ax
;这里是几个数据的初始化
movposition,1
movspeed,3000
movlevel,1
movsped1,50000
moverror,0
movscore1,0
jiemian:
movah,01h
movcx,00h
orch,00010000b
int10h
;置光标类型,用于隐藏光标
clean0,0,24,79
;下面这些是游戏的初始化
init_game0,0,08h,dl,80,sk1
init_game24,0,08h,dl,80,sk2
init_game0,0,08h,dh,25,sk3
init_game0,79,08h,dh,25,sk4
menu5,15,fgf
menu7,25,menu1
;界面显示
menu9,25,menu2
menu11,25,menu3
menu13,15,fgf
menu15,25,menu4
menu17,55,menu5
menu19,55,menu6
menu21,55,menu11
movah,2
movbh,0
movdh,15
movdl,47
int10h
;把光标放在合适的位置
movah,0ah
moval,''
movbh,00h
movcx,01h
int10h
;在选择时屏蔽其他的按键,使之不出现在屏幕上
movah,1
int21h
input:
cmpal,'1'
jebegin
;当输入字符是1时,
;跳转到begin开始游戏
cmpal,'2'
jeto_speed_c
;当输入字符是2时,跳转,
;由于不能直接跳转到
;speed_c故用了个转移
cmpal,'3'
jeto_exit
cmpal,1bh
jeto_exit_d
to_otherkey:
jmpotherkey
to_exit:
movah,1
int21h
cmpal,0dh
jneto_otherkey
jmpexit
to_speed_c:
jmpspeed_c
to_exit_d:
jmpexit
;===================================
begin:
movah,1
int21h
cmpal,0dh
jneto_otherkey
clean1,1,23,78
play_message:
;显示有关游戏提示
menu10,18,meg1
menu12,18,meg2
menu14,18,meg3
menu16,18,meg4
movah,07h
int21h
cmpal,1bh
;按任意键继续,
;不把输入的字符显示在屏幕上
jeto_jm
jmpplay
to_jm:
jmpjiemian
play:
clean1,1,23,78
movlife,39h
movah,2
movbh,0
movdh,1
movdl,1
int10h
movbx,0
leasi,letters
output_letters:
;显示上方字母
movah,2ch
int21h
moval,dl
movah,0
divn
movdl,ah
adddl,61h
mov[si],dl
movah,2
int21h
movcx,14987
callwaitf
incsi
incbx
cmpbx,78
jenext
jmpoutput_letters
next:
menu23,70,meg5
menu23,30,meg6
;生命数的相关显示
pushdx
movah,2
movbh,0
movdh,23
movdl,76
int10h
movah,0ah
moval,life
movbh,0
movcx,1
int10h
movah,2
movbh,0
movdh,23
movdl,43
int10h
movah,0ah
moval,score1
moval,30h
movbh,0
movcx,1
int10h
popdx
jmpgame
sub_p:
subposition,78
cmpposition,0
jnenext3
incposition
next3:
jmpgame_next
game:
leasi,letters
movah,2ch
;伪随机算法,方法是读取1/100秒,
int21h
moval,dl
movposition,al
cmpposition,0
jnenext2
incposition
next2:
cmpposition,78
;和78比较,大于则减去78
jasub_p
game_next:
addsi,wordptrposition
decsi
movdl,position
;position就代表的是列
movah,02h
movdh,1
movbh,0
int10h
;置光标位置
movbl,12h
temp:
movcx,0
nextrow:
pushcx
movcx,0
yanchi:
;延迟
pushcx
movcx,0
yanchi1:
addcx,1
cmpcx,sped1
;延迟
jneyanchi1
pushdx
movah,06h
movdl,0ffh
int21h
popdx
jzpass
;不输入则跳转pass
cmpal,""
jepause1;空格,暂停
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 打字 游戏