基于Android的俄罗斯方块的设计与实现

更新时间:2023-12-16 00:34:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

武汉理工大学论文

摘要 ............................................................................................................................ Ⅰ

Abstract ..................................................................................................................... Ⅱ 一 引言 ....................................................................................................................... 1 二 Android平台介绍 ............................................................................................. 2

2.1 平台背景概述 ................................................................................................. 2 2.2 系统概述 ......................................................................................................... 2 2.3 Android系统的特点 ....................................................................................... 3 2.4 Android手机强大的功能 ............................................................................... 3 2.5 Android应用程序框架 ................................................................................... 5 2.6 Android开发环境的搭建 ............................................................................... 6

2.6.1 Android SDK安装 ................................................................................ 6 2.6.2 Android SDK配置 ................................................................................ 7 2.6.3 安装和配置ADT .................................................................................. 7 2.6.4 模拟器的配置 ....................................................................................... 8

三 俄罗斯方块需求分析 ...................................................................................... 9

3.1 游戏介绍 ......................................................................................................... 9 3.2 游戏功能分析 ................................................................................................. 9 3.3 方块及旋转变换需求分析 ........................................................................... 10 3.4 游戏运行需求分析 ....................................................................................... 10 3.5 消行和分数统计需求分析 ........................................................................... 11

四 游戏总体设计分析 ......................................................................................... 12

4.1 总体设计思想 ............................................................................................... 12 4.2 游戏的类设计 ............................................................................................... 13

五 详细设计与实现 ............................................................................................. 17

5.1 游戏开始菜单界面的设计 ........................................................................... 17 5.2 方块类的设计与实现 ................................................................................... 17 5.3 方块的装载 ................................................................................................... 18 5.4 方块的控制设计 ........................................................................................... 20 5.5 方块的消行 ................................................................................................... 24 5.6 分数的统计和速度的控制 ........................................................................... 25 5.7 游戏界面的绘制 ........................................................................................... 26

武汉理工大学论文

5.8 游戏结束 ....................................................................................................... 27

六 游戏实现结果 .................................................................................................. 29

6.1 游戏菜单界面 ............................................................................................... 29 6.2 游戏帮助界面 ............................................................................................... 29 6.3 游戏运行界面 ............................................................................................... 29 6.4 游戏结束界面 ............................................................................................... 30

结束语 ....................................................................................................................... 30

致谢 ............................................................................................................................ 32 参考文献 .................................................................................................................. 33

武汉理工大学论文

摘 要

Android作为Google为移动终端打造的真正开放和完整的智能手机系统,近年来受到了开发者的广泛关注。该平台由操作系统、中间件、用户界面和应用软件组成。

本文主要介绍了Android平台的背景和开发环境的搭建以及俄罗斯方块的开发过程,基于对Android开源平台构架的理解和开发环境的搭建完成了俄罗斯方块的游戏设计。俄罗斯方块游戏包括方块的装载、键盘的事件处理、方块操作控制、下降速度控制、到达事件处理、满行判断及消行、显示控制等几大模块。本设计采用Java语言在Android开发平台下设计实现了俄罗斯方块游戏。

关键字:Android;Java;俄罗斯方块;手机游戏

I

武汉理工大学论文

Abstract

As a truly opened and completed mobile platform, Android which devised by Google was concerned sidely by developers in recent years. The platform consists of the operating system, the middle-ware, the user Interface and the application software.

This paper mainly introduced the background of Android platform, the development environment’s setting up and the development process of Puzzle game and Tetris game. Based on the comprehension of the open-source building of Android and the construction of development environment, the Tetris game were completed. Tetris game contains modules of the square-loading, the keyboard events handling,the block-rotating, the drop speed controlling, the incident handling, the full line judging and vanishing and the display-controlling. Tetris game were accomplished by the Java language on Android development environment platform.

Keywords:Android; Java; Tetris; Mobile phone game

II

武汉理工大学论文

一 引言

Android一词的本义指“机器人”,于2007年11月5日被Google宣布为基于Linux内核的开源手机造作系统的名称。该平台由操作系统、中间件、用户界面和应用软件组成,是一个为移动终端打造的真正开放和完整的智能手机系统。Android的发布吸引了众多开发者的目光,它不仅功能强大,而且具有开放和免费等先天优势,全球范围内的电信行业、手机制造商因此毫不犹豫地加入到Android开放联盟中来。

随着谷歌Android智能手机平台的推出,很快便在其周围汇集了全球移动领域一大批的重量级厂商并组成了谷歌开放手机联盟(Open Handset Alliance),“开放手机联盟”表示:Android平台可以促使移动设备的创新,让用户体验到最优质的移动服务。同时,开发商也将得到一个新的开放级别,更方便地进行协同合作,从而保障新型移动设备的研发速度,因此Android是第一个完整、开放、免费的手机平台。开发Android应用程序使用的Java语言是面向对象的编程语言,面向对象技术较好地适应了当今软件开发过程中新出现的种种传统面向过程语言所不能处理的问题,包括软件开发的规模扩大、升级加快、维护量增大以及开发分工日趋细化、专业化和标准化等,是一种迅速成熟、推广的软件开发方法。面向对象技术的核心是以更接近人类思维的方式建立计算机逻辑模型,它利用类和对象的机制将数据与其上的操作封装在一起,并通过统一的接口与外界交互,使反映现实世界实体的各个类在程序中能够独立、自治、继承;这种方法非常有利于提高程序的可维护性和可重用性,大大提高了开发效率和程序的可管理性,使得面向过程语言难于操纵的大规模软件可以很方便的创建、使用和维护。 本文基于 Android 开发平台,使用 Java 语言编写了俄罗斯方块游戏,通过不断的编写、调试、完善,最终使程序顺利运行。

