系统设计 俄罗斯方块是俄罗斯人阿列克谢·帕基特诺夫(Alexey Pazhitnov)发明。人们一开始并没预料到它将会有如此广泛的吸引力。实际上,在游戏发明后的数年间,俄罗斯方块成了无数场专利官司和法律纠纷的目标,而许多公司也不遗余力地上阵厮杀,想要将游戏的创意据为己有。一个最初的版本是Spectrum Holobyte为IBM兼容机开发的游戏。1988年,俄罗斯方块在街机上也变得非常流行,这归功于Atari,因为他们发布了一个能让两名玩家同时游戏的版本。 俄罗斯方块经常被称为拼图游戏。玩家需要找出如何能把各块积木最好的拼在一起的方法。俄罗斯方块相当于直角的智力拼图游戏,或者其它一种“在这有限空间内组织几何体”的拼图。俄罗斯方块为了创造真正引人入胜的游戏,它巧妙的平衡了拼图游戏与动作游戏的机制。因而每个人玩这个游戏都会有一次不同的体验。俄罗斯方块所用到的一种动作游戏机制是越来越逼近的威胁感,留给玩家的时间总是非常有限。俄罗斯方块中积木是从上面落下来。如果玩家不在积木落到屏幕底下或翻转它,不能给它找一个最有利的位置,这块积木就可能会堵住某处,而它下面的几行也就没有办法拼接完整,玩家也就离游戏结束又靠近了一行或几行。在游戏进程中,积木落下来的速度越来越快,这样对玩家的挑战也就越来越大,游戏的难度也逐步增加。 俄罗斯方块游戏的玩法非常简单易学,游戏界面是一个很高的长方形2D盒子,方块出现在盒子的上方,这些方块都由四个小方块组成,并按照各种方式排列,其中每一个方块都至少和另一个方块相连。然后,这些积木慢慢地落向盒子底部,玩家可以把这些方块左右移动或旋转。一旦这个方块碰到阻碍,比如盒底或者另一个方块,它就会停止,而玩家可以对之加以操作。当屏幕底端的方块拼满一横行时,这个层的方块就会消失,而这一行以上的所有方块都会下降一层。而当那些没有拼完的横行填满整个长方形盒子,新的方块无法再出现时,游戏就结束了。 (1)单屏游戏: 俄罗斯方块全部反映在一个屏幕上。玩家可以在同一时间看到整个游戏环境,在此基础上决定怎么处理手上的这块积木。这个游戏当中没有任何探险成分在内,它不会让玩家真正大吃一惊,玩家能够看到让游戏顺利进行下去的所有信息,所以玩家输了的话只能怪他自己。 (2)无限游戏: 只要积木还没有堆到盒顶,俄罗斯方块就允许玩家一直玩下去,不管他做出了多少错误的决定。每次游戏都以失败而告终,没有人真正能打败这个游戏。玩家们总是能找到提高玩俄罗斯方块技艺的方法,这就是俄罗斯方块和传统拼图游戏的根本不同。一旦玩家拼好了一幅拼图,只要他还记得他是怎么拼的,那么这个拼图就对他再也无挑战了。所以人们通常不会多次玩一个拼图,但一个设计精巧的游戏却总能让人玩上一遍又一遍。俄罗斯方块正是这样一个游戏。 (3)多条生命: 和大多数的街机游戏不同,最早的俄罗斯方块只给玩家一条生命。积木一堆到盒子顶部,玩家就输了。但是游戏的设计允许玩家出现错误,同时还不会立即败下阵来。当积木叠在长方盒子的底部时,玩家可以看到自己所犯的错误,在游戏结束前,他还是有时间想一想如何把后面的积木拼放得更合理些。这样,俄罗斯方块虽然没有给玩家多条生命,但却在玩家重新开始前,给玩家一个改善游戏技巧、获得一些小小成就的机会。 (4)最高分机制: 俄罗斯方块引入一个计分模式,它给玩家计分并把分数记录在高分排行榜上。实际上,因为玩家不可能击败这个游戏,所以,取得一个更高分数的可能性就成为玩家反复玩这个游戏真正的动力所在。 (5)简单易学,容易操作: 俄罗斯方块的真正杰出之处在于它的游戏机制简单平朴,浅显易懂。玩好这个游戏只需极少的键位,所有操作都在屏幕上一览无余。这意味着,不论是否熟悉计算机游戏,任何人都可以走过来并立即开始玩它。然而,玩家永远不可能完全掌握这个游戏,因为这个游戏的难度与是递增并且它在理论上可以玩无限长的时间。 本系统在Windows XP的操作系统下,以Java Micro EditionWireless Toolkit 2.1为开发工具,用中文版UltraEdit做为代码编辑器而实现的。在KToolBar开发包的DefaultColorPhone模拟器下进行调试。 系统开发的主要任务是俄罗斯方块游戏在无线移动端的实现。本系统的主要实现功能模块分为:难度选择模块、方块处理模块、游戏规则模块。 用户在title屏按键数字键选择0-9种游戏难度,进入相对应游戏关卡。 方块处理模块定义方块的7种状态,每种状态都是由四个小方块组合而成,如下: 游戏规则模块主要实现俄罗斯方块游戏基本规则。比如,积满一行后消减;能够快速直接的下落;记录游戏最高分;方块翻转;分数计算;随机生成方块,见下图: 系统实现 本系统由10个类组成并实现全部功能。项目名字为TetrisMidlet,其项目文件结构如下图: 在项目源文件中,src文件夹下为实现系统的源文件。建了两个包作为功能划分,分别为:ui包和model包。 5.2.1 难度选择模块结构 ui包里包含以下类: InfoBox.java 用于显示数字的信息框 TitleBox.java 显示title屏,包含当前高分提示选择一个难度 NextPieceBox.java 显示下一个激活方块 TetrisCanvas.java 处理程序的所有UI DisplayBox.java 在屏幕上显示Box 其结构图如下: 在DisplayBox.java中方法paint()实现了title屏的显示,其代码如下: public final void paint(Graphics g) { g.setColor(this.bgColor); g.fillRect(x,y, width, height); // box的背景 g.setColor(this.fgColor); g.drawRect(x,y, width, height); // 边框 this.paintBoxContents(g);} 下面是TerisCanvas.java中绘制方块paintBlock()方法的实现代码: private void paintBlock(int x, int y, int blockType,Graphics g) { intblockX = this.boardX + (this.blockSize * x); int blockY=this.boardY+(this.blockSize* (y -TetrisConstants.TOP_VISIBLE_ROW)); if(TetrisConstants.BLOCK_EMPTY!= blockType) { // 绘制下落时的阴影 g.setColor(TetrisConstants.COLOR_BLACK); g.fillRect(blockX+ 1, blockY + 1, this.blockSize - 1, this.blockSize - 1); // 绘制一个实际的方块覆盖在阴影上 this.setColor(blockType,g); g.fillRect(blockX,blockY, this.blockSize - 1, this.blockSize - 1); } else { //绘制颜色 g.setColor(TetrisConstants.COLOR_WHITE); g.fillRect(blockX,blockY, this.blockSize, this.blockSize);}} 其中,TOP_VISIBLE_ROW为TetrisConstants下定义,Y坐标的从行0开始索引的位置,初始值为2。 BLOCK_EMPTY为TetrisConstants下定义的空方块,初始值为-1。 COLOR_BLACK为TetrisConstants下定义的预设RGB颜色,初始值为0x00000000。 COLOR_WHITE为TetrisConstants下定义的预设RGB颜色,初始值为0x00ffffff。 模拟器程序运行,在应用程序列表里显示可以载入运行的模拟程序,如下图: 在title屏,也可以点击左软键退出程序。 游戏规则模块包含3个类: DropThread.java 处理方块下落问题 TetrisConstants.java常数定义 TetrisMidlet.java 游戏规则和对键盘输入的捕捉,以及中断的处理 其结构图如下: 其中run()方法实现循环下落,代码如下: public void run() { //运行方法 while(this.running) { // 当前下落的方块 if(this.skipNextTick){ this.skipNextTick= false; } else { this.game.tick(); } try { Thread.sleep(this.game.getTickSpeed());// 线程睡眠 }catch(InterruptedException ie) { }}} 游戏规则模块实现俄罗斯方块游戏的主要功能包括,消减积满的行、快速下落、方块翻转、分数计算、下落碰撞检测、随机生成方块。 下面是消减积满行功能代码,如下: private int clearCompletedRows(TetrisPiece piece) { TetrisBoard board =this.getBoard(); // 检查方块的每一行,看是否以完成 for(int i = 0; i <TetrisConstants.FOUR_BLOCKS; i++) { int rowY = piece.getBlockY(i); // 如果一行被填充满,则标记为完成 if(board.checkRowCompleted(rowY)){ this.markRowCompleted(rowY,true); } } int numClearedRows = 0; for(int y = TetrisConstants.HEIGHT- 1; y >= 0; y--) { //从下到上重复 if(numClearedRows >0) { board.dropRow(y,numClearedRows); } if(this.isRowCompleted(y)){ numClearedRows++; this.markRowCompleted(y,false); // 为下一次重置 } } // 清除最上面的完成行数 for(int i = 0; i <numClearedRows; i++) { board.clearRow(i); } return numClearedRows; } 为了增加玩家在游戏过程中的游戏性,下落的方块设置成随机生成,这里利用rand.nextInt方法得到随机数,下面是随机生成方块功能的部分代码,如下: private intgetRandomPieceType() { returnMath.abs(rand.nextInt() % TetrisConstants.NUM_PIECE_TYPES) + 1; } 首先用rand.nextInt()方法得到随机数后,用随机数除以TetrisCanstants中定义的表示方块类型数的常量NUM_PIECE_TYPE,其值初始值为7,取余后加1取其绝对值。实现效果如下图: 在前面4.3部分通过图9的系统生命周期流程图,已经了解了游戏中断处理的过程。在游戏运行时可以按右软键调用程序生命周期中pauseApp()方法暂停游戏,方块会停在暂停位置,直到玩家再次点击右软键恢复游戏,pauseApp()方法代码如下: protected void pauseApp() { // 挂起程序使游戏进入暂停状态 if(TetrisConstants.RUNNING_STATE== this.gameState) { this.pauseGame(); } } 在pauseApp方法中调用了pauseGame()方法,其实现代码如下: private void pauseGame() { // 把暂停命令替换成恢复命令 this.gameCanvas.removeCommand(this.pauseCommand); this.gameCanvas.addCommand(this.resumeCommand); // 进入暂停状态并停止下落 this.setGameState(TetrisConstants.PAUSED_STATE); this.dropThread.stopThread();} 游戏暂停阶段画面如下: 当点击右软件恢复游戏后,方块从暂停位置继续下落,这里用了resumeGame()来实现此功能,代码如下: private void resumeGame() { // 把恢复命令替换成暂停命令 this.gameCanvas.removeCommand(this.resumeCommand); this.gameCanvas.addCommand(this.pauseCommand); // 进入运行状态并下落 this.setGameState(TetrisConstants.RUNNING_STATE); this.runDropThread();} 游戏恢复阶段状态,如下图: 源文件
3.1 俄罗斯方块游戏的背景
3.2 俄罗斯方块游戏的规则
3.3 俄罗斯方块游戏的特性
2 游戏系统分析设计
4.1 系统解决方案
4.2 系统总体结构
4.2.1 难度选择模块
4.2.1 方块处理模块
4.2.1 游戏规则模块
5.1系统源文件结构
5.2 难度选择模块
5.2.1 难度选择模块功能
游戏规则模块功能
5.3.1 游戏规则模块结构
5.3.1 游戏规则模块功能
版权所有© 帮我毕业网 并保留所有权利