[优秀毕业设计精品] 方块游戏设计 微机课程设计.doc

上传人:laozhun 文档编号:2385776 上传时间:2023-02-17 格式:DOC 页数:49 大小:201.50KB
返回 下载 相关 举报
[优秀毕业设计精品] 方块游戏设计 微机课程设计.doc_第1页
第1页 / 共49页
[优秀毕业设计精品] 方块游戏设计 微机课程设计.doc_第2页
第2页 / 共49页
[优秀毕业设计精品] 方块游戏设计 微机课程设计.doc_第3页
第3页 / 共49页
[优秀毕业设计精品] 方块游戏设计 微机课程设计.doc_第4页
第4页 / 共49页
[优秀毕业设计精品] 方块游戏设计 微机课程设计.doc_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《[优秀毕业设计精品] 方块游戏设计 微机课程设计.doc》由会员分享,可在线阅读,更多相关《[优秀毕业设计精品] 方块游戏设计 微机课程设计.doc(49页珍藏版)》请在三一办公上搜索。

1、前 言微机已经成为人们生活中必不可少的一部分,掌握微机原理及其相关知识是我们电类专业的必备知识。8086 CPU曾是使用最广泛的16为微处理器,它由执行部件和总线接口部件组成。汇编语言是面向机器的程序设计语言。在汇编语言中,用助记符代替操作码,用地址编号代替地址码。汇编语言用比机器语言易于读写、调试和修改,同时具有机器语言的全部优点。汇编语言用来编制系统软件和过程软件,其目标程序占用内存少,运行速度快,有着高级语言不可代替的用途。通过学习和使用汇编语言,能够感知、体会、理解机器的逻辑功能,向上为理解各种软件系统的理解,打下结束理论基础;向下为掌握硬件系统的原理,打下实践应用基础 。 本次课程设

2、计题目是方块游戏设计,其中很多涉及到DOS调用的相关知识。DOS功能调用通过软件中断调用的,在中断调用前需要把功能号装入AH寄存器中,把子功能号装入到AL中,除此之外,还需要在CPU的寄存器中提供专门的调用参数。调用之前,首先将调用参数装入指定的寄存器,然后把功能号装入AH中。按中断号调用DOS,检查返回参数是否正确。 课程设计任务书 题 目: 方块游戏软件设计 初始条件:带有编辑器、汇编程序、连接程序和调试程序的电脑一台。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)采用汇编语言设计一个方块游戏软件,实现将从屏幕上方下落的方块用键盘控制移动,按下某键停止。

3、按Q退出程序。(1) 设计任务及要求分析(2) 方案比较及认证说明(3) 系统原理阐述(4) 软件设计课题需要说明:软件思想,流程图,源程序及程序注释(5) 调试记录及结果分析(6) 总结(7) 参考资料(8) 附录:芯片资料或程序清单,软件演示屏幕拷贝图或硬件实物图时间安排:1月10日1月12日:收集资料,方案选择1月13日1月16日:整体流程,程序细节1月17日1月20日:调试程序,报告撰写1月21日: 交设计报告,程序演示,答辩 指导教师签名: 年 月 日系主任(或责任教师)签名: 年 月 目 录1 课设任务及要求分析41.1问题描述41.2任务目标41.3需求规定42 方案比较及认证4

4、3 系统原理阐释54.软件设计54.1软件思想54.2源程序及注释95 调试记录及结果分析96设计心得127 参考文献12附录一:源程序及注释13附录二 本科生课程设计成绩评定表49方块游戏设计1 课设任务及要求分析1.1问题描述 在windows环境下写一个程序,能够提供简单的用户图形界面,启动程序后进入该界面,用户界面由一定数量的小方格组成的方块构成。当游戏开始时,计算机将随机抽取方块的放到方格上。此游戏允许玩家旋转方块,左右移动,加速向下,满行消除并计分。1.2任务目标1在windows环境下建立一个简单的用户界面,显示重新游戏、暂停、退出等键2游戏开始后,通过指定的功能键控制方块,方块