1

武汉理工大学论文

二 Android平台介绍

2.1 平台背景概述

早在 2005 年,谷歌就低调收购了当时成立仅 22 个月,致力于手机软件和手机操作系统研发的高科技企业 Android,至此谷歌为其进军智能手机领域开响了第一枪。2007 年 11 月 5 日,Android 被谷歌正式公布作为自己的手机系统平台,而在未公开之前常被传闻为 Google 电话或 gPhone。Android的Logo是一个全身绿色的机器人,如图2-1所示。

图2-1 谷歌Android机器人标志

2.2 系统概述

Android 一词的本义指“机器人”,同时也是 Google 于 2007 年 11 月 5 日宣布的基于 Linux 内核的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。它是一个为移动终端打造的真正开放和完整的智能手机系统。其早期由 Google 开发,后由开放手机联盟OpenHandset Alliance开发。它采用了软件堆层(software stack,又名以软件叠层)的架构,主要分为三部分,底层以 Linux 内核为基础,由 C语言开发,只提供基本功能;中间层包括函数库 Library 和虚拟机 Virtual Machine, 由C++开发;最上层是由各公司自行开发,以 Java 编写的各种应用软件,如通话程序,短信程序等。

Android 平台整体自底向上由以下四个层次组成:Linux 内核层、Android 运行时库和其他库层、应用框架层、应用程序层。

2

武汉理工大学论文

2.3 Android系统的特点

Android系统的特点大体有如下几点:

(1)开放性。Google与开放手机联盟合作开发了Android,Google通过与运营商、设备制造商、开发商和其他有关各方结成深层次的合作伙伴关系,希望通过建立标准化、开放式的移动电话软件平台,在移动产业内形成一个开放式的生态系统。

(2)应用程序无界限。Android上的应用程序可以通过标准API访问核心移动设备功能。通过互联网,应用程序可以声明它们的功能可供其他应用程序使用。

(3)应用程序是在平等的条件下创建的。移动设备上的应用程序可以被替换或扩展,即使是拨号程序或主屏幕这样的核心组件。

(4)应用程序可以轻松地潜入网络。应用程序可以轻松地潜入HTML、JavaScript和样式表,还可以通过WebView显示网络内容。

(5)应用程序可以并行运行。Android是一种完整的多任务环境,应用程序可以在其中并行运行。在后台运行时,应用程序可以生成通知以引起注意。

2.4 Android手机强大的功能

Android手机的功能比起传统手机来说相当强大,其优势也很明显:

(1)智能虚拟键盘。虚拟键盘的出现意味着基于Android1.5或以上版本(Android 2.0)的移动设备可以同时支持物理键盘和虚拟键盘。不同的输入方式可满足用户在特定场景的需求。Android虚拟键盘可以在任何应用中提供,包括Gmail、浏览器、SMS,当然也包括大量的第三方应用,如自动校正、推荐、用户词典等。不同于其他手机平台,Android 1.5及以上的版本还支持第三方虚拟键盘应用的安装。如图2-2所示。

(2)使用Widget实现桌面个性化。可以用Widget“武装”自己的桌面。大多数小的Web应用都是从网络上获得实时数据并展示给用户的。Android预装了5个桌面Widget,包括数字时钟、日历、音乐播放器、相框和搜索。不同于iPhone,Android通过内置的应用程序安装第三方Widget。如图2-3所示。

3

武汉理工大学论文

图2-2 虚拟键盘 图2-3 用Widget实现个性化桌面 (3)用在线文件夹快速浏览在线数据。类似于OS X Leopard的QuickLook特征,Android的在线文件夹可显示常见的数据条目,比如联系人、喜欢的应用、E-mail信息、播放列表、书签、RSS源等,并不需要运行系统程序处理特定的数据条目。在线文件夹数据实时更新,就像通过云或是本地创建新的数据。什么是最好的,开发者可以拓展通用数据条目和注册新数据类型的内置支持。

(4)视频录制和分享。Android还有录制和分享视频的功能,对回放和MPEG-4、3GP等视频格式也有了更好的支持。可以通过E-mail、MMS或直接上传到YouTube等方式来分享视频,使用隐私控制来决定是分享给朋友还是每个人。上传视频的同时,可以继续使用手机,甚至可以继续录制和上传新的视频。

(5)图片上传。在线分享图片需要的点击更少。完成照相后,当浏览图片或选择Google在线图片服务Picase时,只需轻点“分享”就会拥有1GB的免费图片存储空间。

