河北联合大学汇编课设报告正文(共22页).doc
《河北联合大学汇编课设报告正文(共22页).doc》由会员分享,可在线阅读,更多相关《河北联合大学汇编课设报告正文(共22页).doc(22页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上一、软件背景介绍1.1背景知识俄罗斯方块原本是科学家所开发的教育用,之后开始提供授权给各个游戏公司,造成各平台上软件大量发行的现象。版的俄罗斯方块在日本卖出424万套,是Game Boy史上卖最好的游戏。时,也是前线美军最常拿消磨时间的游戏之一。由于俄罗斯方块具有的数学性、动态性与知名度,也经常拿来作为游戏的练习题材。俄罗斯方块曾经造成的轰动与带来的经济价值,可以说是世界游戏史上的一个奇迹。它看似简单却又变化无穷,令人上瘾。相信大多数用户都还记得为它痴迷得“茶不思饭不想”的那个俄罗斯方块时代。俄罗斯方块上手极其简单,但是要熟练地掌握其中的操作与摆放技巧,难度却不低。作
2、为老少皆宜的大众游戏,其普及程度可以说是史上任何一款游戏都无法相比的。俄罗斯方块(Tetris, 俄文:)是一款风靡全球的电视和掌上游戏机,它由俄罗斯人发明,故得此名。俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。由于上手简单、老少皆宜,从而家喻户晓,风靡世界。 俄罗斯方块原名是(英语是Tetris),这个名字来源于希腊语tetra,意思是“四”,而游戏的作者最喜欢(tennis)。于是,他把两个词tetra和tennis合而为一,命名为Tetris,这也就是俄罗斯方块名字的由来。 1.2基本功能部分游戏有单格方块,可以穿透固定的方块到达
3、最下层空位。其他的改版中出现更多特别的造型。方块会从区域上方开始缓慢继续落下。玩家可以做的操作有:以90度为单位旋转方块,以格子为单位左右移动方块,让方块加速落下。方块移到区域最下方或是着地到其他方块上无法移动时,就会固定在该处,而新的方块出现在区域上方开始落下。当区域中某一列横向格子全部由方块填满,则该列会消失并成为玩家的得分。同时删除的列数越多,得分指数上升。当固定的方块堆到区域最上方而无法消除层数时,则游戏结束。1.3运行截图图1 运行截图图2 运行截图图3 运行截图二、核心算法思想游戏区域由许多等面积的小方块构成,这些区域状态只有满或空两种。将空间以静态二维数组实现,并预先定义其状态值
4、。满为1,空为0,以此来完成游戏地图区域的空间分配。小方块的实现是由一个4*2的小数组表示,用四个存储单位空间存储当前下坠物的每一个子块的位置来对整个下坠物件的位置进行标识,每个存储空间的大小就是一个点的坐标。每个方块都有其对应的编号,编号按由上到下,由左到右的顺序编排。有了这些编号,方块的变换实现起来就方便多了。再由一个宏去标识下坠物的位置。 游戏进程需要定时器的驱动,所以很有必要在程序当中加入一个定时器机制。如此对游戏的开始,暂停,结束控制便能够得到实现。游戏开始后便开始掉落方块,并且会在游戏区域上方出现下一个下坠物的形态,因此有随机物件产生这个操作。此时用户可根据需要来变换方块,向左或向
5、右移动来调整方块位置,然后通过按下使方块加速下落。这就涉及到了四个主要操作。当方块向左或向右移动时,需要判定方块是否达到了游戏区域的边界;当方块下落时需要判定方块是否到了游戏区域的底部,或是碰到了别的方块。这样游戏内部便引入众多相关函数。对这些函数进行实现和细化之前,需要对整个游戏运行期间的概要流程有所了解。本游戏界面简洁明了,没有什么花哨的东西。菜单栏功能并不复杂,仅有游戏控制和选项设置两项。进入游戏后的窗口背景是黑色调,游戏区域是灰色调,这些都可以通过选项进行调整。游戏区域有20列,10行,这样设计是为了让方框有足够的高度,可以让玩家有充足的反应时间来处理掉落的方块。游戏开始后默认的方块是
6、具有立体感的红色方块,其颜色和质感都是经过精心设计的。而在上方会显示将要落下的方块,让玩家做好迎接挑战的心理准备,下方则显示分数。游戏的操作主要由鼠标和键盘来完成。鼠标点击开始后便可用键盘上的“上下左右”来对方块进行操作。方块的实现七种下坠物都有一个共同点,就是它们占据的空间一样,都是由四个等面积的小方块构成,因此用一个整型的数组来存储每个下坠物的四个小方块的坐标位置。每个下坠物中的方块都有编号,编号按从左到右,从上到下的顺序排列。从代码中可以看出程序首先获取了当前下坠物的四个小方块坐标,然后所有纵坐标递减一格,由函数计算出改变数据的区域。这样便可完成左移命令。右移和下移的道理也是一样。但是这
7、里涉及到一个问题,就是要对移动是否到达游戏区域的边界做出判断。左、右移的限制原理是一样的,只是方向和坐标数据有点区别。根据各种不同形态的下坠物最左边的小方块的正左(右)方区域是否为非被占用状态来判断它是否可以移动。而下移的限制涉及到消行判断,这些将在后面做具体分析。方块的旋转操作需要考虑到两个问题,一个是如何实现旋转,另一个是判断能否旋转。为了实现旋转,首先获取当前下坠物的四个小方块的坐标位置。由于每种方块变形后的状态都不同,因此需要对下坠物的不同形态进行编号。三、 核心算法流程图进入程序后先进行屏幕初始化,之后显示调用显示边框函数,再显示新方块。检测按键状态,之后再度检测键盘状态。 图4 流
8、程控制算法流程图为了保证整个程序结构性能良好,不会出现与其他函数体同时用一个寄存器而使得程序跑飞。在进入程序后先将几个主要寄存器推入堆栈,当程序退出时,又将寄存器值从堆栈中送回。堆栈采用的是先进后出的算法,所以应当注意顺序。这样接口,便于向后兼容,使用起来方便。 图5 流程控制算法流程图四、源代码下面给出的是用俄罗斯游戏实现程序的源代码:;游戏状态 GS_RUNNING equ 0 GS_PAUSED equ 1 GS_OVER equ 2 ;最高可达到的关数 LEVEL_LIMITT equ 15 ;游戏区域起始位置及大小 GM_LEFT equ 25 GM_TOP equ 4 GM_WID
9、TH equ 12 GM_HEIGHT equ 20 GM_MASK equ (1 SHL GM_WIDTH-1) ;功能键扫描码 KEY_ESC equ 1h ;ESC KEY_LEFT equ 4bh ;LEFT KEY_RIGHT equ 4dh ;RIGHT KEY_ROLATE equ 48h ;UP KEY_DOWN equ 50h ;DOWN KEY_QUICKLY equ 3dh ;F3 KEY_SLOW_DOWN equ 3ch ;F2 KEY_TURN equ 4fh ;End KEY_PAUSE equ 53h ;Delete KEY_CHANG_MODE equ 3bh
10、 ;F1 CHAR_CLEAR equ ;擦除字符,ascii CHAR_BRICK equ 2 ;方块外形,ascii ;0黑 1深蓝 2绿 3蓝 4红 5紫 6黄 7灰白,最高位置1则高亮显示 COLOR_CLEAR equ 0h COLOR_DIED_BRICK equ 08h COLOR_TITTLE equ 7; COLOR_NUMBER equ 3 or 8 ;屏幕上各说明文字或装饰物的坐标,皆为相对游戏场地左上角 X_NEXT_BRICK equ -5 Y_NEXT_BRICK equ 3 Y_LBOUND_CHAR equ 17 Y_RBOUND_CHAR equ 16 Y_B
11、OUND_COLOR equ 2 or 8;blue X_UBOUND_CHAR equ 15 X_DBOUND_CHAR equ 15 X_BOUND_COLOR equ 2 or 8;green X_START equ (GM_WIDTH-1)/2 Y_START equ -1 X_SCORE_STR equ -10 X_LEVEL_STR equ X_SCORE_STR X_adjustLevelDelt_STR equ X_SCORE_STR-4 X_MODE_STR equ X_SCORE_STR-4 Y_SCORE_STR equ 5 Y_LEVEL_STR equ Y_SCORE
12、_STR+2 Y_adjustLevelDelt_STR equ Y_LEVEL_STR+2 Y_MODE_STR equ Y_adjustLevelDelt_STR+2 X_SCORE_POS equ -3 X_LEVEL_POS equ X_SCORE_POS X_adjustLevelDelt_POS equ X_SCORE_POS X_MODE_POS equ X_SCORE_POS Y_SCORE_POS equ Y_SCORE_STR+1 Y_LEVEL_POS equ Y_LEVEL_STR+1 Y_adjustLevelDelt_POS equ Y_adjustLevelDel
13、t_STR+1 Y_MODE_POS equ Y_MODE_STR+1 X_GAME_OVER equ -10 X_JUDGE_STR equ X_GAME_OVER+5 X_GAME_NAME equ GM_WIDTH/2-4 Y_GAME_NAME equ -1 Y_GAME_OVER equ -3 Y_JUDGE_STR equ Y_GAME_OVER+1 ;判断游戏区域(dl,dh)位置是否为空 ;in : dl-x, dh-y ;out : flag register isPosNotEmpty proc push dx push bx push ax push cx push di
14、 push si mov si,curMB mov si,(ManyBrick ptr si).mb_bCnt ;ax-mask,第dl位置1 mov ax,1 mov cl,dl shl ax,cl lea di,game.ga_map ;map+2*dh xor bh,bh mov bl,dh shl bl,1 only_one_brick: and ax,bx+di je is_pos_empty_out cmp si,1 jne is_pos_empty_out cmp bx,(2*GM_HEIGHT-2) je is_pos_empty_out_pre add bx,2 jmp on
15、ly_one_brick ;ensure the result is correct is_pos_empty_out_pre: cmp bx,0 is_pos_empty_out: pop si pop di pop cx pop ax pop bx pop dx ret isPosNotEmpty endp ;判断游戏是否结束 isGameOver proc push bx mov bx,curMB cmp (ManyBrick ptr bx).mb_sPos.pos_bY,Y_START jne still_alive ;游戏的确结束了 mov game.ga_state,GS_OVER
16、 call doGameOver still_alive: pop bx ret isGameOver endp ;游戏结束后,调用此过程,显示一些提示信息,待等用户下一步指示,重玩或退出 doGameOver proc call clrScreen call moreBeautiful mov si,offset gameOverStr mov cx,45 mov dl,X_GAME_OVER ;x mov dh,Y_GAME_OVER ;y call showStr mov ax,game.ga_score mov cx,43 call AXModCX and ax,3 mov di,ax
17、 shl di,1 mov cx,judgeCntdi mov si,judgeTabledi mov dl,X_JUDGE_STR mov dh,Y_JUDGE_STR call showStr mov al,CHAR_BRICK wait_for_restart: call randomDraw call delay jmp wait_for_restart ret doGameOver endp ;in : ax-ax0, cx-cx0 ;out: ax=ax0/cx0, cx=ax0%cx0 AXModCX proc push dx xor dx,dx div cx mov cx,dx
18、 pop dx ret AXModCX endp randomDraw proc push dx push bx push ax call getRand mov cx,GM_WIDTH call AXModCX mov dl,cl call getRand mov cx,GM_HEIGHT call AXModCX mov dh,cl call getRand and al,7 or al,8 mov bl,al pop ax call drawBrick pop bx pop dx ret randomDraw endp ;游戏暂停时调用此过程,显示提示信息,按任意键继续 doGamePa
19、used proc push si push cx push dx push ax mov si,offset gamePausedStr mov cx,46 ;46 chars mov dl,0 ;x mov dh,GM_HEIGHT/2;y call showStr call waitForKeyPress mov game.ga_state,GS_RUNNING mov dl,0 mov dh,GM_HEIGHT/2 mov al,CHAR_CLEAR mov cx,46 ;46 chars erase_paused_words: mov bl,COLOR_CLEAR call draw
20、Brick inc dl loop erase_paused_words call moreBeautiful call drawMap call ManyBrick_drawSelf pop ax pop dx pop cx pop si ret doGamePaused endp ;clear the screen clrScreen proc push ax mov ah,00h mov al,03h int 10h pop ax ret clrScreen endp ;游戏完成时跳转到此,表示对极富耐心者的景仰_,并退出游戏 doGameFinished: call clrScreen
21、 call moreBeautiful mov si,offset gameFinishedStr mov cx,58 ;58 chars mov dl,-GM_LEFT+5 mov dh,-2 call showStr dGF_keybuf_empty: call getRand call randomDraw mov ah,1 int 16h jz dGF_keybuf_empty jmp main_quit ;等待直到有键被按下 waitForKeyPress proc push ax key_buf_empty: mov ah,1 int 16h jz key_buf_empty ;i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 河北 联合 大学 汇编 报告 正文 22
限制150内