计算机方块游戏软件设计Word格式文档下载.docx
《计算机方块游戏软件设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《计算机方块游戏软件设计Word格式文档下载.docx(49页珍藏版)》请在冰点文库上搜索。
1任务分析
根据题目要求
使用汇编语言设计一个运行于计算机的方块游戏软件,软件应实现将从屏幕上方下落的方块用键盘控制移动,按下某键停止。
可以附加将方块换为别的形状和堆砌效果,扩展为著名益智游戏俄罗斯方块。
由此得出以下需要解决的问题:
1)随机显示不同形状的方块
2)键盘控制其左右移动,旋转变换,向下快速移动
3)方块可以持续下落,到底后停止,并且能够进行叠加。
4)当有某一行填满时,进行消行处理。
2主界面及数据结构设计
屏幕设置为320x200四色图形显示模式;
屏幕左上角为原点X轴方向为320个点Y轴方向为200个点;
边框宽度为3个点阵宽度,颜色为青;
基本方块显示区域大小为200x160点阵;
每个方块占用10x10个点阵,方块颜色为洋红,四个方块组成一个大方块。
绘制边框如下图所示:
图2.1
二维表的建立:
当前方块的坐标信息在数据段中有定义,QUA_NOW即实时信息,如何能够让下落的方块在检测到下方有原先掉下来的方块或者已经到达游戏界面的底部从而停下来呢。
建立一个静态数据二维表与游戏界面映射。
映射表如下:
图2.2
;
定义静态数据
STATIC_DOTDB3DUP
(1)
DB20DUP(0)
DB6DUP
(1)
DB55DUP
(1)
栅格部分初始化为1,之后不对该静态数据位置操作。
栅格部分是不会显示在屏幕上,只是在静态数据表中存在,以此方便对方块的出界,叠加等的判断。
3各个关键算法的实现
3.1出界、叠加判断算法的实现
先将QUA_NOW传送给与其同类型,等长的一维数据表QUA_TEMP。
当再将QUA_TEMP进行一次操作,比如向下操作:
将QUA_TEMP中的Y轴坐标加1,X轴坐标不变,再调用NOT_DONE函数分别找到QUA_TEMP中四个方块位置在静态数据表中的映射,判断该位置数据是否为1,如若有一个1则,将NOT_DONE_CAN标志位置为1,即不可动作,否则将其置为0。
DOWN_GOON函数则通过判断NOT_DONE_CAN标志位来选择是否将QUA_TEMP的值传送给QUA_NOW,如若NOT_DONE_CAN为0,即可以动作,则传送数据,同时刷新显示。
否则不可动作,则将QUA_NOW当前位置在静态数据表中的映射数据置为1,即跟新静态数据二维表。
其他判断依此类推。
3.2旋转算法的实现
将各个方块的不同角度定义在一个方块基础二维数据表中。
定义了两个变量QUA_NUM和QUA_ANGLE即方块类型和方块角度,通过这两个变量进行转换,与STATIC_DOT偏移地址相加得到一个偏移地址,通过该偏移地址查表得该数据项,把这8个数据与位置偏移量相加得到一个新值赋给QUA_NOW,再刷新显示。
便可实现角度的变换。
3.3消行算法的实现
当有出现方块不可动作,即NOT_DONE_CAN为1时,先将QUA_NOW当前位置在静态数据表中的映射数值置为1,之后判断静态数据表中是否有一整行为1,是则将该行以上数据整体下移一行,之后刷新显示,即通过判断静态数据表中的各个位置是否为1,为1则刷新为洋红色否则刷为黑色;
如若该行有0存在,则进行下一行的判断。
4基本函数介绍
4.1主程序设计
进入程序后先进行屏幕初始化,之后显示调用显示边框函数,再显示新方块。
检测按键状态,有按下则读取该按键ASCII码,通过判断该ASCII码,执行相应动作。
之后再度检测键盘状态。
图4.1
4.2矩形显示函数:
DISP_RECT
不同方块的显示方法,采用拼接法,由四个10x10的红色点阵组成。
通过四个方块相对位置的组合,形成不同样式的俄罗斯方块。
所以建立了不同俄罗斯方块相对位置表,采用查表法,找出想要显示的方块的数据信息。
函数DISP_RECT既是实现此功能的
入口参数:
RECT_A_XDW?
RECT_A_YDW?
RECT_B_XDW?
RECT_B_YDW?
RECT_COLORDB?
通过矩形方块的左上角的A点与右下角的B点确定一个矩形方块的大小和坐标位置,由这两个点确定该矩形,通过调用INT10H显示中断写像素点命令,对该区域内的全部点赋予颜色。
程序如下:
DISP_RECTPROCNEAR
PUSHAX
PUSHCX
PUSHDX
MOVAH,0CH;
指明写点调用
MOVAL,RECT_COLOR;
存入颜色与AL中
MOVDX,RECT_A_Y;
行起始坐标
MOVCX,RECT_A_X;
列起始坐标/循环次数
DISP_X:
MOVDX,RECT_A_Y
DISP_Y:
INT10H
INCDX
CMPDX,RECT_B_Y
JNZDISP_Y
INCCX
CMPCX,RECT_B_X
JNZDISP_X
POPDX
POPCX
POPAX
RET
DISP_RECTENDP
为了保证整个程序结构性能良好,不会出现与其他函数体同时用一个寄存器而使得程序跑飞。
在进入程序后先将几个主要寄存器推入堆栈,当程序退出时,又将寄存器值从堆栈中送回。
堆栈采用的是先进后出的算法,所以应当注意顺序。
调用该函数时,先得对RECT_COLOR等几个入口参数进行赋值。
这样接口,便于向后兼容,使用起来方便。
流程图如下:
图4.2
4.3向右处理函数:
RIGHT
先将通用寄存器AX,BX,CX,DX压入堆栈。
再将QUA_NOW中的数据传送到QUA_TEMP中,再对QUA_TEMP中X轴坐标值全部加1,之后调用NOT_DONE函数对能否动作进行判断,之后读取NOT_DONE_CAN标志位,根据此值选择是否将QUA_TEMP值赋给QUA_NOW。
其他处理程序如向左,下落,以及旋转判断程序也是这种模式。
右边按键按下后的处理程序
RIGHTPROCNEAR
PUSHBX
PUSHAX
CALLMOV_NOW_TEMP
MOVBX,OFFSETQUA_TEMP
MOVCX,4
L_RIGHT1:
MOVAL,[BX]
INCAL
MOV[BX],AL
ADDBX,2
LOOPL_RIGHT1
CALLNOT_DONE
MOVAL,NOT_DONE_CAN
CMPAL,1
JZL_RIGHT_OUT
MOVRECT_COLOR,COLOR_BLACK;
黑色/即清除该方块
CALLDISP_QUA
CALLMOV_TEMP_NOW
MOVRECT_COLOR,COLOR_RED;
再次显示该方块
CALLDISP_QUA
L_RIGHT_OUT:
POPBX
RIGHTENDP
图4.3
5演示效果
图5.1
6总结与体会
本次微机原理与接口技术课程设计历时两个礼拜,由于考试原因,与自动控制课程设计同时进行,所以时间上比较紧,拿到这个题目时,感觉有点难度,因为从未用汇编语言在PC机上编过程序,心里没有任何把握,经过上网查资料后感觉可行性还是蛮高的,就想着挑战以下自己的能力,提出更高难度的要求,编写一个俄罗斯方块游戏,上网上找资料后发现,这个已经有很多同学做过,而且做得蛮漂亮,但是汇编的程序可读性非常差,而俄罗斯方块游戏的代码又非常长,所以可借鉴性很少,很难分析出对方的算法是什么,由此,必须自己设计一个比较合适的算法才行,根据该想法,我一步一地进行设计,慢慢的从头开始写,从最底层的方块显示函数,到高一点的旋转算法的实现,都是一点一滴积累起来的。
初步设计一个数据结构之后能够实现一定的功能,当想增加更多功能时,发现原先的数据结构与接口以及算法等不适宜了,于是从底层修改结构,以求能够满足接下来要实现的功能,如此反复,经过一个礼拜的编写后,思路渐渐清晰,基本结构也确定,最后一天完善了程序。
为了能够很好的往后兼容,在设计程序架构的时候,我进行了仔细的研究,充分考虑其接口的开放性与方便性,对接口的设计做到了非常合适,并且留下很大的发展空间。
虽然由于时间的缘故,未能实现俄罗斯方块额全部功能,如统计分数、设置难度等级,但是可增加性的优点,便于今后有时间对其改善。
本次微机原理课程设计的过程中让我充分感受到了汇编语言的魅力与缺陷,同时感受到了8086兼容机的限制,尤其是寄存的限制,让程序非常难写。
总得来说,在这次微机原理课程设计过程中,我学到了很多东西。
7参考文献
[1]周佩玲,彭虎.微机原理与接口技术.北京:
电子工业出版社,2007[2]宋杰.微机原理与接口技术课程设计.北京:
机械工业出版社,2005[3]戴梅萼,史嘉权.微型计算机技术及应用(第3版).北京:
清华大学出版社,2008[4]于海生.微型计算机控制技术.北京:
清华大学出版社,2008[5]范会敏.微型计算机原理及接口技术应用.北京:
科学出版社,2005
附录:
部分程序清单:
本代码由丘八(陈兵的网名)写于微机原理与接口技术课程设计之际。
时间:
2011.01.12,地点:
武汉理工大学自动化学院本科生创新基地
实现的功能非常简单,未能实现俄罗斯方块游戏的全部功能,并且其中具有一些bug还未解决。
只是粗略得设计了一下界面,比较不美观,还待改善
锥栈段定义
STACK1SEGMENTSTACK
DB400DUP(?
)
STACK1ENDS
颜色变量
COLOR_GREENEQU01
COLOR_BLUEEQU03
COLOR_REDEQU02
COLOR_BLACKEQU00
数据段定义
DATASEGMENT
WORD_LAST_DISPDB'
ThisisaeasyTetriswritenbyqiuba'
DB'
inWuhanUniversityofTechnologyon2011.01.12Pressanykeytogobacktowindows$'
NOT_DONE_CANDB0;
能否动作标志位
数据刷新零时数
TEMP_DEL_ROWDB0
RAND_TEMPDB0
RAND_NUMDB0
基础矩形方块显示坐标数据/A点到B点的矩形
前景颜色/即将要显示的方块的颜色/边框颜色/每次调用颜色前应先给它赋值
RECT_COLORDB01
中文字符输出数据
CH_XDW0
CH_YDW0
CH_COLORDB3
CH_ADDRDW0
CH_Y_TEMPDW0
CH_X_TEMPDW0
时间定时器
TIME_COUNT1DW1000
TIME_COUNT2DW5000
TIME_SETDW1300
当前方块位置变量/该处为动态数据
QUA_NOWDB0;
1_X
DB0;
1_Y
2_X
DB1;
2_Y
3_X
3_Y
4_X
DB2;
4_Y
QUA_TEMPDB8DUP(0)
STATIC_DOTDB400DUP
(1)
STA_DOT_XDB0;
静态数据坐标
STA_DOT_YDB0
STA_DOT_CANDB0;
静态数据标志位
定义各个形状的方块结构
QUA_ALLDB0,0,0,1,1,1,1,2;
方块基础数据表
DB1,0,2,0,0,1,1,1
DB0,0,0,1,1,1,1,2
DB1,0,1,1,0,1,0,2
DB1,0,0,0,1,1,2,1
DB1,1,1,0,0,1,2,1
DB0,1,0,0,1,1,0,2
DB1,0,0,0,1,1,2,0
DB1,1,1,0,0,1,1,2
DB1,1,0,0,0,1,2,1
DB0,1,0,0,1,0,0,2
DB1,0,0,0,2,0,2,1
DB1,1,1,0,1,2,0,2
DB1,1,0,1,2,0,2,1
DB0,1,0,0,0,2,1,2
DB1,0,0,0,2,0,0,1
DB1,1,0,0,1,0,1,2
DB0,0,0,1,1,0,1,1
DB1,0,0,0,2,0,3,0
DB0,1,0,0,0,2,0,3
QUA_NUMDB0;
方块类型变量/共有七种选择
QUA_ANGLEDB0;
方块角度变量/有四种选择
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
DATA,SS:
STACK1
START:
;
主程序开始
MOVAX,DATA
MOVDS,AX
MOVES,AX
MOVAH,0
MOVAL,04
INT10H;
设置320×
200彩色图形方式
MOVAH,0BH
MOVBH,01H
MOVBL,00H
设置彩色组
MOVBH,00H
MOVBL,0BH
设置背景颜色
MOVAH,03H
MOVAL,05H
MOVBH,03H
MOVBL,0CH
INT16H
MOVRECT_COLOR,COLOR_GREEN;
前景颜色/即将要显示的方块的颜色/边框颜色/
CALLDISP_BORDER;
边框的显示
CALLNEW_QUA
GOON:
STI;
主循环开始
CALLDOWN_GOON
MOVAH,1
JZGOON
CMPAL,'
Q'
JZGET_OUT
A'
JZKEY_A
D'
JZKEY_D
W'
JZKEY_W
S'
JZKEY_S
JMPGOON;
主循环结束
KEY_A:
CALLLEFT
JMPGOON
KEY_D:
CALLRIGHT
KEY_W:
CALLROTATE
KEY_S:
CALLFAST_DOWN
GET_OUT:
退出点
MOVAH,00H
MOVAL,03H
设置显示模式
MOVDX,OFFSETWORD_LAST_DISP
MOVAH,09H
INT21H;
输出字符串
MOVAH,08H
等待按键
MOVAX,4C00H
返回DOS
向下键按下后处理程序
FAST_DOWNPROCNEAR
MOVAX,100
MOVTIME_SET,AX
FAST_DOWNENDP
左边按键按下后的处理程序
LEFTPROCNEAR
L_LEFT1:
DECAL
LOOPL_LEFT1
JZL_LEFT_OUT
CALLMOV_TEMP_NOW
MOVRECT_COLOR,COLOR_RED;
再次显示该方块/颜色不变/此处为红色
L_LEFT_OUT:
LEFTENDP
LOOPL_RIGHT1
JZL_RIGHT_OUT
旋转处理程序
ROTATEPROCNEAR
MOVAL,QUA_ANGLE
CMPAL,3
JNAL_ROTATE1
XORAL,AL
L_ROTATE1:
MOVQUA_ANGLE,AL
MOVDI,OFFSETQUA_ALL;
对地址变量进行变换/在存入DI中
MOVDL,QUA_NUM
MOVAL,4
MULDL;
相乘结果放在AX中/并且AH应该是0
MOVDH,QUA_ANGLE
ADDDH,AL
MOVAL,8
MULDH
ADDDI,AX;
变换后存入DI中
MOVDL,[DI]
INCDI
MOVDH,[DI]
INCBX
MOVAH,[BX]
SUBAL,DL
SUBAH,DH
MOVCX,3
L_ROTATE2:
ADDDL,AL
MOV[BX],DL
ADDDH,AH
MOV[BX],DH
LOOPL_ROTATE2
JZL_ROTATE_OUT;
等于1即不可动作/则退出
再次显示该方块/颜色不变/此处为红色
L_ROTATE_OUT:
P