(6)更快、更兼容的浏览器。Android的基于Webkit内核的浏览器带来了重要的调速装置(SpeedPumb),这得益于新的Webkit渲染引擎和优化的Java脚本编译器(SquireIFish)。当使用包含大量Java脚本的复杂Web应用时,可以体验到更佳的性能。除提高速度外,Android的浏览器还支持Web页面内的复制和粘贴操作,用户可以选中文本并复制,然后粘贴到搜索框中进行搜索。

(7)Voice Search语音搜索。带有语音识别技术的Google手机已于2008年11月面世,它支持语音搜索功能。该功能增强了默认的搜索能力,已超过纯文本搜索。当你大声说出要搜索的内容后,Android将上传数字信号并记录到Google服务器中。在服

4

武汉理工大学论文

务器中,语音识别技术能将语音转化为特定的文本搜索,使之通过Google搜索引擎,通过地理位置的筛选,将结果反馈到手机设备。

(8)立体声蓝牙和免提电话。除了增强的免提电话体验,Android还支持立体声蓝牙(A2DP和AVCRP),并有自动配对功能。

(9)强大的GPS技术。Android内部提供了大量的GPS组件,我们可以很轻松地获得设备当前的位置等信息,让导航等功能更加完美。

(10)Android系统硬件检测。Android可自动检测和修复SD卡的文件系统,允许第三方应用显示Android系统的硬件特征。为了让用户下载到与组件的设备更匹配的应用,我们可以检测用户设备的硬件信息,让满足应用要求的设备安装该程序,当更多的Android设备建立在不同的硬件上时,这个功能会显得很实用。

2.5 Android应用程序框架

框架是一个应用程序的核心,是所有参与开发的程序员共同使用和遵守的约定,大家在其约定上进行必要的扩展,但程序始终保持主体结构的一致性。其作用是让程序保持清晰和一目了然,在满足不同需求的同时又不相互影响。

Android 系统提供给应用开发者的本身就是一个框架,所有的应用开发都必须遵守这个框架的原则。在开发应用时就是在这个框架上进行扩展,Android框架有如下功能可供使用。

? android.app: 提供高层的程序模型和基本的运行环境。 ? android.content: 包含对各种设备上的数据进行访问和发布。 ? android.database:通过内容提供者浏览和操作数据库。

? android.graphics:底层的图形库,包含画布、颜色过滤、点、矩阵,可以将

它们直接绘制到屏幕上。

? android.media:提供一些类管理多种音频、视频的媒体接口。 ? android.net:提供帮助网络访问的类,超过通常的java.net.*接口。 ? android.os:提供了系统服务、消息传输和IPC机制。 ? android.opengl:提供OpenGL的工具。

? android.provider:提供访问Android内容提供者的类。 ? android.telephony:提供与拨打电话相关的API交互。

5

武汉理工大学论文

? android.view:提供基础的用户界面接口框架。

? android.util:涉及工具性的方法,例如时间日期的操作。 ? android.webkit:默认浏览器操作接口。

? android.widget:包含各种UI元素(大部分是可见的)在应用程序的布局中

使用。

2.6 Android开发环境的搭建

配置Android开发环境之前,首先需要了解Android对操作系统的要求。它可以使用Windows XP及其以上的版本、Mac OS、Linux等操作系统,以Windows XP为例进行讲解。Android开发所需软件的版本及其下载地址如表2-1所示。

表2-1 Android开发所需软件的下载地址

软件名称 下载地址

JDK http://java.sun.com Eclipse http://www.eclipse.org

SDK http://developer.android.com/sdk/index.html ADT http://dl-ssl.google.com/android/eclipse/

Android 以 Java 作为开发语言,JDK是进行Java 开发时必需的开发包。Eclipse是一款非常优秀的开源IDE,在大量插件的“配合”下,完全可以满足从企业级Java应用到手机终端Java游戏的开发,Google官方也提供了基于Eclipse的Android开发插件ADT。

Eclipse的安装非常简单,直接将下载的压缩包解压即可。安装了JDK和Eclipse后,就要安装Android SDK和ADT插件了。

2.6.1 Android SDK安装

(1)解压缩下载好的SDK安装包到要安装SDK的路径,然后运行“SDK Stetup.exe”。 (2)如果遇到了消息为“Failed to fetch URL?”的错误提示,那么需要将HTTPS方式改为HTTP方式,在“Android SDK and AVD Manager”窗口的左侧选择“Settings”,选中“Force https://?”选项,点击“Save&Apply”并重新运行SDK Setup.exe。

(3)点击“Available Packages”,选择要安装的API版本及USB驱动和SDK文档,

6

武汉理工大学论文

如果有需要可以全部选择。

(4)选择好之后点击“Install Selected”按钮,安装选中的软件包,在接下来出现的界面中依次点击“Accept All”单选按钮和“Install Accepted”按钮,开始下载所选择的安装包。

下载完成之后,根据提示即可完成后续的安装操作,到这里,Android SDK的安装已经完成,下面来配置Android SDK。

2.6.2 Android SDK配置