5、可以左右移动、落下、旋转。3界面上要显示分数和游戏的难度,还要预先显示下一个方块。1.3需求规定表1 产品功能需求表功能1. 随机产生经典俄罗斯方块图形2. 设置难度级别,不同级别速度不同3. 方向键实现下落图形的左移、右移、加速下落、变形等基本操作4. 正确判断游戏结束5. 对游戏成绩进行记分2 方案比较及认证 方案一:直接在界面上显示功能性控制键。 方案二:在菜单栏中显示控制游戏的功能性键,并且能够自定义背景颜色和游戏音乐。 方案比较:第一种方案简洁。第二种方案体现游戏的个性化,显示菜单栏很经典,但实现起来比较复杂。 结论:由于第一种方案比较简洁,能够完成设计的功能要求,且比较容易实现,相

6、对第二种方案的复杂,故选择方案一。3 系统原理阐释对俄罗斯方块游戏项目计划划分为三个模块,分别为初始化设置和窗口函数相关模块、绘制方块模块、方块移动模块。其中绘制方块模块、方块移动下落模块是先决条件。在该模块完成的基础上,初始化设置和窗口函数相关模块才能得以实现。编写一个主程序和相关的子程序和宏定义,通过主程序调用控制不同功能能的子程序来实现游戏的运行。定义一些宏,包括printstring(显示字符串)、string(在光标位置显示字符及其属性)、clrscr(清屏)、closecur(不显示光标)、gotoxy(设置光标位子)、clrkey(清除键盘缓冲区、,并调用一种键盘属性)、push

7、all(进栈保护现场)、popall(出栈恢复现场)、block(在光标位置显示2次0dbh,属性为attr)、 cprintf(在光标位置显示ch)、 random(定义随机函数,随机产生砖块)、printscore(显示分数)。然后在做一些初始化定义。定义数据段,先定义方块的形状和一些标志性变量,在定义一些显示信息和音乐。定义堆栈段,开辟了100字的空间。定义代码段,先清屏,对屏幕进行初始化设计,然后根据游戏的功能调用相应的功能性子程序,使游戏能够按所要求的顺序运行。在调用子程序时注意相关寄存器先要进入堆栈进行保护,然后在子程序调用完之后出栈恢复断点。相应的功能键为:Q/q(退出游戏),E

8、ND(暂停),HOME(重新游戏),(方块旋转),(方块加速下落),(方块左移),(方块右移)。4.软件设计4.1软件思想主程序完成code与代码段联系, data与数据段联系, data与拓展段联系, stack与堆栈段联系。然后清屏,不显示光标。最后通过调用一些子函数和宏来实现游戏的功能。在主程序中,调用的宏包括clrscr(清屏)、closecur(不显示光标)、clrkey(清除键盘缓冲区,并调用一种键盘属性),调用的子程序包括game_screen (调用游戏屏)、new_game(游戏初始化)、score(计分)、moveable(判断能否移动,产生移动标志mable)、brick

9、_reach_bottom(砖块到底之后执行的操作)、music(音乐)。通过顺序、判断、循环三种基本结构和子程序与宏来实现程序的正常运行。其中有的子程序包含更小的子程序和宏。在程序运行中,会频繁的调用一些中断,常用的中断号有10H(显示器I/O调用),16H(键盘I/O调用),1AH(时间调用),21H(写输入中断)。调用方法如下:16H中断调用有三个功能,功能号为02。(1)AH=0 本功能为从键盘读字符到AL寄存器中。(2)AH=1 本功能为读键盘缓冲区字符到AL寄存器中,并置ZF标志位。(3)AH=2 本功能为读取特殊功能键的状态。1AH中断调用有二个功能。功能号为0和1。(1)AH=

