• 【java毕业设计】基于java+swing+Eclipse的俄罗斯方块游戏GUI设计与实现(毕业论文+程序源码)——俄罗斯方块游戏


    基于java+swing+Eclipse的俄罗斯方块游戏GUI设计与实现(毕业论文+程序源码)

    大家好,今天给大家介绍基于java+swing+Eclipse的俄罗斯方块游戏GUI设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。

    文章目录:

    1、项目简介

    1. 这篇论文详细的描述分析了经典传统的俄罗斯方块实现的基本思路和一些基本游戏规则,在此基础之上,更进一步地开发出俄罗斯方块的创新创意模式,在经典游戏基础上开发出随着分数增高而等级增高难度加大的模式,并且创意性的开发出可操控方块颜色变换的模块,并且增添了游戏声音和音乐模块。本论文对上述功能给出了具体实现流程、详细描述、和一些源代码。
      本论文阐述了俄罗斯方块游戏的开发和发展历史、开发此游戏的意义以及开发环境并根据软件工程开发软件和java编写程序的相关知识,对程序的需求分析、概要设计、详细设计与实现、调试运行进行了一系列描述。

    2. 此次程序设计是在Microsoft Windows 7系统下,以Java为开发语言,在Eclipse开发平台上进行游戏的设计与实现。

    3. 俄罗斯方块项目,基本功能包括:游戏主界面显示模块、方块及数据显示模块、方块移动控制模块、游戏界面颜色控制模块、游戏进度、等级控制模块等。本项目结构如下:
      (1)游戏主界面显示模块:
      显示游戏和帮助两个菜单;
      游戏使用功能键盘,得分 等级;
      (2)画布、方块显示模块:
      可以根据自己的需求来自己动手更改背景图片,在方块下落过程中,根据颜色的变化识别下落的方块。
      (3)背景画布模块设计:
      游戏用继承自JPanel的GameCanvas类控制背景画布的显示,用rows代表画布的行数,cols代表画布的列数,行数和列数决定着画布拥有方格的数目;
      (4)方块移动、旋转模块
      通过更改横坐标或纵坐标,然后重新绘制方块实现方块移动、旋转


    2、资源详情

    项目难度:中等难度
    适用场景:相关题目的毕业设计
    配套论文字数:26306个字
    包含内容:整套源码+完整毕业论文+答辩PPT+任务书+辅导视频+运行截图


    3、关键词:

    游戏设计;俄罗斯方块;软件工程;Java;Eclipse;

    4、毕设简介:

    提示:以下为毕业设计的简略介绍,项目源码及完整毕业论文下载地址见文末。

    绪论
    绪论从程序的开发背景、开发意义以及所需要开发技术和目前国内外对俄罗斯方块游戏的研究现状进行了简要的叙述。
    1.1程序开发背景及意义
    省略

    俄罗斯方块游戏简单,益智,以其独特简洁的界面和极具玩耍乐趣的模式让众多的游戏爱好者深陷其中,无法自拔,并且老少皆宜。在如今快节奏的生活当中,学生和工作党的学习工作压力也随之越来越大,每个人的任务逐渐繁重,越来越少的自由支配休息时间让人们更加迫切的需要有一些既简单又节省时间的休闲游戏供大家娱乐。毫无疑问,俄罗斯方块是一款简单益智有趣的休闲小游戏,并且可以移植到电脑、手机、平板电脑、电视游戏机、掌上游戏机、电子词典、Mp4等一系列便携设备上。本次课题研究,无论从技术开发上,还是社会意义上,都是很有价值的,是本人对游戏开发的一次胆大尝试。

    1.2开发技术概述
    俄罗斯方块游戏开发代码相对来说不是特别复杂,本论文基于Java编程语言,采用Java语言中常用的Swing组件。Swing是Java中的图形用户界面(GUI)工具包,是Java基础类的一部分,包括了文本框,分隔窗格,按钮,表等GUI器件,使用纯Java写成,开发人员可以用少量的代码就可以写出Swing各式各样的灵活丰富的功能和模块化组件来创建漂亮优美的用户界面。Java Swing组件中包括以下几个常用的类:JFrame 是屏幕上的图形对象,可以有最大化、最小化、关闭等基本操作,是Java的GUI程序设计的基本思路;JPanel 能够用来嵌套,对窗体中有相同逻辑功能的组件进行组合,能够加到JFrame窗体中,是Swing中的面板容器类。 JLabel 对象是用来显示文本、图像或同时显示二者并且可以设置其中的一些属性;JTextField是一个用来编辑单行文本的运行组件;JButton是一个用来创建按钮的类。除此之外,Java中的Swing组件中还包含有许多功能的类,可以简单的来创建一些优美漂亮的图形界面。

    省略

    1.3俄罗斯方块游戏的研究现状
    1.3.1 国内外研究现状
    省略

    1.3.2 文献综述
    省略

    2相关技术
    2.1 JAVA简介
    Java语言是一门非常纯粹的面向对象的编程语言,它吸引了C语言和C++语言的各种优点,又摒弃了C++语言里难以理解的多继承,指针等概念,因此Java语言具有功能强大和简单易用两个非常良好的特征。Java语言作为静态面向对象编程语言的代表,极好地表现了面向对象理论,允许程序员以一种更加优雅的思维方式进行更加复杂的编程开发。

    不仅如此,Java语言中相关的Java EE规范中包含了当今时下最流行的各种软件工程理念,各种先进的设计思想,都可以在Java EE规范、平台以及相关的框架中找见相应的实现原理。从某种程度上来看,学精通了Java语言相关的各种方面的知识,相当于系统的学习了软件开发的相关知识,而不是仅仅学完了一门编程语言。

    省略

    2.2 Swing组件简介
    Swing API 是一组可扩展的 GUI 组件,用来创建基于 JAVA 的前端/ GUI 应用程序。它是建立在 AWT API 之上,并且作为 AWT API 的替代者,因为它的几乎每一个控件都对应 AWT 控件。 Swing 组件遵循模型 - 视图 - 控制器架构来满足下面的准则。一个单一的 API 足够支持多种外观和风格;API 是模拟驱动的,这样最高层级的 API 不需要有数据;API 是使用 Java Bean 模式的,这样 Builder Tools 和 IDE 可以为开发者提供更好的服务来使用它。

    Swing API 架构用下列的方式来遵循基于松散的 MVC 架构。模型表示组件的数据。视图表示组件数据的可视化表示形式。控制器接受用户在视图上的输入,并且在组件的数据上反映变化。Swing 组件把模型作为一个单独的元素,并且把视图和控制器部分组合成用户界面的元素。使用这种方式,Swing 具有可插拔的外观与风格架构。Swing特点主要有:
    轻量级 —— Swing 组件是独立的本地操作系统的 API,因为 Swing API 控件通常采用纯 JAVA 代码而不是采用底层的操作系统调用来呈现。

    丰富的控件 —— Swing 提供了一组丰富的先进的控件,如树,页签窗体,滑动条,颜色选择器,表格控件。

    高级自定义 —— Swing 控件可以用非常简单的方法来自定义,因为可视化外观是独立于内部表示的。

    可插拔的外观和风格 —— 基于 Swing 的 GUI 应用程序的外观和风格可以在运行时根据有效的值改变。

    2.3 Eclipse开发平台简介
    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台,专注于为高度集成的工具开发提供一个全功能的、具有商业品质的工业平台。Eclipse只是一个框架和一组服务,用于通过插件组件构建开发环境。Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Tools,JDT)。

    省略

    2.4系统平台环境:
    2.4.1 硬件平台:
    本程序开发计算机硬件如下:
    内存:4G
    硬盘:500G
    CPU:Intel(R)Core(TM)i5—3230M CPU @2.60GHz
    交互工具:键盘、鼠标
    显示器:LCD显示器

    2.4.2 软件平台:
    本系统的开发环境如下
    操作系统:Microsoft Windows 7 Ultumate
    JDK版本:jdk-8u121-windows-x64
    Eclipse版本: Neon.2 Release (4.6.2),eclipse-inst-win64

    3 系统分析
    省略

    3.1可行性分析
    省略

    3.1.1经济可行性分析
    本游戏系统主要是用于大学生软件工程毕业课程设计,不需要考虑其所能产生的经济效益和游戏日后的发展状态。对游戏系统的本身的经济要求并不高,只是通过本游戏系统的开发来提升学生自身的知识和能力水平。只需要有一台装有JDK运行环境和Java开发工具Eclipse软件的电脑就可以,所以经济问题可不用考虑。

    3.1.2技术可行性分析
    可用于编写俄罗斯方块游戏的编程语言有很多,本次课题主要是在基于Java的环境下进行游戏系统的开发,所以本系统主要利用的是Java中的Swing组件进行开发,需要对变量定义,初始化,界面设计,游戏初始化,进入游戏,退出游戏,处理游戏过程中的各种操作进行相应功能的代码要求,技术方面要求并非特别困难,技术可行。

    3.1.3社会可行性分析
    本游戏系统的开发主要是用于毕业课程设计与论文,用以巩固大学四年学习的知识,主要以个人和学校为单位,仅供个人娱乐和学校的课程设计与毕业论文检查入档案,不会对社会造成任何的影响,所以无需考虑到任何法律,版权等一系列社会因素,在这方面完全可行。

    3.2需求分析
    所谓的“需求分析”是指对待解决的问题的详细分析,澄清问题的要求,包括需要输入什么数据,得到什么结果,最后应该输出什么。
    省略

    3.2.1 功能性需求
    整个游戏系统会随机产生7种由四个小方块组成的不同形状的方块,经过旋转后得到28种状态,如果增加游戏难度,会增加六种不同形状的方块形状,同样经过旋转后增加24种状态。方块按一定的速度自由下落,玩家通过键盘上的上下左右按键控制方块的左右移动和旋转,将方块落下后放在合适的位置。当方块落下后,如果方块落下后有一整行被方块填满,那么该一整行消去。当一行被消去时,玩家得分增加10分,当得分达到100分后,玩家等级增加一级,速度加快一级,难度加大。如果当方块落下后整个游戏画布界面被占满,则方块不再下落,游戏宣告失败。

    游戏具体的功能需求有如下几个:
    1 游戏界面需求:游戏的良好的界面会让玩家眼前一亮,更加能充分的感受到游戏带来的娱乐性,放松性。本游戏的默认背景色是深绿色,游戏主界面画面自定义为自己的所喜欢的图片,并可以更改,主界面方块默认用橘黄色,预显方块颜色默认为淡紫色。背景色、前景色对比鲜明,以达到让玩家眼前一亮的感觉,并能在游戏达到高等级状态,方块下落速度渐高的情况下使玩家能够清楚的分辨出下落方块的形状,增加游戏的刺激性。

    2 游戏形状需求:用数组作为存储方块52种状态的数据结构,即初级等级长条形、Z字形、反Z形、田字形、7字形、反7形、T字型一共7种形状的向4个方向的旋转变形,和中级等级的三种方块12种不同的状态,高级等级的三种方块12种不同的状态。各个方块可以实现按逆时针的旋转方式旋转,并且方块能否旋转需要用条件加以判断,如果旋转后可能发生越界,则不能旋转,需要调整位置来保证他可以旋转。

    3 键盘处理事件需求:当方块下落时,玩家可以通过键盘上的方向键:上键实现旋转,下键实现加速下落,左键实现左移,右键实现右移,和空格键实现一键下落,字母P键实现暂停,字母C键实现继续等一系列的操作。

    4 鼠标处理事件需求:通过鼠标,可以点击控制面板中的菜单按钮和帮助按钮,选择菜单栏的菜单项,可以实现游戏的开局,选择游戏等级,更改游戏中方块的颜色显示,游戏主界面背景色和前景色的显示,更改游戏背景图片,方块下落速度,是否播放游戏中的声音等一系列的功能。

    5 显示需求:本游戏程序的显示需求是要求当方块落下后填满一整行,则该行消除,其余剩下的未填满的行自动逐次向下移动,消去一行右界面得分增加十分,当分数增加到100分时,等级增加一等级。当方块落下叠加到主界面的全部所有行时,方块不再下落,游戏结束,主界面提示“Game Over”字样。

    3.2.2 非功能性需求
    非功能性需求:俄罗斯方块游戏系统的非功能性需求包括游戏主界面左上角图标显示,调整窗口尺寸最大化最小化(但不包括主界面的尺寸大小),游戏运行时弹出窗口的位置居中等一系列非功能性需求。

    3.2.3 接口控制
    本俄罗斯游戏系统在Windows操作系统下,主要是通过键盘进行游戏的操作,通过鼠标进行开局,退出,设置等一系列操作。首先,游戏利用键盘的按键进行游戏的操作,所以需要使用键盘的接口事件。其次,在游戏进行的全过程中,需要使用鼠标进行游戏的控制,包括开始,选择等级,改变设置,改变颜色,查看版本信息,退出等,所以要对鼠标的单击,按键添加接口监听事件,编写相应的代码来实现鼠标和键盘的相应功能。

    4 系统的概要设计
    4.1 系统的功能设计
    4.1.1 手动处理业务的基本流程
    本游戏的设计以娱乐为初衷,以益智为目的,在综合研究以往俄罗斯方块经典游戏功能的基础上推陈出新,加之新的功能,赋以新的生机和活力。以下具体阐述游戏的基本流程。
    运行说明:
    1>运行程序,点击右侧控制面板内的“开始”或“控制”菜单内的“开始”按钮开始游戏。

    2>使用上、下、左、右键和空格键,P键,C键控制方块的变形、下落、向左和向右移动和一键迅速下落,暂停,继续。

    3>方块满行消除,分数自动增加,等级自动增加一级。

    4>等级增加、方块下落速度增加,按右侧控制面板或“游戏”菜单内的“初级”“中级”,“高级”按钮来手动改变游戏难易程度。也可点击“方块颜色”菜单内的选项,更改方块颜色等,也可以通过“自定义”菜单内的选项,来更改游戏的一些属性。

    5>按键盘键字母P键可以控制游戏暂停,然后按子母键C键可以控制游戏继续上次游戏。按“结束游戏”按钮,游戏会彻底停止正在进行的当局游戏,再按“开始”或“控制”菜单内的“重新开始”会开始新游戏。

    6>当方块占满整个窗口,不能再有新方块下落时,游戏会弹出“Game Over”的对话框提示游戏结束。

    游戏的基本流程图如图4—1所示:
    在这里插入图片描述

    图4-1游戏的基本流程图

    4.1.2 基本流程的功能模块
    本系统基于游戏的各项功能来设计游戏的各个功能模块。图4-2为本游戏的系统功能模块示意图,如图所示,本游戏主要有两大模块:游戏界面区,游戏控制区。游戏界面区分显示玩家可选操作、显示玩家操作结果两个部分。游戏控制区分更改颜色、开始、更改游戏等级为初级、更改游戏等级为中级、更改游戏等级为高级、自定义下落速度、更改背景、退出以及其他等一些功能模块。
    在这里插入图片描述

    图4-2系统功能模块示意图

    图4-3为游戏界面区模块设计示意图,如图所示,游戏界面区模块可细分为闯进新游戏界面、处理玩家操作、显示玩家操作结果三个功能模块。
    在这里插入图片描述

    图4-3界面模块示意图
    图3-4为游戏控制区设计示意图,如图所示,游戏控制区模块分为开始、自定义操作设置、初始游戏级别设置、初始颜色设置、退出等功能模块。
    在这里插入图片描述

    图4-4控制区模块示意图

    5 系统的详细设计与实现
    Java是一种纯面向对象(Object-Oriented)的程序语言,它的诸多优点在此就不作详细论述了。从面向对象的观念出发,本程序主要可分为以下几个模块:
    ●游戏主界面显示模块
    ●方块及数据显示模块
    ●方块移动控制模块
    ●游戏界面颜色控制模块
    ●游戏进度、等级控制模块

    分析对象的技巧在于它的功能的扩展性及维护效率。试想,如果因为外部环境或者用户需求的变化需要对程序进行功能扩展或者维护,就要对代码作大幅度的更动甚至重写,这样就失去了面向对象的优势,所以在本程序分析时将独立性高的模块作为一个对象,以提高程序的可扩展性和可维护性。

    以下该游戏中类的设计:
    MyFrame类:继承自JFrame类,作为游戏的主类,负责对游戏的主体全局进行控制,连接与指挥各个类的枢纽。

    PreView类:继承自JPanel类,作为操作面板类,负责安放主游戏窗口,积分板,级别控制按钮等窗口用以控制游戏进程。

    GameCanvas类:继承自JPanel类,ChangeBlockColor线程类动态改变画布类的方格颜色,画布类通过检查方格颜色来体现ChangeBlockColor方块的移动情况与消去状况。

    Box类:方格类,组成方块的基本元素,主要表达方式为颜色。

    Block类:作为操控方块的类,控制方块的移动,下落以及变形。

    5.1 游戏主界面显示模块
    游戏主界面采用Swing组件开发,并且向其注册监听器,以实现各种控制功能,综合游戏窗体的设计,其上至少需要注册三个监听器,分别是动作监听器(ActionListener)、键盘监听器(KeyListener)、选项监听器(ItemListener)。

    根据初步设计,可以确定客户端上所要用到的Swing组件对象有JFrame对象、JPanel对象,JLabel对象、JButton对象、JMenuBar对象、JMenu对象、JMenuItem对象、JTextField对象、JTextArea对象、JDialog对象等,至少十个Swing组件对象。下图5-1为游戏主界面截图。
    在这里插入图片描述

    图5-1游戏主界面截图

    本游戏主界面设计的初始颜色搭配基于对比鲜明的原则,默认背景色为深绿色,左上角设置俄罗斯方块图标,得分初始值为0,等级初始值为1,最高分记录初始值为0。游戏主窗体尺寸设置为(520,580),方块移动范围窗格由一个20行、12列的二维数组控制,且左上角图标设置为方块图案,起标识作用。

    5.2 画布、方块显示模块
    本游戏中将画布设计为自定义图片,可以根据自己的需求来自己动手更改背景图片,在方块下落过程中,根据颜色的变化识别下落的方块。

    5.2.1 背景画布模块设计
    该游戏的主背景画布是一个20行、12列的二维数组,方块显示是由相应颜色变化来标识,主窗体用颜色填充后可形成呈现出来背景样式和方块。本游戏用继承自JPanel的GameCanvas类控制背景画布的显示,用rows代表画布的行数,cols代表画布的列数,行数和列数决定着画布拥有方格的数目。背景画布主要实现代码如下:

    首先,用一个画布类的构造函数来表示整个主界面的行数、列数以及主界
    中的相对位置:

    画布类的构造函数
     * @param rows int, 画布的行数
     * @param cols int, 画布的列数
     * 行数和列数决定着画布拥有方格的数目
    
    public GameCanvas(int rows, int cols) {
    	this.rows = rows;
    	this.cols = cols;
    	this.setOpaque(false);
    	boxes = new Box[rows][cols];
    	for (int i = 0; i < boxes.length; i++) {
    		for (int j = 0; j < boxes[i].length; j++) {
    			boxes[i][j] = new Box(false);
    		}
    	}
    	setBounds(0, 0, 300, 500);//设置相对位置坐标
    	setBorder(new EtchedBorder(
    	        EtchedBorder.RAISED, Color.white, new Color(148, 145, 140)));
    }
    /**
     * 取得画布中方格的行数
     * @return int, 方格的行数
     */
    public int getRows() {
    	return rows;
    }
    
    /**
     * 取得画布中方格的列数
     * @return int, 方格的列数
     */
    public int getCols() {
    	return cols;
    }
    其次,在设置一个画布类的构造函数来表示整个主界面的前景色,背景色并获取其前景色和背景色:
    /**
     * 画布类的构造函数
     * @param rows 与public GameCanvas(int rows, int cols)同
     * @param cols 与public GameCanvas(int rows, int cols)同
     * @param backColor Color, 背景色
     * @param frontColor Color, 前景色
     */
    public GameCanvas(int rows, int cols,
                      Color backColor, Color frontColor) {
    	this(rows, cols);
    	this.backColor = backColor;
    	this.frontColor = frontColor;
    }
    
    /**
     * 设置游戏背景色彩
     * @param backColor Color, 背景色彩
     */
    public void setBackgroundColor(Color backColor) {
    	this.backColor = backColor;
    }
    
    /**
     * 取得游戏背景色彩
     * @return Color, 背景色彩
     */
    public Color getBackgroundColor() {
    	return backColor;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64

    5.2.2 预览方块模块设计
    方块和数据信息是游戏中最基本的功能模块。Box这个类方格类,是组成块的基本元素,用自己的颜色来表示块的外观 ,MyTask继承TimerTask类用来定时下落,用计数方式来实现速度的改变,MyListener类继承KeyAdapter类用来实现按键监听,控制方块的上下左右。定义一个4x4方阵,共16个小格。用“0”和“1”来表示每个方格是绘制新颜色还是保留底色。

    每得到一个新方块,都是随机从七种形态的方块中选取一种。游戏定义了一个变量,代表新方块的模型。比如定义int型数组STYLE代表28中方块类型,7行4列,每个元素代表其中一种方块。即0<=blockkindnum<=6,0=<blockstatusnum<=3
    那么,当方块落下需要得到新方块时,只需随机得到一对blockkindnum,blockstatusnum值,然后再根据这个STYLE的值构画相应的方块。剩下的问题就是应该怎么随机到一对STYLE行列值。

    Java语言包中的Math类提供了一个生成随机数的方法random(),调用这个方法会产生一个在0-1之间的双精度浮点数。所以每次要得到新方块时,只需调用一次这个方法,得到一个0-1的双精度浮点数,然后用该数乘以7,之后强转成整型,即可得到1—7的整数,用来控制行。用该数乘以4,之后强转成整型,即可得到1—4的整数,用来控制列。

    由此可以组合出多种图形定义然后用代码实现下列功能:
    1>每次执行首先为随机数产生不同的初值。
    int col = (int) (Math.random() * (gc.getCols() - 3));//随即位置生成列
    int style = Constant.STYLES[(int) (Math.random() * Block.get_addl())][(int) (Math.random() * 4)];
    在这里插入图片描述

    图5-2随机产生方块流程图

    2>随机选取一个图形,图5-2随机产生方块图具体描述用生成的随机数控
    产生的图形。

    3>当前图形在其4*4网格中的位置信息。
    绘制4行4列的方块预显方格,随机生成预显示的方块样式。本游戏用二维数组存储方块的28种样式。
    值得注意的是:在传统的俄罗斯方块游戏的基础上,本游戏系统为了体现出创新的思维,本着为了学习的原则,在传统游戏的基础上增加了中级三种其他的方块样式和高级三种其他的方块样式。一共有52种方块样式,具体的存储方式主要实现代码如下:

     分别对应对13种模型的52种状态
    
    	public final static int[][] STYLES = {// 共28种状态
    		{0xf000, 0x8888, 0xf000, 0x8888}, // 长条型的四种状态
    		{0x4e00, 0x4640, 0xe400, 0x4c40}, // 'T'型的四种状态
    		{0x4620, 0x6c00, 0x4620, 0x6c00}, // 反'Z'型的四种状态
    		{0x2640, 0xc600, 0x2640, 0xc600}, // 'Z'型的四种状态
    		{0x6220, 0x1700, 0x2230, 0x7400}, // '7'型的四种状态
    		{0x6440, 0xe200, 0x44c0, 0x8e00}, // 反'7'型的四种状态
    		{0x6600, 0x6600, 0x6600, 0x6600}, // 方块的四种状态
    		{0x8c88,0xf200,0x44c4,0x4f00},//增加的中级样式方块3个
    		{0xea00,0xc4c0,0xae00,0xc8c0},
    		{0x8c00,0xc800,0xc400,0x4c00},
    		{0xac00,0xcc40,0x6e00,0x8cc0},//增加的高级样式方块3个
    		{0x4e40,0x4e40,0x4e40,0x4e40},
    		{0x8480,0xa400,0x4840,0x4a00},
    	};
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    传统俄罗斯方块游戏的7种方块样式,相信很多人都知道,在这里就不一一截图展示常见的方块样式。以下是在传统游戏的模式下增加的三种中级难度和三种高级难度的方块模型:
    ●增加的三种中级难度方块模型(经过90度、180度、270度、360度旋得到四种转状态)
    在这里插入图片描述

    图5-10增加的三种中级难度方块模型
    ●增加的三种高级难度方块模型(经过90度、180度、270度、360度旋得到四种转状态)
    在这里插入图片描述

    图5-11增加的三种高级难度方块模型

    5.2.3 方块移动、旋转模块设计
    方块的翻转与移动比较容易实现,方块移动只需要改变方块的横坐标或纵坐标,然后重新绘制方块即可。方块翻转也只需要改变背景数组的值,重新绘制方块即可。

    本游戏方块下落时,进行动态绘制,实现Cloneable接口, 以指示 错误!超链接引用无效。 方法可以合法地对该类实例进行按字段复制。方块的操作类BlockOperation继承Thread类,重写run()方法,以实现方块的动态正确下落。当然,在线程中要判定方块是处于moving状态还是pausing状态。

    publicvoid run()
    	{
    		//moving判定方块是否在动态下落
    		while (moving)
    		{
    			try
    			{
    				//betweenleveltime指示相邻等级之间相差时间
    				sleep(betweenleveltime
    				        * (ControlMainGame.maxlevel - level + flatgene));
    			} catch (InterruptedException ie)
    			{
    				ie.printStackTrace();
    			}
    			//pausing判定游戏是否处于暂停状态
    			if (!pausing)
    				moving = (moveTo(y + 1, x) && moving);
    			//moving是在等待的100毫秒间,moving没被改变
    		}}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    当然,在游戏中还要判定方块移动的边界问题, 比如,一个方块在它左边正好差一个格子的空间才能够翻转,但是它的右边恰好有一个格子的空间,这种情况,如果方块不能够翻转,就不方便用户操作,如果能够翻转,就会发生越界,将已经存在的方块挤占掉。要想实现翻转又不发生越界,那么,就应该在方块翻转后把它往右边移动一个格子,然后再绘制方块,这样,方块就不会挤占掉其它已经固定住的方块了,以下解决越界问题。

    1>方块翻转判定
    在两种情况可能发生越界,一种是方块落下去固定住以后,第二种是周围的空间不允许它进行翻转。

    第一种情况只需要参考方块落下去后不能够再移动的判定即可。
    对于第二种情况,在每次方块翻转前,必须首先计算出方块周围的空间,如果空间允许则翻转。否则,不能翻转。

    因为七种方块是不规则的,每种方块要求的翻转空间都是不一样的,甚至是在它的不同翻转状态下,所要求的翻转空间也是不一样的,首先想到的自然就是为每一种方块,方块的每一种状态都写一个判定条件,但是这样做未免过于麻烦。

    根据观察,不难发现,七种形态的方块,长条形的方块如果以横条的形态下落,则只要能够下落,就能翻转,如果以竖条的形态下落,那么它翻转后所处的位置必须要有4x1个格子的空间才能够翻转。对于田字形的方块,只有能够继续下坠,就一定能够翻转,所以田字型的方块只要没有落下,就一直能够翻转。而其它五种形态的方块,又有一个共同点,就是它们都有两种翻转状态横向占三个格子的空间,竖直方向占两个空间,另外两种翻转状态横向占两个格子的空间,竖直方向占三个格子空间,如果他们是以横向占三个格子的状态下落,那么只要能下落,就一定能够翻转,如果是以横向两个格子的状态下落,那么在翻转后,周围必须要有3x2个格子的空间。

    所以,方块翻转的判定,要分三种情况,第一种情况是方块落下去后不能翻转;第二种情况是对竖直状态出现的长条形的方块进行翻转判定;第三种情况是对除长条形和田字形之外的其它五种以横向占两个格子的状态出现的方块进行翻转判定。

    何种情况下方块能够翻转的问题解决了,接下来,我们就应该解决方块翻转后所处的位置的问题了,因为只有事先知道方块翻转后所处的位置,才能够对那个位置的空间范围进行判定,判定它是否能够容纳方块。

    可以确定的是,无论方块怎么翻转,都处在方块数组中,也就是说方块必定是在游戏地图中某一4x4个格子的空间范围内。

    方块数组在游戏主界面中的坐标是确定的,不确定的是方块翻转后到底处在方块数组的哪个位置,为了解决这个问题,我们可以限定方块在方块数组中的存储原则是靠左、靠上,这样,无论翻转怎么翻转,方块数组中第一行和第一列都是有方块的,这样也就确定了方块在方块数组中的位置,也就可以得知方块翻转后在游戏地图中的位置了。

    假定方块数组的横纵坐标是x和y,那么,这个位置就是,长条形的方块翻转后所处的那一行是游戏地图的第y行,所占的列是第x到x+3列,长条形和田字形以外的五种方块翻转后的所占的行数是游戏地图的第y和第y+1行,所占的列是第x到x+2列。
    所以,如果以上空间有空格子,方块就能够翻转。

    2>翻转越界纠正
    只要方块翻转后所处的空间足够,方块就能够翻转,但是,如果方块翻转后所处的空间不足够,而在它的另一边却有足够的空间呢?

    方块在边界处时,翻转后不仅可能翻出地图外,还可能发生数组越界,当然,只需要将地图数组定义得大一些,就能够避免数组越界错误,对于方块越界,如果在它的另一边有足够空间,那么,就应该把方块往另一个方向移动适当的单位,纠正方块越界错误。如图5-12方块翻转流程图所示,方块翻转需要经三次判定:是否已经下落到底部、翻转后是否有足够空间、翻转后是否越界。

    在这里插入图片描述

    图5-12 方块翻转处理流程图

    玩家操作键盘实现方块的移动、旋转,代码引进ControlKeyListener类继承KeyAdapter类进行键盘监听功能的实现。KeyAdapter类继承自Object类,实现错误!超链接引用无效。接口,用来接收键盘事件的抽象适配器类。此类中的方法为空。此类存在的目的是方便创建侦听器对象。扩展此类即可创建 KeyEvent 侦听器并重写所需事件的方法,即是 ControlKeyListener类。

    使用ControlKeyListener可创建侦听器对象,然后使用组件的 addKeyListener 方法向该组件注册此侦听器对象。当按下、释放或键入某个键时,将调用该侦听器对象中的相应方法,并将 KeyEvent 传递给相应的方法。实现代码如下:

    privateclass ControlKeyListener extends KeyAdapter
    {
    	publicvoid keyPressed(KeyEvent ke)
    	{
    		if (!game.isPlaying()) 
    			return;
    
    		BlockOperation blockope = game.getCurBlock();
    		switch (ke.getKeyCode())
    		{
    			case KeyEvent.VK_DOWN:
    				blockope.moveDown();
    				break;
    			case KeyEvent.VK_LEFT:
    				blockope.moveLeft();
    				break;
    			case KeyEvent.VK_RIGHT:
    				blockope.moveRight();
    				break;
    			case KeyEvent.VK_UP:
    				blockope.turnNext();
    				break;
    			default:
    				break;}}}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    5.3 控制面版模块
    5.3.1 菜单栏模块设计
    菜单栏中有“游戏”、“帮助”四个菜单选项。“游戏”选项又分“开局”、“初级”、“中级”、“高级”、“自定义”、“方块颜色”、“退出”等七个选项。“帮助”选项中有“关于”选项,用于显示游戏版本等信息。
    1>“开局”的按钮功能为实现游戏画布的重新绘制,类似reset的功能。该按钮的监听实现代码如下:

    重置画布
    
    public void reset() {
    	for (int i = 0; i < boxes.length; i++) {
    		for (int j = 0; j < boxes[i].length; j++)
    			boxes[i][j].setColor(false);
    	}
    
    	repaint();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2>“初级”、“中级”、“高级”按钮用来手动调节游戏的等级,从而改变游戏的等级难度。 “退出”按钮控制游戏随时退出,终止游戏。

    3>“帮助”按钮中点击“关于”按钮显示与游戏软件本身相关信息

    5.3.2 控制面板按钮设计
    本游戏控制面板中包含得分统计、等级统计等字段。
    其中的TextField控件均由游戏本身统计给出,玩家不能私自编辑。本游戏的游戏规则为每消一行得10分,每增加100分上升一个等级,初始得分为0,初始等级为1。

    以下给出得分、等级更新等功能实现的主要代码:

    	 判断是否满行,满行则调用消行方法。
    
    	private void isFullLine() {
    		// TODO Auto-generated method stub
    
    		for (int i = 0; i < 20; i++) {
    			int row = 0;
    			boolean flag = true;
    			for (int j = 0; j < 12; j++) {
    				if (!gc.getBox(i, j).isColorBox()) {
    					flag = false;
    					break;
    				}
    			}
    
    			if (flag == true) {
    				row = i;
    				gc.delete(row);//删除行
    				if(isMusic==true)
    				{mp.playEraseSound();}
    				addScor();//增加分数
    				if(scor%100==0)//设置为100分增加一个等级
    				upspeed=true;//将速度增加标志位至为true
    				if(upspeed==true)
    					upLevel();
    			}
    		}
    
    	}
    
    	/**
    	 * 得分的计算方法
    	 */
    	private void addScor() {
    		scor=scor+10;
    		jt9.setText("得分:"+MyFrame.scor);
    	}
    
    }
    private void reset() {
    	scor=0;
    	rank=0;
    	jt10.setText("等级:"+rank);
    	jt9.setText("得分:"+scor);
    	upspeed=false;
    	playing=true;
    	runstop=false;
    	gc.setGameOver(false);
    	gc.repaint();
    	gc.reset();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    控制面板中按钮的功能在4.3.1中已给出代码,在此不再赘述。

    6 系统的测试运行
    6.1 测试概述
    省略

    6.1.1 测试原则
    省略

    6.1.2 测试方法
    为了全方位的测试系统,找出系统中存在的问题和故障,使用多种测试方法一起测试,可以更加全面的总结出系统设计的优缺点。采用的测试方法有以下几个:

    功能测试:测试系统中各个功能模块下的功能点是否可以正常使用;
    手动测试:主要测试输入、点击等各项功能;
    黑盒测试:输入后查看得出的结果是否正确。
    恢复测试:恢复测试作为系统测试,主要关注导致软件运行失败的各种条件,并验证恢复过程可以正常实施。

    省略

    6.1.3 测试意义及注意事项
    省略

    6.2 游戏代码、算法的测试
    1>写get()方法时需要有返回值,但是程序中没有写return语句,使程序在编译时出现错误。解决方法是,在方法中加入return语句,返回相应的内容即可。

    2>使用随机函数产生方块时没有给各个方块传入参数,编译不能通过。解决方法是,根据各个方块的构造传入相应的参数。

    3>写T字形方块各方格的默认位置时,将控制方块位置的变量i,初始化为0,运行的结果是丁字形方块默认成了竖形方块。解决方法是,将变量i的初始化数值改为1,即可达到设计的效果。

    4>运行程序时,统计的分数只是每一次消除满行后的分数,而以前的分数就会被覆盖,没有累计。解决方法是,将程序中的

    5>算法流程的错误主要集中在如何检测及消去方块,还有如何在通关之后对分数的累加进行处理,是否升级的判定这些方面,经过与同学的讨论以及参考资料,都最终得到了解决。

    6.3 游戏界面菜单选项的功能测试
    1>“游戏”菜单测试

    表6.1游戏菜单测试用例
    在这里插入图片描述
    在这里插入图片描述

    2>“帮助”菜单测试
    表6.2 “帮助”菜单测试用例
    在这里插入图片描述

    6.4 按键事件的功能测试
    表6.3按键事件功能测试用例
    在这里插入图片描述

    6.5 方块的堆砌与消行功能测试
    表6.4 方块的堆砌与消行功能测试用例
    在这里插入图片描述

    6.6 测试结果
    经过多种测试方法对系统各个方面、功能的测试多次测试,测试结果表明系统基本符合的整体设计要求,预期功能基本完成。系统基本可满足设计开发之初的要求,测试结束。不过整体功能还不够强大,创新方面做的稍微逊色,作为开发的第一个版本,游戏在功能、界面设计等很多方面还需要进一步完善。

    结 论
    省略

    参考文献
    [1] 李刚,疯狂Java讲义(第3版),北京:电子工业大学出版社,2014.7
    [2] 明日科技,Java从入门到精通(第4版),北京:清华大学出版社,2016(2017.1重印)
    [3] 荣钦科技 Java2游戏设计.清华大学出版社,2004.
    [4] 高凌琴 陈青华.俄罗斯方块游戏关键技术探讨[J].信息技术与信息化讨,2008年第二期
    [5] 艾克尔.Java编程思想[M].北京:机械工业出版社,2005.2
    [6] (美) Paul Hyde.Java线程编程[M].北京:人们邮电出版社,2003
    [7] Martin dejode.Symbian OS J2ME[M].北京:人民邮电出版社,2005.10
    [8] 朱福喜. Java程序设计技巧与开发实例[M].北京:人民邮电出版社,2004.2
    [9] 袁海燕 王文涛.Java实用程序设计100例[M].北京:人民邮电出版社,2005.2:51~96
    [10] 黄复贤.俄罗斯方块游戏的敏捷设计与开发[J]. 电脑编程技巧与维护,2005.4
    [11] (美)Bill Venners.深入Java虚拟机[M].北京:机械工业出版社,2003.9.63~98
    [12] 闻怡洋.J2ME MIDP 1.0/2.0无线设备编程指南[M].北京:北京大学出版社,2004.5:393~420
    [13]赵东跃.俄罗斯方块编程[J].电脑编程技巧与维护,1998年第六期
    [14]殷兆麟.Java网络编程基础[M].北京:北方交通大学出版社,2004
    [15] (美)John Zukowski.Java 2 从入门到精通[M].北京:电子工业出版社,1999
    [16] 宋波.Java应用开发教程[M].北京:电子工业出版社,2002
    [17] 托普雷.J2ME技术手册[M].北京:中国电力出版社,2004.6:259~312

    致 谢
    省略

    附录A 外文原文
    省略

    附录B 外文翻译
    省略


    5、源码下载:

    本项目源码及论文如下,有需要的朋友可以点击进行下载

  • 相关阅读:
    this.$nextTick()的使用场景
    HPC、AI与云计算:当智能时代三叉戟在亚马逊云科技完美融合
    2022年最新java之异常
    达尔优EK87键盘说明书
    初步探索 superset新增导出excel功能
    第2-4-7章 docker安装WorkBench-规则引擎Drools-业务规则管理系统-组件化-中台
    K8S篇之简述K8S底层原理
    PAT乙级-B1011 A+B 和 C(15)
    企业架构LNMP学习笔记25
    K8s之DashBoard
  • 原文地址:https://blog.csdn.net/m0_66238867/article/details/125422858