需要将Android SDK安装目录中的tools文件夹路径添加到环境变量中以便使用,操作步骤如下所述。

(1)右键点击“我的电脑”,依次选择“属性”→“高级”→“环境变量”选项。 (2)选择“系统变量”中变量名为“path”的项,点击编辑按钮,将Android SDK安装文件夹下的tools文件夹的路径加入到“path”变量中,注意用“;”隔开。

(3)依次点击“确定”,完成环境变量的配置。

2.6.3 安装和配置ADT

ADT插件的安装和配置步骤如下所述。

(1)启动Eclipse,点击Help菜单,依次选择“Software Update?”项和“Avaiable”选项,https://dl-ssl.google.com/android/eclipse/,结果如图2-4所示。

图2-4 添加ADT的更新地址

(2)点击“OK”,这时可能会出现如图2-5所示的错误。

7

武汉理工大学论文

图2-5 更新地址错误

解决这个问题的方法是:将https://dl-ssl.google.com/android/eclipse/中的“https”更改为“http”,在接下来的对话框中选中的“Name”下的所有选项,根据提示即可完成后续的安装过程。

(3)打开菜单“Windows”,依次选择“Preferences”→“Android”,点击“Browse?”按钮,选择Android SDK的安装路径。

(4)点击“OK”按钮,打开菜单“File”,依次选择“NEW”→“Projece?”菜单命令,出现“Android Projest”选项,则表示安装配置成功。

到这里,准备工作已经就绪。

2.6.4 模拟器的配置

从Android1.5开始引入AVD(Android Virtual Device)这个概念,AVD是一个经过配置的模拟器。在创建AVD时可以配置的选项有:模拟器影像大小、触摸屏、轨迹球、摄像头、屏幕分辨率、键盘、GSM、GPS、Audio录放、SD卡支持、缓存区大小等。配置Android模拟器具体步骤如下所示。

(1)首先打开“Android SDK and AVD Manager”。

(2)点击左边的“Virtual Devices”选项,再点击右边的“New?”按钮,新建一个AVD。

(3)在“Name”标签处填写AVD的名字,在“Target”标签处选择API等级,在“Size”标签处填写要创建的SD卡的大小,在“Skin”标签中设置模拟器的风格。

(4)接下来,还需要配置模拟器运行的AVD。操作步骤为:点击“Run”,选择“Run Configurations”菜单命令,打开“Run Configurations”对话框,双击“Run Configurations”对话框左边的导航器中的“Android Application”菜单命令,创建一个Android项目运行配置。在右边的“Name”文本框中输入Android项目运行配置的名字,在“Android”选项卡中的“Project”文本框中输入要运行的Android项目,同样可以点击右边的“Browse?”按钮来选择Android项目。

(5)点击“Target”选项卡,选择“Autonmatic”单选项,然后在AVD列表框中选择刚才创建的AVD,点击“Run”按钮,这样便可以运行项目了。

8

武汉理工大学论文

三 俄罗斯方块需求分析

3.1 游戏介绍

俄罗斯方块是家喻户晓的益智小游戏,它由俄罗斯人阿列克谢?帕基特诺夫(Alexey Pazhitnov)在1984年6月利用空暇时间编写的游戏程序,故此得名。俄罗斯方块的基本规则是移动、旋转和摆放游戏随机产生的各种方块,使之排列成完整的一行或多行并且消除得分。它看似简单却变化无穷,俄罗斯方块上手极其简单,且游戏过程变化无穷,作为游戏本身很有魅力,但是要熟练掌握其中的操作和摆放技巧,难度却不低。此软件给用户提供了一个展现自己高超技艺的场所,在这里,它不仅放松自己,还能感受到游戏中的乐趣。

游戏区域会从顶部不断落下7种下坠物的一种,游戏区域右上角有一个区域可以显示下一个下坠物的形状,玩家可以控制下坠物移动、旋转和一键到底,通过玩家的操作,下坠物在游戏区域以“摆积木”的形式出现。下坠物在一行或多行堆满后就可以自动消除,消行后会得到相应的分数,如果当前下坠物堆积至窗口顶端,则游戏结束。

3.2 游戏功能分析

先分析一下整个游戏的具体实现,首先,游戏有开始、切换界面、结束等操作接口,而在游戏过程中,随着玩家的按键,会出现下坠物的形态变化、下坠物快速下坠、摆放下坠物件、销毁填满的行、产生下一个方块等功能。先分析游戏的特点,然后对这些功能一一进行细化,从而完成整个游戏的设计。

(1)游戏方块控制功能。当玩家按下相应的操作键位时,通过条件判断,判断该操作是否可行,如果可行就执行相应的操作。主要的操作有游戏方块的左移,右移,快速下降,旋转变形。

(2)方块的生成显示功能。游戏中会有两个地方产生方块,一个是游戏区域上方会有方块落下,还有就是在屏幕右上角,也会产生一个方块,该方块为游戏区域下一个要产生的方块。同时当游戏方块左右移动,下落,旋转变形时,要清除先前的游戏方块,还要求出被操作后的方块坐标,用新坐标重绘游戏方块。