10、0 本功能为读取时钟计数器的当前值。(2)AH=1 本功能为设置时钟计数器的当前值。10H中断调用共有16个功能。功能号为015。(1)设置显示方式(0号功能)入口参数:AH=0(功能号),AL=设置方式(07)。出口参数:无。(2)设置光标类型(1号功能)入口参数:AH=1(功能号),CH=光标开始行,CL=光标结束行。出口参数:无。根据CX给出光标的大小。(3)设置光标位置(2号功能) 入口参数:AH=2(功能号),BH=页号,DH=行号,DL=列号。 出口参数:无。根据DX确定了光标位置。(4)读当前光标位置(3号功能)入口参数;AH=3(功能号),BH=页号。出口参数:DH=行号,DL

11、=列号,CX=光标大小。(5)初始窗口或向上滚动(6号功能)入口参列号。BH=空白行的属性。出口参数:无。当滚动后,底部为空白输入行。(6)初始窗口或向下滚动(7号功能)入口参数:AH=7,AL=下滚行数,CX=下滚窗口左上角的行、列号。DX=下滚窗口右下角的行、列号。BH=空白行的属性。出口参数:无。当滚动后,顶部为空白输入行。(7)读当前光标位置的字符与属性(8号功能)入口参数:AH=08H,BH=页号。出口参数:AL为读出的字符,AH为字符属性。(8)在当前光标位置写字符和属性(9号功能)入口参数:AH=9,BH=页号,AL=字符的ASCII码,BL=字符属性,CX=写入字符数。出口参数

12、:无。(9)在当前光标位置写字符(10号功能)入口参数:AH=0AH,BH=页号,AL=字符的ASCII码,CX=写入字符数。出口参数:无。(10)设置彩色组或背景颜色(11号功能)入口参数:AH=0BH,BH=0或1,BH为0时,设置背景颜色。当BH=1时 ,可设置彩色组,即为显示的像素点确定颜色组。出口参数:无。背颜色与对应值见表1.8。(11)写像素(12号功能)入口参数:AH=0CH,DX=行数,CX=列数,AL=彩色值(AL的D7为1,则彩色值与当前点内容作异或运算)。出口参数:无。(12)读像素(13号功能)入口参数:AH=0DH,DX=行数,CX=列数。出口参数:AL=彩色值。(

13、13)写字符并移光标位置(14号功能)入口参数:AH=0EH,AL=写入字符,BH=页号,BL=前景颜色(图形方式)。出口参数:无。主程序的流程如图1所示读控制键NoYesNo结束游戏初始化分数初始化产生砖块是否到底砖块到底后的操作计分游戏是否结束调用音乐是否重新开始暂停返回DOS调用游戏屏幕不显示光标清屏开始移动砖块方向键YesNoYesNoQ/qHome下落EndYesNoYesNoYes 图1 程序框图4.2源程序及注释见附录一5 调试记录及结果分析 调试中通过单步运行方式来观察程序的走向,开是否是按设想的方向运行,若不是则,分析问题,修改源程序,使之符合。程序运行结果如下 图2游戏开始

14、 图3 方块左移 图4 方块右移 图5 方块旋转 图6 游戏结束程序运行中能够实现设计所要求的功能,所以此设计比较成功。6设计心得微机原理课程设计结束了,我的收获很大。通过课程设计的编程和对编程过程中遇到的问题的思考,有效的提高了我对汇编的认识和理解,切实的提高了我的编程能力,补全了我的不足。通过这次课程设计,我巩固所了学过的知识,能用汇编语言熟练地运用顺序、选择、循环三大结构,进一步掌握了各个指令的功能。此外,我对BIOS调用和DOS调用有了更深刻的认识。我尝试的编写了俄罗斯方块游戏,这对于我们来说是个挺大的困难,但我们克服了,我最终完成了程序,实现了所有的功能,我很自豪。在整个程序的编写中

15、,调试占了很大部分的时间。我认为要想写好汇编语言的程序,必须认真对待代码的每一个细节,还必须熟练的掌握编译和执行的过程,这对程序的调试是非常重要的。通过这次实际动手能力的培养,我进一步熟悉了汇编语言的结构和使用方法,基本达到了能独立阅读、编制和调试一定规模的汇编语言程序的水平。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不

