【编者按】网学网Java类作品频道为大家收集整理了“基于Java ME平台的俄罗斯方块游戏“提供大家参考,希望对大家有所帮助!
客服咨询,网学网竭诚为您服务,本站永久域名:myeducs.cn | |||||||||||||||||||||||||||||||||
2 游戏系统分析设计 4.1 系统解决方案 本系统在Windows XP的操作系统下,以Java Micro Edition Wireless Toolkit 2.1为开发工具,用中文版UltraEdit做为代码编辑器而实现的。在KToolBar开发包的DefaultColorPhone模拟器下进行调试。 4.2 系统总体结构 系统开发的主要任务是俄罗斯方块游戏在无线移动端的实现。本系统的主要实现功能模块分为:难度选择模块、方块处理模块、游戏规则模块。 4.2.1 难度选择模块 用户在title屏按键数字键选择0-9种游戏难度,进入相对应游戏关卡。
图6 Title屏选择关卡模块图 4.2.2 方块处理模块 方块处理模块定义方块的7种状态,每种状态都是由四个小方块组合而成,如下: 图7 方块形状模块图 4.2.3 游戏规则模块 游戏规则模块主要实现俄罗斯方块游戏基本规则。比如,积满一行后消减;能够快速直接的下落;记录游戏最高分;方块翻转;分数计算;随机生成方块,见下图:
图8 游戏规则模块图 4.3 游戏中断处理流程 中断处理是移动设备程序生命周期的重要组成特性,包括下图三种阶段:
图9 系统生命周期图 5 系统实现与测试 5.1 系统源文件结构 本系统由10个类组成并实现全部功能。项目名字为TetrisMidlet,其项目文件结构如下图: 图10 项目结构图 在项目源文件中,src文件夹下为实现系统的源文件。建了两个包作为功能划分,分别为:ui包和model包。 5.2 难度选择模块 5.2.1 难度选择模块结构 ui包里包含以下类: InfoBox.java 用于显示数字的信息框 TitleBox.java 显示title屏,包含当前高分提示选择一个难度 NextPieceBox.java 显示下一个激活方块 TetrisCanvas.java 处理程序的所有UI DisplayBox.java 在屏幕上显示Box 其结构图如下:
图11 ui包结构图 其中核心类DisplayBox.java的方法图如下: 图12 类DisplayBox的方法图 在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) { int blockX = 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。 5.2.2 难度选择模块功能 模拟器程序运行,在应用程序列表里显示可以载入运行的模拟程序,如下图: 图13 载入程序 点击运行程序后,在title屏显示游戏名称、作者、最高分记录和按键提示,点击数字键输入0-9中的一个数字,以选择不同难度的关卡,如下图: 图14 运行游戏 在title屏,也可以点击左软键退出程序。 5.3 游戏规则模块功能 5.3.1 游戏规则模块结构 游戏规则模块包含3个类: DropThread.java 处理方块下落问题 TetrisConstants.java 常数定义 TetrisMidlet.java 游戏规则和对键盘输入的捕捉,以及中断的处理 其结构图如下:
图15 游戏规则模块结构图 其中核心类DropThread.java实现了方块的下落,它的方法图如下: 图16 类DropThread方法图 其中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) { }}} 5.3.2 游戏规则模块功能 游戏规则模块实现俄罗斯方块游戏的主要功能包括,消减积满的行、快速下落、方块翻转、分数计算、下落碰撞检测、随机生成方块。 下面是消减积满行功能代码,如下: 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 int getRandomPieceType() { return Math.abs(rand.nextInt() % TetrisConstants.NUM_PIECE_TYPES) + 1; } 首先用rand.nextInt()方法得到随机数后,用随机数除以TetrisCanstants中定义的表示方块类型数的常量NUM_PIECE_TYPE,其值初始值为7,取余后加1取其绝对值。实现效果如下图: 图17 游戏进行状态图 在前面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();} 游戏暂停阶段画面如下: 图18 游戏暂停状态图 当点击右软件恢复游戏后,方块从暂停位置继续下落,这里用了resumeGame()来实现此功能,代码如下: private void resumeGame() { // 把恢复命令替换成暂停命令 this.gameCanvas.removeCommand(this.resumeCommand); this.gameCanvas.addCommand(this.pauseCommand); // 进入运行状态并下落 this.setGameState(TetrisConstants.RUNNING_STATE); this.runDropThread();} 游戏恢复阶段状态,如下图: 图19 游戏恢复状态图
| |||||||||||||||||||||||||||||||||
本站发布的计算机毕业设计均是完整无错的全套作品,包含开题报告+程序+论文+源代码+翻译+答辩稿PPT | |||||||||||||||||||||||||||||||||
本文选自计算机毕业设计http://myeducs.cn |