(3)方块的摆放消行功能。当方块落到底部的时候,通过条件判断,把方块摆放在屏幕底部并持续显示,当某行或者某几行被填满的时候,要把这几行消除,并且被消除

9

武汉理工大学论文

的行数上方的方块整体下移。

(4)游戏分数统计功能。记录游戏积分,每当有行被消除时,游戏积分会根据一次消除的行数而增加相应的分数。

(5)游戏速度更新功能。当游戏积分达到某一条件时,系统将自动为玩家提高难度。难度增加的时候,方块的下降速度会加快,增加游戏可玩性和趣味性。

(6)游戏结束控制功能。通过判断,如果摆放的方块超过屏幕顶端的时候,则游戏结束,可以返回菜单重新开始游戏。

3.3 方块及旋转变换需求分析

本游戏共有7种类型的方块,而每种类型方块还可以通过旋转变换成4种不同形态的方块进行摆放。

方块生成后可以将它们摆放在一个20*10的区域内,该区域可以看作是有许多个等面积小方格构成的区域,而这些区域的状态只有两种,被方块占据或空闲。因此,对于整个游戏区域的空间是占据或空闲,可以用一位数来标识,对于7种方块和它们旋转后的形态我们可以用不同的标识进行标记。

对于旋转,游戏中所有方块都是按照顺时针旋转的规则进行的,而且在旋转过程中它们不会因为旋转而下降,总会保持在同一高度,但是在同一高度最多旋转三次,就会下降一格,任何下坠物经过一个旋转周期还会变回原型。

3.4 游戏运行需求分析

游戏开始后会随机产生一个方块,显示在游戏区域,同时右上角也会随机产生一个新的方块,该方块为游戏区域下一个将要产生的方块,游戏区域不再随机生成方块。当游戏区域的方块下落到底后,新的方块再次进入游戏区域,如此循环,直到游戏结束,这就是游戏的正常工作。

当用户进行一定的操作交互的时候,运行程序可以根据用户的操作指示对方块进行控制,而这些操作都是响应相关的按键而执行的。

按键盘上键,此事件实现下坠方块旋转操作,方块并非任何情况都能旋转,如果旋转后与已摆放好的方块有冲突或超出边界时,均不能发生旋转。因此首先要判断是否有足够的空间进行旋转,然后决定是否旋转。

10

武汉理工大学论文

按键盘下键,此事件实现下坠方块一键到底操作,使方块迅速下降到游戏区域底部或者已经摆放好的方块之上。

按键盘左键,此事件实现下坠方块左移操作,首先要判断此方块是否能够发生左移,当越界或被其他摆放好的方块阻挡时,则不能左移。

按键盘右键,此事件实现下坠方块右移操作。首先要判断此方块是否能够发生右移,当越界或被其他摆放好的方块阻挡时,则不能右移。

3.5 消行和分数统计需求分析

当一个方块下落到游戏区域底部进行摆放后就要进行一次消行检测,检测是否有行被填满,检测时从刚摆放的方块最上面那一行开始往下检测,由于方块的形状限制可知每次最多只能消除四行,所以只需检测四行即可。检测到一行被填满时该行上面的方块整体下移一行,包括空洞,然后继续检测下一行,直到四行都被检测完。消行以后要统计游戏的积分,根据每次消除的行数t的不同而累加不同的积分,游戏积分通过公式score+=t*t*10来计算,消除一行得10分,消除两行得40分,消除三行得90分,消除四行得160分。当分数达到一定要求后,游戏速度会加快,游戏速度有一个最大值,当到达这个值时,游戏速度将不再加快。

11

武汉理工大学论文

四 游戏总体设计分析

4.1 总体设计思想

俄罗斯方块游戏设计主要从9个方面进行构思。 (1)游戏主界面的设计。 (2)方块的设计。 (3)方块的旋转。

(4)方块的运动情况(包括向左、向右、下坠)。 (5)方块的自动消行功能。 (6)游戏速度的调节。 (7)游戏积分的计算。 (8)游戏开始菜单的设计。 (9)游戏结束界面的设计。

首先,是定义方块的数据结构,这是游戏的一大难点,本设计用一个三维数组来表示方块的数据模型;游戏区域的状态,用一个二维数组来表示。

其次,分析按键的含义,并做出响应。响应模块:“左移”、“右移”、“下坠”和“旋转”几个模块,负责改变当前方块的状态数据;绘制方块模块:位置移动后,删除原来的方块,把方块绘制到新的位置上;检查模块:在每次改变状态之前,对方块企图占用的区域进行检查,如果不能容下新的方块,则此次移动失败,不执行移动。

如果方块下落到游戏区域底端了,则应该固定在当前位置,每次当方块到底的时候,都需要检查一下是否有新的行被排满了,如果有,则应消行。如果方块触顶了,则游戏结束。

俄罗斯方块是一个看似简单但比较有趣并且耐玩的游戏,游戏中共有7种类型的方块,每种方块由4个方格组成,如图4-1所示。

12

武汉理工大学论文

0字型方块 1字型方块 S字型方块 Z字型方块

J字型方块 L字型方块 T字型方块

图4-1 游戏中的7种方块