16、足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。这次课程设计终于顺利完成了,在设计中遇到了很多专业知识问题,最后在老师的辛勤指导下,终于游逆而解。同时,在老师的身上我们学也到很多实用的知识,在次我们表示感谢!同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!7 参考文献1周佩玲等.微机原理与接口技术(第二版).北京:电子工业出版社,20082刘乐善.微型计算机接口技术及应用.武汉:华中科技大学出版社,20003姚燕南.微型计算机原理与接口技术.北京:高等教育出版社,2004附录一:源程序及注释;*宏定义*printstring macro x,y,mess ;less b

17、l,cx ;*显示字符串*push bpmov dh,ymov dl,xmov bh,0lea bp,messmov al,1mov ah,13hint 10hpop bpendmstring macro ch,len ;*在光标位置显示字符及其属性*mov bh,0mov al,chmov cx,lenmov ah,9int 10hendmclrscr macro ;*清屏*mov ah,6mov bh,7mov cx,0mov dh,24mov dl,69int 10h endmclosecur macro ;*不显示光标*mov ah,1mov ch,20hint 10hendmgoto

18、xy macro x,y ;*设置光标位子*mov dh,ymov dl,xmov bh,0mov ah,2int 10hendmclrkey macro ;*清除键盘缓冲区,并调用一种键盘属性*mov ah,0chint 21hendmpushall macro ;*进栈保护现场*push axpush bxpush cxpush dxendmpopall macro ;*出栈恢复现场*pop dxpop cxpop bxpop axendmblock macro attr ;*在光标位置显示2次0dbh,属性为attrpush cxmov ah,9mov al,0dbhmov bl,att

19、rmov cx,2int 10hpop cxendmcprintf macro ch ;*在光标位置显示ch*mov ah,9mov al,chmov cx,1int 10hendmrandom macro ;*定义随机函数,随机产生砖块 mov ah,0 int 1ahmov al,dlmov cl,7div clmov al,ahcbwendmprintscore macro x,y,scro ;*显示分数*push bxgotoxy x,ypop bxmov bx,scromov cx,10000dcall dec_divpush bxgotoxy x+1,ypop bxmov cx,1

20、000call dec_divpush bxgotoxy x+2,ypop bxmov cx,100call dec_divpush bxgotoxy x+3,ypop bxmov cx,10call dec_divpush bxgotoxy x+4,ypop bxmov cx,1call dec_divendm;*初始化定义*LEFT EQU 4B00HRIGHT EQU 4D00HUP EQU 4800HDOWN EQU 5000HHOME EQU 4700HENDA EQU 4F00HEMPTY EQU 0BRICK EQU 1WALL EQU 2MOVE_DOWN EQU 0 ;砖块下

21、移MOVE_LEFT EQU 1 ;砖块左移MOVE_RIGHT EQU 2 ;砖右移块REVOLVE EQU 3 ;砖块旋转YES EQU 1NO EQU 0;GET EQU 0;PUT EQU 1;CAL EQU 2BACKGROUND EQU 5 ;背景颜色BAR_ATTR EQU 6AH ;边框颜色BOARD_WIDTH EQU 12 ;10 ;游戏方框宽度BOARD_HEIGHT EQU 18 ;游方框戏高度BOARD_LEFT EQU 16 ;游戏方框左边位子BOARD_TOP EQU 3 ;游戏方框上边位子BOARD_ATTR EQU 7eH ;游戏方框边框颜色BOARD_BAC

22、K EQU 7SCORE_LEFT EQU 49 ;计分方框左边位子SCORE_TOP EQU 11 ;计分方框上边位子SCORE_WIDTH EQU 14 ;计分方框宽度SCORE_HEIGHT EQU 10 ;计分方框高度SCORE_ATTR EQU 46 ;计分方框边框颜色SCORE1 EQU 1SCORE2 EQU 100NEXT_LEFT EQU 49 ;NEXT方框左边位子NEXT_TOP EQU 2 ;NEXT方框上边位子NEXT_WIDTH EQU 14 ;NEXT方框宽度NEXT_HEIGHT EQU 6 ;NEXT方框高度NEXT_ATTR EQU 7EH ;NEXT方框边

23、框颜色data segment;*定义砖块*brick_set db 1,1,1,1,0,0 ;*正七* db 1,1,1,0,1,0 ;*丁子形* db 1,1,1,0,0,1 ;*反七* db 1,1,0,0,1,1 ;*正二* db 0,1,1,1,1,0 ;*反二* db 1,1,0,1,1,0 ;*方块*array db (BOARD_HEIGHT+2)*(BOARD_WIDTH+2) dup(0) row_down_offset db BOARD_HEIGHT dup(?)xp db ?yp db ?brick_no dw ? ;砖块号down_speed dw ? ;下落速度ti

24、cket dw ?time_set dw ?down_offset db ? ;能消去的行数gover db ? ;游戏结束标志over dw ?next_brick_no dw ? ;下一个砖块号next_set dw 2reach_bottom dw NOkey dw ? ;输入的控制键current_score dw 0high_score dw 0level dw 200i db 0j db 0t dw 0x1 db 0x2 db 0x3 db 0x4 db 0y db 0mable dw ? ;砖块是否能移动标志mess1 db 0b3h, Russian Brick Game ,0

25、b3hmess2 db HELP ,0b3h, Q: Exit Game HOME: New Game END: Pause UP: Rotatemess3 db 0b3h,0b1h,0b1hmess4 db 0b1h,0b0hmess5 db 0b2h,0b1h,0b0hmess6 db 0b0h,0b1h,0b0hmess7 db High Score:mess8 db Speed:mess9 db Score:mess10 db Next Brick:mess11 db Try again?(Y/N)mess12 db 0;*声音*mus_freq dw 330,294,262,294,

26、3 dup(330) dw 3 dUP(294),330,392,392 dw 330,294,262,294,4 dup(330) dw 294,294,330,294,262,-1mus_time dw 6 dup(25),50 dw 2 dup (25,25,50) dw 12 dup(25),100data ends;*堆栈段定义*stack segmentdw 100 dup(?) ;*初始化* tos label word stack ends;*代码段*code segmentmain proc farassume cs:code,ds:data,es:data,ss:stack

27、start:mov ax,datamov ds,axmov es,axmov ax,stackmov ss,axmov sp,offset tosclrscr ;清屏closecur ;不显示光标mov al,1ch ;取中断向量mov ah,35hint 21hpush espush bxpush ds ;设置中断向量mov dx,offset new_intmov ax,seg new_intmov ds,axmov al,1chmov ah,25hint 21hpop ds while1:call game_screen ;调用游戏屏幕call new_game ;游戏初始化call s

28、core ;分数初始化 do:call generate ;产生砖块mov over,1mov reach_bottom,NOwhile2:cmp over,1 jne rb0cmp reach_bottom,YES ;判断是否到底je rb0 ;若到底,则跳至rb0jmp rb1 ;若没到底,则跳至rb1rb0: jmp rbrb1:mov ah,1 ;*从键盘读字符*int 16hjz key0mov ah,0int 16hmov key,ax ;将从键盘输入的字符赋给keyjmp clkkey0:mov key,0 ;将key置0clk:clrkey ;*清除键盘缓冲区,并调用一种键盘属

29、性*switch: mov ax,key cmp al,Q ;按Q或者q键退出 je exit50 cmp al,q je exit50 cmp ax,HOMEje hom ;重新游戏cmp key,ENDAje en ;暂停游戏cmp ax,LEFT ;判断是否按下向左功能键je movleft ;砖块左移cmp ax,RIGHT ;判断是否按下向右功能键je movr ;砖块右移cmp ax,DOWN ;判断是否按下向下功能键je movd ;砖块下移cmp ax,UP ;判断是否按下旋转功能键je revo ;砖块旋转mov ax,MOVE_DOWNpush axcall moveabl

30、e ;*判断能否移动,产生移动标志mable*mov ax,1sub ax,mablemov reach_bottom,axjmp tmexit50: jmp exit5revo: jmp movrevolvemovr: jmp movrightmovd: jmp movdownHOM: ;按下Home键mov cx,mess12-mess11 mov bl,74hprintstring BOARD_LEFT+6,BOARD_TOP+3,mess11 ;显示Try again?(Y/N)字符串mov ah,0int 16hcmp al,nje exit50call new_gamemov re