4.2 游戏的类设计

根据游戏的功能,俄罗斯方块设计了8个类。这8个类分别是:ActGameover,ActivityGame,ActivityHelp,contro,showPage,StarSurfaceView,Store,TTetris,每个类实现的功能各不相同,而彼此之间又存在着交叉。

TTetris类的设计:TTetris开始菜单类,这个类继承了Activity类,作为游戏的第一个界面,总共定义了三个按钮,一个可以开始游戏,一个进入帮助说明界面,还有一个是退出游戏。

ActivityGame类的设计:ActivityGame启动游戏类,该类继承了Activity类,用来启动游戏,进入游戏画面。

ActivityHelp类的设计:ActivityHelp游戏帮助类,显示帮助界面,用来介绍游戏的基本操作规则,该界面从开始菜单选择进入,该界面设有一个按钮,用来返回开始菜单。

ActGameover类的设计:ActGameover游戏结束类,该类继承了Activity类,是游戏的结束画面,每当游戏失败时就会自动跳转到该界面,从该界面可以选择返回开始菜单。

Store类的设计:Store方块类,该类设计了方块的数据结构,用一个三维数组来表示一共28种方块模型,该类定义了方法Sttore(int)用来随机生成一个方块,用random()方法实现随机数的产生,产生的方块用两个一维数组ai,aj记录下来。

表4-1 Store类的属性

13

武汉理工大学论文

属性名 kind color ai aj store 数据类型 int int int[] int[] int[][][][] 说明 记录产生何种类型的方块 记录方块的颜色 记录方格的行 记录方格的列 方块的数据结构

表4-2 Store类的方法

方法名 Store() Sttore(int)

返回值类型 无 void 说明 类的构造方法 产生方块,并且用ai,aj记录下来 showPage类的设计:showPage方块类,该类定义了游戏界面的框架,用一个二维数组array来构建游戏的基本框架。该类主要定义了一系列的方法,用来实现方块的一些操作。方法putS(Store)把下一个将要产生的方块存入数组,存入数组的是一个数值为1~7的整型整数,用来表示7种不同颜色的方块。delS(Store)把用来存储一个将要产生的方块的数组置零,从而用来实现删除下一个方块区域的方块。putStore(Store,int,int)把要在屏幕相应位置上产生的方块存入数组array,用1~7来赋值,达到显示不同颜色的方块的效果。delStore(Store,int,int)把数组array相应位置清零,达到删除屏幕上相应位置的方块的效果。

leftM(Store,int,int)和rightM(Store,int,int)用来判断方块是否可以左右移动,如果可以则返回true,不可以返回false。fit(Store,int,int)用来判断方块是否碰壁,碰壁了返回false,没有返回true。outM(Store,int,int)判断方块是否碰到游戏区域顶端,用来判断游戏是否结束。flood(Srore,int,int)检测是否可以消行,如果一行被填满,则消除该行,并记录消除的行数,用来计分。remove(int)消除某一行,消除的行上面的方块整体下移一行。

表4-3 showPage类的主要属性

14

武汉理工大学论文

属性名 co brray array

数据类型 int[] int[][] int[][] 简要说明 用该数组按位存储游戏分数 记录下一个区域的方块 记录游戏区域的方块 表4-4 showPage类的主要方法

方法名 putS(Store) delS(Store) putStore(Store,int,int) delStore(Store,int,int) leftM(Store,int,int) rightM(Store,int,int) 返回值类型 void void void 简要说明

把下一个方块存入数组braay 把数组braay置0,即删除方块 把游戏区域的方块存入数组array void 删除游戏区域的方块 boolean 判断方块是否可以左移 boolean 判断方块是否可以右移 判断方块是否碰到边界或者碰到别方块 判断方块是否超出屏幕顶端 fit(Store,int,int) boolean outM(Store,int,int) flood(Store,int,int) remove(int)

boolean int void 判断是否可以消行,如果可以进行消行 消行 contro类的设计:contro分数统计和速度控制类,用来统计游戏的分数,并通过分数来调节方块下坠的速度以提高游戏难度,增加游戏趣味性和挑战性。该类定义了方法tscore(int)用来统计游戏分数并把该分数按位存入一维数组,passWar()通过分数控制方块下坠的速度,实现一个简单的游戏关卡控制。

表4-5 contro类的主要属性

15

武汉理工大学论文

属性名 score speed sco

数据类型 int int int[] 简要说明 记录游戏分数 调节游戏速度 按位存储游戏分数 表4-6 contro类的主要方法

方法名 tscore(int) passWar()

StarSurfaceView类的设计:StarSurfaceView游戏的框架类,该类继承了SurfaceView类,实现了Runnable,SurfaceHolder.Callback,View.OnKeyListener接口。该类用来绘制游戏的运行界面,用draw()来实现视图的绘制,游戏的背景绘制,方块的绘制,分数的绘制等。run()来循环绘图,从而使游戏持续运行下去,该方法实现了游戏的逻辑功能,对方块的操作,方块的摆放都是在这个方法内实现,调用了draw()实现循环绘制,游戏的运行都是靠该方法实现的。

表4-7 StarSurfaceView类的主要方法

方法名 run() draw() onKeyup(int,KeyEvent)

返回值类型 void void void 简要说明 游戏运行方法 绘制游戏图片 监听按键 返回值类型 void void 简要说明 记录游戏分数并按位存入数组sco 通过分数改变速度控制变量speed

16

武汉理工大学论文

五 详细设计与实现

5.1 游戏开始菜单界面的设计

游戏开始菜单界面是游戏的重要组成部分,为了增强游戏界面的美化效果,同时又使界面简洁直观,该界面用一张图片作为背景,添加了三个按钮,这三个按钮分别是开始按钮,帮助按钮,退出按钮。该界面由类TTetris实现,该类继承Activity类,当监听到开始按钮被点击时,游戏会跳转到游戏开始的Activity,当监听到帮助按钮被点击时,就跳转到帮助Activity,监听到退出键被点击时,游戏退出,该类实现起来较为简单。

5.2 方块类的设计与实现

方块是游戏最基本的元素,俄罗斯方块所有的操作都是建立在对方块的操作上,方块可以用不同的颜色的方格图片来显示,方块的数据结构定义在类Store中。方块类定义了方块的数据结构,用一个三维数组来表示7种类型一共28种方块,每一个方块由一个4×4的二维数组表示。定义4×4的数组是因为7种方块的旋转变化恰好都在长、宽各为4个单元格内。当数组的元素为1时则显示一个小方格,为0是则不显示。

这28种状态的数据模型用三维数组store表示。