31、ach_bottom,YESmov current_score,0jmp while2EN: ;按下End键mov ah,0int 16hmov time_set,8while20:jmp while2;*砖块移动控制*movleft:mov ax,move_leftpush axcall moveable ;*判断能否移动,产生移动标志mable*cmp mable,YES jne while20mov ax,move_leftpush axcall movejmp while2movright: mov ax,move_rightpush axcall moveable ;*判断能否移动,

32、产生移动标志mable*cmp mable,YESjne while20mov ax,move_rightpush axcall movejmp while2movdown: mov ax,move_down push axcall moveable ;*判断能否移动,产生移动标志mable*cmp mable,YESjne rbmov ax,move_downpush axcall movejmp while2movrevolve: mov ax,revolvepush axcall moveable ;*判断能否移动,产生移动标志mable*cmp mable,YESjne while20

33、mov ax,revolvepush axcall movejmp while2tm: ;判断砖块是否到底cmp reach_bottom,1je rbf1:mov ah,1int 16hjnz f2mov ax,10sub ax,down_speedcmp time_set,axja f2cmp time_set,axjb f1mov ax,MOVE_DOWNpush axcall movemov time_set,0jmp while2f2: mov ax,10sub ax,down_speedcmp time_set,axjb whmov over,0 wh:jmp while2rb:

34、call brick_reach_bottom ;*砖块到底之后执行的操作* call score ;调用计分框子程序call game_over ;调用game_over子程序cmp gover,1 ;判断游戏是否结束je renew ;若结束,跳至renewjmp do ;若没结束,跳至dorenew: call musicjmp homexit5:pop dxpop dsmov al,1chmov ah,25hint 21hclrscr;opencurmov ah,4chint 21h retmain endp;*显示下一块*show_next proc nearpush bpmov b

35、p,sppush axpush bxpush cxpush dxcmp word ptr bp+6,6 ;*判断是否为第六块砖*jae stick ;是则跳到stick,画出长条,否则直接调用砖块*mov ch,0cl0:mov cl,0judge:mov al,3mul chadd al,clcbwmov bx,bp+6xchg ax,bxmov dl,6mul dladd bx,axcmp brick_setbx,0je cl1mov al,clshl al,1add al,NEXT_LEFT+5mov ah,chadd ah,NEXT_TOPadd ah,4gotoxy al,ahmov

36、 bx,bp+4block blcl1:inc clcmp cl,3jb judgeinc chcmp ch,2jb cl0jmp exitstick:mov cl,0cir:mov al,clshl al,1add al,NEXT_LEFT+4gotoxy al,NEXT_TOP+4mov bx,bp+4block blinc clcmp cl,4jb cirexit:pop dxpop cxpop bxpop axpop bpret 4show_next endp;*显示背景*disp_ground proc nearpush axpush bxpush cxpush dxgotoxy 0

37、,0mov ah,09hmov bh,0mov bl,BAR_ATTRmov al, mov cx,80int 10hmov ah,13hmov dh,0mov dl,24mov cx,mess2-mess1mov bh,0mov al,0mov bl,BAR_ATTRlea bp,mess1int 10hmov dl,0dhmov ah,2int 21hmov dl,0ahint 21hmov i,1j0:mov j,0three:mov dh,imov al,3mul jmov dl,almov cx,mess4-mess3mov bh,0mov al,1mov bl,BACKGROUNDlea bp,mess3mov ah,13hint 10hinc jcmp j,27jb threeinc icmp i,24jb j0gotoxy 0,24mov ah,9mov bh,0mov bl,BAR_ATTRmov al, mov cx,80int 10hmov ah,13hmov dh,24mov dl,1mov cx,mess3-mess2mov bh,0mov al,0mov bl,BAR_ATTRlea bp,mess2int 10hpop dxpop cxpop bxpop axret

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号