public static int[][][] store = new int[][][] {

{{ 0, 0, 1, 0 }, { 0, 0, 1, 0 }, { 0, 0, 1, 0 }, { 0, 0, 1, 0 } },//I {{ 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 1, 1, 1, 1 }, { 0, 0, 0, 0 } },//I {{ 0, 0, 1, 0 }, { 0, 0, 1, 0 }, { 0, 0, 1, 0 }, { 0, 0, 1, 0 } },//I {{ 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 1, 1, 1, 1 }, { 0, 0, 0, 0 } },//I {{ 0, 0, 0, 0 }, { 0, 1, 1, 0 }, { 0, 1, 1, 0 }, { 0, 0, 0, 0 } },//O {{ 0, 0, 0, 0 }, { 0, 1, 1, 0 }, { 0, 1, 1, 0 }, { 0, 0, 0, 0 } },//O {{ 0, 0, 0, 0 }, { 0, 1, 1, 0 }, { 0, 1, 1, 0 }, { 0, 0, 0, 0 } },//O {{ 0, 0, 0, 0 }, { 0, 1, 1, 0 }, { 0, 1, 1, 0 }, { 0, 0, 0, 0 } },//O {{ 0, 1, 0, 0 }, { 0, 1, 0, 0 }, { 0, 1, 1, 0 }, { 0, 0, 0, 0 } },//L {{ 0, 0, 0, 0 }, { 1, 1, 1, 0 }, { 1, 0, 0, 0 }, { 0, 0, 0, 0 } },//L {{ 0, 1, 1, 0 }, { 0, 0, 1, 0 }, { 0, 0, 1, 0 }, { 0, 0, 0, 0 } },//L {{ 0, 0, 0, 0 }, { 0, 0, 1, 0 }, { 1, 1, 1, 0 }, { 0, 0, 0, 0 } },//L

17

武汉理工大学论文

{{ 0, 0, 1, 0 }, { 0, 0, 1, 0 }, { 0, 1, 1, 0 }, { 0, 0, 0, 0 } },//J {{ 0, 0, 0, 0 }, { 1, 0, 0, 0 }, { 1, 1, 1, 0 }, { 0, 0, 0, 0 } },//J {{ 0, 1, 1, 0 }, { 0, 1, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 0 } },//J {{ 0, 0, 0, 0 }, { 1, 1, 1, 0 }, { 0, 0, 1, 0 }, { 0, 0, 0, 0 } },//J {{ 0, 0, 0, 0 }, { 0, 1, 0, 0 }, { 1, 1, 1, 0 }, { 0, 0, 0, 0 } },//T {{ 0, 1, 0, 0 }, { 0, 1, 1, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 0 } },//T {{ 0, 0, 0, 0 }, { 1, 1, 1, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 0 } },//T {{ 0, 0, 1, 0 }, { 0, 1, 1, 0 }, { 0, 0, 1, 0 }, { 0, 0, 0, 0 } },//T {{ 0, 0, 0, 0 }, { 0, 1, 1, 0 }, { 1, 1, 0, 0 }, { 0, 0, 0, 0 } },//S {{ 0, 1, 0, 0 }, { 0, 1, 1, 0 }, { 0, 0, 1, 0 }, { 0, 0, 0, 0 } },//S {{ 0, 0, 0, 0 }, { 0, 1, 1, 0 }, { 1, 1, 0, 0 }, { 0, 0, 0, 0 } },//S {{ 0, 1, 0, 0 }, { 0, 1, 1, 0 }, { 0, 0, 1, 0 }, { 0, 0, 0, 0 } },//S {{ 0, 0, 0, 0 }, { 1, 1, 0, 0 }, { 0, 1, 1, 0 }, { 0, 0, 0, 0 } },//Z {{ 0, 0, 1, 0 }, { 0, 1, 1, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 0 } },//Z {{ 0, 0, 0, 0 }, { 1, 1, 0, 0 }, { 0, 1, 1, 0 }, { 0, 0, 0, 0 } },//Z {{ 0, 0, 1, 0 }, { 0, 1, 1, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 0 } }//Z };

每种类型的方块都设计了四种结构,这样有利于实现方块的变形,在同种类型的方块里,方块每变一次形就变成了它下面的方块结构,第四种结构的方块变形就变成了第一种结构,实现方块的循环变形。

该类定义了一个主要的方法Sttore(int),该方法用来生成一个方块,并把生成的方块用两个一维数组记录下来,该方法通过传递进去的参数来控制生成方块的方式,以两种形式来生成方块,一种是随机生成28种方块的一种,该形式用来生成新的方块,另一种是生成一个指定形状的方块,该形式用于游戏区域的方块生成。

5.3 方块的装载

装载方块是使游戏进行下去必不可少的条件,游戏方块装载体现在两个方面,一个是游戏区域的方块装载,另一个是下一个方块区域。游戏开始后分别为游戏区域和下一个方块区域随机生成一个方块,此后游戏区域的方块都是由存储下一个方块的数组传递过来,不再随机生成方块。游戏区域的方块传入屏幕布局数组array,下一个方块区域的数组传入brray,然后用draw()函数画出方块,以达到方块在屏幕上显示的效果。

18

武汉理工大学论文

方块的装载首先要随机生成一个方块,关键代码如下所示。

public void Sttore(int chang) {

int k = 0; if(chang == -1) { } else { }

//标志方块显示的颜色,一共有七种颜色的方块color的值1到7 color = (int) (kind / 4 + 1); for(int i=0; i<4; i++) {

for(int j=0; j<4; j++) { }

if(store[kind][i][j] != 0) { //用ai,aj两个数组来记录方块的形状 }

ai[k] = i; aj[k] = j; k++;

kind = chang;

//随机产生0到1之间的double正数 kind = (int)(Math.random()*28);

} }

当传入该方法的值为-1时,就随机生成一个方块,否则生成指定类型的方块,指定类型由传入的参数决定。生成的方块行坐标用数组ai记录,列坐标用数组aj记录。

生成方块的方块有两个用途,一个装载在下一个方块区域,另一个装载在游戏区域。 装载下一个方块区域的方块。

public void putS(Store c) {

}

for(int i = 0; i < 4; i++) { }

brray[c.ai[i]][c.aj[i]] = c.color;

删除下一个方块区域的方块。

19

武汉理工大学论文

public void delS(Store c) {

}

for(int i = 0; i < 4; i++) { }

brray[c.ai[i]][c.aj[i]] = 0;

装载屏幕区域的方块。

public void putStore(Store a,int x,int y) {

}

for(int i = 0; i < 4; i++) { }

if(x+a.ai[i]>0) { }

array[x+a.ai[i]][y+a.aj[i]] = a.color;

删除下一个方块区域的方块。

public void delStore(Store a,int x,int y) {

}

for(int i = 0; i < 4; i++) { }

if(x+a.ai[i]>0) { }

array[x+a.ai[i]][y+a.aj[i]] = 0;

5.4 方块的控制设计

对方块的控制,实际就是对二维数组array的控制,该二维数组用来布置游戏区域方块的显示,方块的控制主要在两个类里实现,一个是StarSurfaceView,控制方块的移动、旋转在该类里实现;另一个是类showPage,用来判断方块的各种操作是否可行,如果可行则执行相应的操作,否则操作无效。

控制方块时,首先要判断该操作是否可以执行,判断方法主要有判断方块是否可以左右移动,判断方块是否碰壁,判断方块是否触顶。

判断方块是否可以左移。

public boolean leftM(Store a,int x,int y) {

for(int i = 0; i < 4; i++) {

20

武汉理工大学论文

}

}

if(x+a.ai[i]>0 && array[x+a.ai[i]][y+a.aj[i] - 1] != 0) { }

return false;

return true;

判断方块是否可以右移。

public boolean rightM(Store a,int x,int y) {

}

for(int i = 0; i < 4; i++) { } return true;

if(x+a.ai[i]>0 && array[x+a.ai[i]][y+a.aj[i] + 1] != 0) { }

return false;

判断方块下面是否碰壁。

public boolean fit(Store a,int x,int y) {

}

for(int i = 0; i < 4; i++) { } return true;

if(x+a.ai[i]>0 && array[x+a.ai[i] + 1][y+a.aj[i]] != 0) { }

return false;

判断方块是否触顶。

public boolean outM(Store a,int x,int y) {

}

for(int i = 0; i < 4; i++) { }

return false;

if(x+a.ai[i] < 1) { }

return true;

对方块的控制定义在方法run()内,用while()来实现循环操作。当游戏监听到键

21

本文来源:https://www.bwwdw.com/article/9bi5.html

Top