俄罗斯方块单人游戏的实现

上传人:无*** 文档编号:44683905 上传时间:2021-12-05 格式:DOC 页数:43 大小:702KB
收藏 版权申诉 举报 下载
俄罗斯方块单人游戏的实现_第1页
第1页 / 共43页
俄罗斯方块单人游戏的实现_第2页
第2页 / 共43页
俄罗斯方块单人游戏的实现_第3页
第3页 / 共43页
资源描述:

《俄罗斯方块单人游戏的实现》由会员分享,可在线阅读,更多相关《俄罗斯方块单人游戏的实现(43页珍藏版)》请在装配图网上搜索。

1、哈尔滨理工大学专科生毕业论文 哈 尔 滨 理 工 大 学毕 业 设 计题 目: 俄罗斯方块单人游戏的实现 院 、系: 软件工程系 姓 名: 指导教师: 系 主 任: 2012 年 06 月 20 日 1俄罗斯方块单人游戏的实现摘 要论文描述了电脑游戏的发展现状,和开发此游戏的意义。遵循软件工程的知识,从软件问题定义开始,接着进行了主要功能的描述、实现原理的分析、详细设计,最后对软件进行了测试,整个开发过程贯穿软件工程的知识体系。此次设计在Microsoft Windows XP系统下,以Java为开发语言,在Eclipse开发平台上进行游戏的设计与实践。本游戏开发的总体任务就是实现游戏的可操作

2、性,以及界面的简单清晰性。整个开发过程遵循软件工程规范,采用JAVA GUI编程来实现界面以及事件的控制,用户根据键盘的四个方向键控制翻转、向左、向右和向下操作,通过菜单栏中的相应菜单选项实现游戏的开始、结束、变换方块、积分以及等级的功能。由于知识以及能力的限制,本游戏所实现的功能不够强大,可对本游戏进行改善,从而增强游戏的功能。通过研究分析俄罗斯方块所具备的能力及实现的方法、确定主体结构。利用现阶段我所能达到的能力,以最简洁、最容易的办法,边开发边测试边修改,实现一个初级游戏软件。关键词 电脑游戏;俄罗斯方块游戏;Java语言Single game of TetrisAbstractThe

3、paper describes the development status of the computer game, and the development of the significance of this game. Follow the knowledge of software engineering, start from the definition of a software problem, followed by a description of the main functions of the principle of analysis, detailed des

4、ign, the final test of the software throughout the development process throughout the software engineering body of knowledge. The design of the Microsoft Windows XP systems, the Java development language, game design and practice in the Eclipse development platform.The development of the overall mis

5、sion of this game is to achieve operability of the game, as well as clear and simple interface. Throughout the development process follows the software engineering specifications, using JAVA GUI programming interface and control of events, according to the four directions of the keyboard keys to con

6、trol flip, left, right and down operation, selected through the menu bar of the corresponding menuthe game start, end, transform the box score and level of functionality. Knowledge and capacity constraints, this game is not powerful enough, you can make improvements to the game, thereby enhancing th

7、e functionality of the game. Through research and analysis capability of Tetris and to determine the main structure. With my best ability to achieve at this stage, the most concise, easiest way to edge development side of the test side to modify a primary game software.Keywords Computer game;Tetris

8、game;Java language目录摘 要IAbstractII第1章 绪论11.1 电脑游戏的发展现状11.2 开发意义2第2章 主要功能的描述32.1 游戏的主要功能32.2 Java GUI功能32.3 多线程的功能4第3章 实现的原理53.1 Java GUI实验原理53.1.1基本窗口类53.1.2原子构件73.1.3菜单类83.1.4事件处理93.1.5布局管理103.1.6图形类与图形的绘制113.2 Java多线程机制11第4章 设计的方案及实现124.1设计方案124.1.1游戏界面设计124.1.2游戏控制设计124.1.3基本类设计124.2 程序实现174.2.1菜

9、单类的实现174.2.2方格类的实现184.2.3方块类的实现184.2.4主类的实现184.2.5控制面板类的实现194.2.6游戏画布类的实现19第5章 测试205.1 菜单界面测试205.2 功能测试235.3 测试总结27结论28致谢30参考文献32附录3337第1章 绪论1.1 电脑游戏的发展现状游戏在一般人眼中应该是休闲娱乐的东西,尤其电脑游戏更为如此,在传统观念理念上,电脑游戏应该是小孩子玩的东西,成年人再玩的话无非是玩物丧志,但是时代发展如此迅速的当代,这个理念必须要有所改变,中国的游戏事业在全世界起步还算早,但是由于种种原因发展不是十分迅速,在成效上看来并不十分乐观。电脑游戏

10、是一种新兴的文化现象,也是一个新型的朝阳企业。作为这么文化类别的后来者,我们与发达国家、发达地区相比,无论是理论、开发、研究还是投入等方面仍有一段不算小的距离,但当务之急需要解决的,也许还不仅仅是上述问题,游戏开发者们对所从事的这项工作的敬业态度,与自省、自重可能比玩家口袋里的银子还要可贵得多。与单机游戏日益衰落正相反的是,网络游戏方兴未艾,遍地开花。国内网络游戏开发、制造商也有非常成功的,比如,九城、盛大、网易、金山、久游等等。但是,与此同时,我们也看到了,在繁荣的背后,潜在的商机,一是来自国内游戏制作者在是做理念上的不足和困乏,另外就是资金问题。这两方面与欧美的制作距离很大,随着魔兽世界的

11、成功代理,接踵而来的是更多高品质,高水准,高制作的国外网络游戏进入中国,最近,“九域”即将代理的奇迹世界,卓越之剑,公会战争三款大制作,都是目前在欧美顶级的作品,这无疑对国产网络游戏带来巨大竞争压力和市场的威胁。如果国内制作游戏商还停留在纷纷推出所谓的“免费”游戏而实际上是在变相收费的运营层面上,无疑是作茧自缚,相当于自己在毁掉已取得的成绩。中国的游戏发展缓慢的原因有很多种,例如盗版的横行,开发游戏人员的创新意识不强,守旧的思想风靡等等。例如现在PC游戏的行情就不十分景气。因此我觉得创新方面还有很多改进的余地和改进的方面:1、着眼于品质:看到台湾一个电玩节目,里面就回顾了DOS版的仙剑,这款游

12、戏在全亚洲都很流行,可悲的是,这十几年来,我们只有这一款。2、低价化:当年暴雪很有想法的把魔兽争霸3交给中国的奥美科技,推出只有20元的低价正版还能享受BATTLENET,何乐而不为呢。3、开阔眼界:腾讯官方统计QQ农场最高日在线人数达到1600万,而植物大战僵尸仅一家游戏网站,中英版本合计下载数量可达到近百万。这可是说是将WOW、DNF、CSOL等大众网络游戏远远地抛在了后面,这不能不说明一个问题,这两款游戏是非常成功的。他们凭借的创新的思维简单的操作等方面吸引玩家。这也是游戏公司成功的案例,值得很多同样的网络游戏公司所借鉴。相信中国游戏的发展,是会有很光明的未来的。这在于我们这代的程序设计

13、人员的创新与努力,我们已经有很好的技术支持了,加上优秀的思想定然会有很高的前景的1。1.2 开发意义在现金电子信息高速发展的时代,电子游戏已深入人们的日常生活,由于经典有趣,因而得到了广泛的流行,成为老少皆宜的娱乐方式。俄罗斯方块是一款风靡全球的游戏,最初是由苏联人制作的,规则简单,容易上手且游戏全过程变化无穷,可以让玩家充分感受游戏中的乐趣。俄罗斯方块游戏可以说是随计算机的发展而发展,并不断推陈出新演变出各种类似游戏, 深受广大玩家喜爱。这个游戏有的简单, 有的复杂, 但其根本原理是一样的都是对运动的方块进行组合, 来训练玩家的反应能力。谈到游戏软件, 大多数人都认为其神妙莫测, 高不可及。

14、而一般游戏软件也确实具有很高的技术难度, 随着开发工具及软件开发方法学的不断发展, 动手开发游戏也不是十分困难的。俄罗斯方块游游戏软件不计其数, 网上就有好多关于实现的复杂算法和设计, 其难度让一般初学者望而却步。而俄罗斯方块是编程的入门项目,它可以检验编辑人员的知识熟练程度。在游戏设计方面,俄罗斯方块游戏的设计工作既复杂又富有挑战性,它包含的内容多,涉及的知识广泛,与图形界面联系比较大。在设计过程中必将涉及到各个方面的知识,这对于JAVA设计者而言,是个很好的锻炼机会2。 游戏是一种新兴的媒体,是一种新的设计领域,也是一种新的艺术形式。同时开发电脑游戏可以提高学生研究和学习的兴趣,培养他们通

15、过互联网收集和获得信息、分析整理信息、撰写报告论文等能力。俄罗斯方块的开发无疑是给电脑游戏的增加了色彩,拓宽了电脑游戏的平台,给人们带来乐趣。第2章 主要功能的描述2.1 游戏的主要功能游戏开发至今已经有30多年,在这个短暂的时期里,随着硬件水平的提高,游戏开发新技术层出不穷,经典游戏比比皆是。俄罗斯方块是一个非常复杂但是比较有趣并且耐玩的,也是大家比较熟悉的单击小游戏。游戏中共有7种方块,每种方块由4个方格组成。这7种方块可以旋转90度、180度、270度,因此每种方块有4种状态,7种方块总共有28种状态。28种状态的方块随机产生,自由下落,落下时可由玩家用上、下、左、右控制键控制翻转和移动

16、,以便以玩家所需要的形态和位置落下。如果落下时,方块的方格能填满某一行,则这一行可消去。消去一行后,游戏可给玩家加分,若由存在空格的方块填满整个窗口,则游戏失败。游戏功能需求如下:游戏界面需求:设计良好的游戏界面可以让玩家充分感受到游戏带来的娱乐性,游戏的背景色和方块的颜色都在设计之内,在一定的区域内运动和变形,落下后的障碍物用黄色显示,这样看起来会有一定的美感。游戏形状需求:用数组作为存储方块28种状态的数据结构,即长条形、Z字形、反Z形、田字形、7字形、反7形、T字型,各个方块要能实现它的变形,可设为顺时针或逆时针变形,一般为逆时针。处理事件需求:方块下落时,可通过键盘方向键(上、下、左、

17、右键)对该方块进行向上(变形),向下(加速)、向左、向右移动。显示需求:当不同的方块填满一行时可以消行,剩余方块向下移动并统计分数。当达到一定分数的时候,会增加相应的等级。2.2 Java GUI功能利用Java实现的俄罗斯方块游戏几乎能用到Java GUI(Graphical User Interface)的所有方面,其中包括Sun公司为Java提供的两个图形界面类库。1、AWT(Abstract Windowing Toolkit),中文译为抽象窗口工具包,AWT是Sun公司最早推出的GUI类库,其中提供了建立和设置Java的图形用户界面的基本工具。AWT由Java中的java.awt包提

18、供,里面包含了许多可用来建立与平台无关的图形用户界面(GUI)的类,这些类被称为构件(Components)。2、Swing包是Java Foundation Classes(JFC)的一部分,与AWT的重量级构件不同,Swing中大部分是轻量级构件。正是这个原因,Swing几乎无所不能,不但有各式各样先进的构件,而且更为美观易用。所以一开始使用AWT的程序员很快就转向使用Swing了。本设计中俄罗斯方块的实现的界面,主要是采用了Swing类库。(1) 本游戏的基本窗口类包括JFrame、JWindow、JPanel和JDialog等。(2)在这里原子构件会用到标签类JLabel、按钮类JBu

19、tton、JColorChooser类文本域JTextField。(3)对一个大的GUI程序而言通常包含各种菜单,俄罗斯方块游戏中也包含许多种菜单,如JMenu、JMenuItem、JMenuBar等.(4)俄罗斯方块中的处理事件一般会用到ActionEvent类、ActionListener类、KeyEvent类、KeyEvent类、KeyListener接口、KeyAdapter类。(5)俄罗斯方块的主界面采用的是BorderLayout布局。BorderLayout由5个区域来放置构件,分别标记为North、South、East、West和Center。用add方法加入构件时要用一个标记

20、来指定构件放到5个区域中的哪一个。(6)使用Graphics类提供的绘图方法“public void paint(Graphics g)”可以画出线条、矩形、圆形等图形3。2.3 多线程的功能俄罗斯方块游戏的实现充分利用了Java的线程功能。由于游戏中方块的动态性,每个方块有一定的生命周期,所以选用线程来实现方块。一个方块用一个线程类对象实现,该类继承于Thread类,当一个方块出现时也就表示一个线程对象产生并开始运行。通过对键盘消息的响应,实现移动、下落、变形等操作。 在Java中可通过run()方法为线程指明要完成的任务,用继承Thread类并覆盖run方法和通过实现Runnable接口的

21、类调用run()方法这两种技术为线程提供run()方法4。第3章 实现的原理游戏块的运行采用多线程(Thread)机制,界面利用JavaSwing提供的图形类实现。游戏采用开源开发环境Eclipse。在整个游戏的开发过程中涉及了Java基本知识的大部分内容。3.1 Java GUI实验原理3.1.1基本窗口类 图形用户界面的程序效果类似于Windows系统下运行的程序。在俄罗斯方块游戏中用到JFrame、JWindow、JPanel和JDialog等几种窗口类: 1、JFrame类JFrame类与Frame类略微不兼容。与其他所有JFC/Swing顶层容器一样,JFrame包含一个JRootP

22、ane作为其唯一的子容器,即ContentPane,该内容面板直接或间接地容纳其他可视构件。为了方便地使用add方法及add方法的其他版本,JFrame类重写了remove和setLayout方法。ContentPane始终一直都是是非NULL的。若试图将其设置为NULL会导致JFrame抛出异常。默认的内容窗格上会设置有BorderLayout管理器。与Frame不同,当用户试图关闭窗口时JFrame知道如何进行响应。用户关闭窗口时默认的行为仅仅是简单地隐藏JFrame。若要更改默认的行为可调用方法setDefaultCloseOperation(int)。JFrame类的构造方法有如下几个

23、版本。JFrame():构造一个初始时不可见的新窗口;JFrame(String title):创建一个新的、初始不可见的、具体指定标题的JFrame;JFrame(GraphicsConfigurationgc):以屏幕设备的指定GraphicsConfiguration和空白标题创建一个JFrame;JFrame(String title,GraphicsConfiguration gc):创建一个具体的指定标题和指定屏幕设备的GraphicsConfiguration 的 JFrame。2、JWindow类JWindow类继承于Window类。Window类表示一个没有边界和菜单的最高层

24、的窗口,默认的是使用BoederLayout布局,在这个布局中可以包含AWT的其他构件。窗口初始化时也是不可见的。一个基本的GUI程序应该能够在屏幕上显示信息,而且至少要包含一个GUI构件使得用户能够轻松地响应用户的要求,这就需要用到事件响应类。3、JPanel类JPanel类的构造方法有如下几个版本:(1)Jpanel():创建具有双缓冲和流布局的Jpanel。(2)Jpanel(boolean isDoubleBuffered):创建具有FlowLayout布局和指定缓冲策略的Jpanel。(3)Jpanel(LayoutManager layout):创建具有指定布局管理器的Jpanel

25、。(4)Jpanel(LayoutManager layout,boolean isDoubleBuffered):创建具有指定布局管理器和缓冲策略的Jpanel。4、JDialog类Dialog类具有两种类型的对话窗口:(1)模态对话框(Modal Dialog):这种对话框阻塞它的父对象的输入,并且必须在它的父对象再次获得输入之前被关闭或自动消失。(2)非模态对话框(Non-modal Dialog):这种对话框并不阻塞它的父对象的输入,它可以与父对象并存,除非特别声明,否则一般的对话框是非模态的。JDialog类也分为模态和非模态的,并且只能在Dialog和Frame的基础上创建。若用J

26、Dialog作为对话框,则必须实现对话框中的每一个构件。可利用JOptionPane类显示一段文字或作一些选择,它包括一些静态方法showxxxDialog,并可产生4种简单的对话框。JDialog类的构造方法有如下几个版本:(1)JDialog():创建一个没有标题并且没有指定Frame拥有者的无模式对话框。(2)JDialog(Dialog owner):创建一个没有标题但将指定的Dialog作为其拥有者的无模式对话框。(3)JDialog(Dialog owner,boolean modal):创建一个具有指定拥有者和模式的对话框。(4)JDialog(Dialog owner,Stri

27、ng title):创建一个具有指定标题和指定拥有者的无模式对话框。(5)JDialog(Dialog owner,String title,boolean modal):创建一个具有指定标题、模式和指定拥有者的对话框。JDialog的构造方法还具有将上述方法中的owner的对象的类型改为JFrame和JWindow的相应各个版本:(1)JDialog(Frame owner):创建一个没有标题但将指定的Frame作为其拥有者的无模式对话框。(2)JDialog(Window owner):创建一个具体指定的Window类型的拥有者和空标题的无模式对话框5。3.1.2原子构件俄罗斯方块游戏中用

28、到的原子构件很多,这些构件的用法比较简单,下面对俄罗斯方块游戏中用到的原子构件进行简单介绍:1、标签类JLabelJLabel类的构造方法有如下几个版本:(1)JLabel():创建无图像并且其标题为空字符的JLabel。(2)JLabel(Icon image):创建具有指定图像的JLabel实例。(3)JLabel(Icon image,int horizontalAlignment):创建具有指定图像和水平对齐方式的JLabel实例。(4)JLabel(String text):创建具有指定文本的JLabel实例。(5)JlabelI(String text,Icon icon,int

29、horizontalAlignment):创建具有指定文本、图像和水平对齐方式的JLabel实例。(6)JLabel(String text,int horizontalAlignment)创建具有指定文本和水平对齐方式的JLabel实例6。2、按钮类JButtonJButton类的构造方法具有如下5个版本:(1) JButton();创建不带有设置文本或图标的按钮。(2) JButton(Action a):创建一个按钮,其属性从所提供的Action对象中获取。(3) JButton(Icon icon):创建一个带图标的按钮。(4) JButton(String text):创建一个带文本

30、的按钮。(5) JButton(String text,Icon icon):创建一个带初始文本和图标的按钮。3、JColorChooser类三个级别的API:(1)显示具有模式颜色选择器的对话框并返回用户所选的静态方法。(2)创建颜色选择器对话框的静态方法,可以指定当用户按下其中一个对话框按钮时要调用的ActionListener。(3)能直接在任何容器中创建JColorChooser窗格实例。可以添加PropertyChange监听器以检测当前“颜色”属性何时更改。JcolorChooser类的构造方法有如下三个版本: JcolorChooser():创建初始颜色为白色的颜色选择器窗格;

31、JcolorChooser(Color initialColor):创建具有指定初始颜色的颜色选择器窗格;JcolorChooser(ColorSelectionModel model):创建具有指定ColorSelection -Model的颜色选择器窗格。4、文本域JTextFieldJTextField是JTextComponent类的一个子类,JTextComponent类又是JComponent的一个子类。JTextField与java.awt.TextField应具有源代码兼容性,当光标移动到文本域并且按回车键时,它触发一个ActionEvent事件。JTextField类构造方法

32、有如下4个版本:(1)JTextField():构造一个TextField对象。(2)JTextField(Document doc,String text,int columns):构造一个JTextField,它使用给定的文本存储模型和给定的列数。(3)JTextField(String text)构造一个指定文本初始化的TextField。(4)JTextField(String text,int columns):构造一个用指定文本和列初始化的TextField。3.1.3菜单类 菜单类包括:1、JMenu一个菜单(JMenu)由多个菜单项组成并具有一个标题,这个标题出现在菜单条上,当

33、单击这个标题时这些菜单项立即弹出。选择一个菜单项就可以引起一个动作事件。多个菜单又可以组合成一个新的菜单或菜单条,增加在最顶层的窗口(Frame或JFrame)上。菜单的实现是一个包含JMenuItem的弹出窗口,用户选择JMenuBar上的项时会显示该JMenuItem。除JMenuItem之外,JMenu还可以包含JSeparator。菜单在本质上是带有关联JPopupMenu的按钮。当单击按钮时就会显示JPopupMenu。如果按钮位于JMenuBar上则该菜单为顶层窗口。如果按钮时另一个菜单项,则JPopupMenu就是右拉菜单。菜单中的菜单项也可以是菜单,可使用它自身的add方法来增

34、加菜单项或菜单对象。2、JMenuItem菜单项在本质上是位于列表中的按钮。当用户单击按钮时则执行与菜单项关联的操作。3、JMenuBar一个菜单条可包含多个菜单,通过add方法可增加这些菜单对象。菜单条可通过JFrame的setJMenuBar方法加入到一个JFrame中。将JMenu对象添加到菜单条以构造菜单。当用户选择JMenu对象时就会显示其关联的JPopupMenu,并允许用户选择其上的某一个JMenuItem对象。3.1.4事件处理 大多数的Java程序通过GUI构件(例按钮、窗口、菜单等)与用户进行交互,俄罗斯方块游戏也是如此。俄罗斯方块游戏与用户最重要的交互活动是用户通过键盘来

35、控制游戏、通过按钮和菜单来设置游戏。前者在Java中表现为键盘事件,后者变现为动作时间。在Java中事件由分层的事件类表示,而接口则描述了对特定事件响应的方法。想要处理这些事件的类就必须实现一个或多个接口以及这些接口中的方法。下面就讨论表示这两种事件的Java类和相应的监听和处理接口:1、ActionEvent类产生事件的构件称为事件源,每个事件源可以产生多个特定类型的事件,这些事件可进入到系统级事件队列中。构件可以注册监听这些事件的监听接口,并且必须实现该接口特定的方法以响应来自事件源的事件。只有那些已注册事件监听的构件所产生的事件才能传给Java虚拟机。如果一个事件源注册了多个监听接口,那

36、么每个监听接口都会接收到原始事件发送的信息。2、ActionListener类接口用来说明一些抽象方法,然后由类来实现这些方法。ActionListener是javaAwtevent包中的一个接口,它定义了事件的处理方法actionPerformed。一个实现ActionListener的类必须包含一个actionPerformed方法。为了保持这个方法的简单性,在ifelseif语句的相应分支内部将事件交给一些相应处理模块来完成。如果某个处理方法对其他类是有用的并且不会产生副作用,则应使其成为public方法:一个动作事件的监听与处理可以使用如下规则:(1)声明一个ActionListene

37、r类型的Listener变量并存储监听接口的引用。(2)使用某个构件的addActionListener方法将listener设置为监听者。 (3)创建(或用户的交互行为产生)一个action事件,然后调用listener的ationPerformed方法。在俄罗斯方块游戏中产生动作事件的构件有菜单项和按钮。这两个事件源上的监听者都是通过匿名类产生的,并且在增加监听者(addActionListener)的同时生成(new)监听者对象,而这个匿名类主要是定义了相应actionPerformed方法。该监听者对象直接绑定到事件源上之后就可以监听该构件上的事件。有三个典型的菜单项和按钮的处理方式(

38、见附录)。3、KeyEvent类对于按下键和释放键事件,getKeyCode方法将返回事件的KeyCode。对于键入事件,getKeyCode方法将返回VK_UNDEFINED。按下键和释放键事件是低级别事件,依赖于平台和键盘布局。只要按下或释放键就会生成该事件,它们是发现不生成字符输入键(如动作键、修改键等)的唯一方式。通过getKeyCode方法可指出按下或释放的键,该方法返回一个虚拟键码。按下和释放键盘上的键会导致(依次)生成以下键事件:(1)KEY_PRESSED(2)KEY_TYPED(只在可生成有效Unicode字符时产生)。(3)KEY_RELEASED。但在某些情况下(例如在激

39、活自动重复或输入方法时),该顺序可能会有所不同(并且与平台有关)。4、KeyListener接口KeyListener包含的主要抽象方法如下:(1)void keyPressed(KeyEvent e):按下某个键时调用此方法。(2)void keyPeleased(KeyEvent e):释放某个键时调用此方法。(3)void keyTyped(KeyEvent e):键入某个键时调用此方法。5、KeyAdapter类使用扩展KeyAdapter的类创建监听器对象,然后使用组建的addKeyListener方法向该组件注册此监听器对象。当按下、释放或键入某个键时将调用监听器对象中的相应方法,

40、并将KeyEvent传递给它。俄罗斯方块游戏就是以这种方式实现游戏的按钮控制键的监听器,如下代码定义了ControlKeylListener类:private class ControlKeyListener extends KeyAdapter 。然后可在该类中实现KeyAdapter的方法7。3.1.5布局管理 Java使用布局管理起来管理版面布局。布局管理器按照布局说明选择构件的最佳位置,保证布局的总体外观在不同的操作系统下与Java程序的描述保持一致。在游戏中用到的三个布局管理器,如表3-1所示。 表 3-1 AWT的三个常用布局管理器布局管理器 描述FlowLayout在这种布局下a

41、dd方法按照构件的顺序将构件从左到右加到一行中。每个构件按照需占据的一定的空间,一行放不下时要换行,每行构件均居中排列GrilLayout将构件放在一个多行多列的表格中。表格中每个单元格大小相同,单元格的大小有最大的构件所决定,用add方法将构件一行一行地从左至右加入到布局的每个单元格中BorderLayout由5个区域来放置构件,分别标记为North、South、East、West和Center。用add方法加入构件时要用一个标记来指定构件放到5个区域中的哪一个内3.1.6图形类与图形的绘制 由于Frame类继承于Component类,所以可以通过覆盖所继承的paint方法来进行绘图。还有一

42、种很流行的绘图方法,即创建一个单独的类,这个类继承于Canvas类并且覆盖paint方法。俄罗斯方块游戏采用的是继承于Canvas类的方式。Canvas继承于Component类,并继承了它的paint(Graphics g)、update(Graphics g)以及repaint()方法。Cavas作为图形对象时,自动调用repaint方法进行更新。在repaint中需要调用update方法,update方法在清除屏幕后再调用paint方法。使用Cavas作为绘图工具时首先创建一个继承于Cavas类并且覆盖paint方法,再将这个类作为一个成员加入到类似于Frame或Applet的类中,用某

43、种布局管理器对其进行定位8。3.2 Java多线程机制在游戏过程中需要对玩家的控制进行实时处理,这就涉及到了Java的一个重要的特性:多线程。在此就不做介绍了。第4章 设计的方案及实现4.1设计方案4.1.1游戏界面设计俄罗斯方块的游戏界面分为两个窗口,即Canvas和Panel。这两个窗口并列,但所占的宽度比例不一样。两个窗口之上是菜单条。1、菜单的设计为了方便运行,本设计将俄罗斯方块游戏的菜单系统去掉每个菜单项的具体功能,仅保留菜单的框架和退出功能。它的菜单项没有实际功能。2、游戏块的设计游戏块是俄罗斯方块游戏的最基本元素。设计思路为:利用Java中提供的图形类对象并对着色来实现游戏块。首

44、先定义一个类ErsBox来表示一个游戏单元方格,然后定义一个游戏方块,该游戏方块由4*4个ErsBox单元格组成,定义4*4的游戏方块是为了便于实现前面提到的7种不同的俄罗斯方块,因为7种俄罗斯方块的旋转变化恰好都在长、宽各4个单元格之内。通过着色方式可轻松实现方块的28种不同的形态,并对后续的游戏运行控制提供便利。3、游戏画布的设计游戏画布是游戏的背景窗口,方块的运动、变形都在画布中进行,画布的大小为20*12个ErsBox单元格。另外,游戏画布还要响应键盘消息。4、控制面板的设计游戏的控制面板是整个游戏的框架,其中包括游戏画布、菜单、游戏提示面板(提示下一个方块信息)、控制按钮(控制游戏的

45、开始,使菜单生效)等9。4.1.2游戏控制设计游戏中的方块采用线程实现,一个方块由4*4个ErsBox单元格构成,它可以由键盘控制移动、下落、变形等。游戏控制由两个主要的Thread完成。4.1.3基本类设计1、方格类ErsBox实现Cloneable接口后,使用Object.clone()在一个类的实例之间进行域对域的复制。如果没有实现这个接口又调用了Object的clone()方法将会抛出CloneNotSupportedException异常。通常的作法是:一个类在实现Cloneable的接口的同时用一个public类型的方法覆盖Object.clone()方法(Object.clone

46、()在Object中定义为protected类型)10。在ErsBox类设计中,其主要成员变量和成员方法的说明如表4-1和表4-2所示: 表4-1 Ersbox类主要成员变量名称类型说明isColorBoolean标志方块着色方案,true为前景色,false为背景色sizeDimension方格大小 表4-2 ErsBox类主要成员方法名称返回类型说明ErsBox(boolean isColor) 无方格类的构造方法 isColorBox()Boolean判断方格是不是用前景色表现,返回true表示用前景色着色,false用背景色着色 setColor(boolean isColor)无设置

47、方格的颜色 getSizeDimension 得到此方格的大小Clone()Object 覆盖的Object 的Object clone()从而实现克隆方格类中用一个Dismension对象表示一个方格的大小,另外方格类还使用了两个与Dismension类有关的方法,分别用来获得和设置方格的大小。Dismension类封装了一个构件的高度和宽度。2、方块类ErsBlock游戏的主要实体俄罗斯方块由4*4个方格(ErsBox)构成。这个块不断产生和消失,并且还要不断变化(翻转),因此可用线程来实现,该类继承于线程类Thread。该类用4位16进制数表示一个4*4个方格组成的方块,即一个方块的状态

48、。在这里1为被补充,0为不被补充。这28种状态可用一个STYLES数组表示出来。一个STYLES中的元素使用一个整数表示的,如横长条是用0x0f00表示,再用key=0z08000与STYLES的某个元素style进行“与”运算,即取出了style中的第一位,这一位如果是1,则表示对应的方格在该方块中是要用色彩来显示大的,因此产生一个方格,即一个ErsBox对象。检查之后再作位移运算key=1,如0x8000移位后变成0x4000,再利用它进行检查与style第二位对应方块的位置是否应该产生一个有色彩的方格,如此下去,这个二重for循环一共要检查方块的16个方块的位置。鉴于上面的表示方法,Er

49、sBlock类的构造方法以一个STYLES、该方块所在的画布及其在画布中的坐标、游戏等级作为参数。构造方法中的二循环就是在创建16个方格。利用display()方法可将当前方块在画布的对应位置上显示出来。ErsBlock类的主要成员变量和主要成员方法分别由表4-3和表4-4所示。 表4-3 ErsBlock的主要成员变量名称类型说明BOXES_ROWSStatic int 一块占的行数是四行BOXESCOLSStatic in一块占的列数是四列LEVEL_FLATNESS_GENEStatic int让升级变化的平滑因子,避免最后几级之间的速度相差近一倍BETWEEN_LEVELS_DEGRE

50、SS_TIMEStatic int相近两极之间,块每下落一行的时间差别为多少BLOCK_KIND_NUMBERStatic int方块的样式数目为7BLOCK_STATUS_NUMBER Static int每一个样式的方块的的反转状态种类为4STYLESStatic int分别对应对7种模型的反转得到的28种状态画布canvasGrmeCanvas画布boxesErsBox4*4的数组styleint块的样式,对应STYLES的28个值中的一个xint起始位置,左上角在canvas中的行坐标yint起始位置,左上角在canvas中的列坐标pasuingboolean控制游戏暂停的布尔变量mo

51、vingboolean控制方块移动的布尔变量 表4-4 ErsBlock主要成员方法名称返回类型说明ErsBlock(int stle,int y,int x.)无构造方法,产生一个特定的块Run()void覆盖线程类的run()方法,下落块,直到块不能再下落moveLeft()void方块向左移动一格moveRight()void方块向右移动一格moveDown()void方块向下落一格trunNext()void控制方块的变化形态pauseMove()void暂停块的下落,对应游戏暂停resumeMove()void继续块的下落,对应游戏继续stopMove()void停止块的下落,对应游

52、戏停止erase()void将当前块从画布的对应位置抹去,直到下次冲绘画布时再进行绘制display()void在下次重绘画布时让当前方块在画布的对应位置上显示出来isMoveAble(int newRow,int newCol)boolean判断当前块能否移动到newRow、newCol所指定的位置,可以时返回true,否则返回falsemoveToboolean将当前块移动到newRow、newCol所指定的位置,成功时返回true,否则返回falseisTrunAble(int newStyle)boolean当前块能变成newStyle所指定的块样式,主要是考虑边界以及被其它块挡住、不

53、能移动的情况trunTo(int newStyle)boolean当前块能否变成newStyle所指定的块样式,改变成功时返回true,否则返回false由于游戏中方块的动态性,每个方块有一定的生命期,用线程实现方块是最好不过了。方块用一个类实现,该类直接继承线程类Thread,所以一个方块的出现就是一个线程对象的产生并运行。它可以由键盘控制移动、下落、变形等。该线程类的主体是run()方法,该方法主要控制方块的下落,其中下落的速度由sleep方法的参数来控制,该参数的值又是由一个基本值和游戏的级别来控制,级别越高则休眠的时间越短且下落越快。在这个类里利用moving变量控制方块的下落过程,m

54、oveTo()方法移动到某个位置时不成功或stopMove()要停止方块移动时都是设置moving变量为假,这样该线程即可正常终止。3、游戏主类ErsBlocksGame负责游戏的全局控制。它是一个JFrame类,即以窗口的形式出现的。JFrame是Swing包中与Frame对应的类,功能与Frame类似。从界面上来讲主类中包含一个GrameCanvas画布类的实例和一个控制面板的实例。4、控制面板类ControlPanel控制面板是俄罗斯方块的主要控制部分,从前面的总体结构可以看出该窗口是一个面板,继承于JPanel类,该面板分为三个部分,即提示下一个游戏方块的面板、显示游戏当前信息的面板、

55、存放控制按钮的面板。5、画布类GameCanvas画布类GameCanva是该游戏中的一个窗口。它是用一个面板来实现的,是一个继承于JPanel的类。它的大小完全是根据方格来拼接起来的。4.2 程序实现4.2.1菜单类的实现1、菜单系统菜单系统分为两部分,一部分是菜单声明,另一部分是菜单的创建:(1)菜单的声明部分菜单的声明部分的代码见附录。(2)菜单的创建菜单具体的创建过程以及菜单触发的动作定义由下面的createMenu方法进行设置,其细节在程序的注释中说明。(代码见附录)2、菜单项对应的操作设置:(1)快捷键的设置菜单首先为“暂停”和”继续”菜单项设置快捷键,该功能要用KeyStroke

56、类,该类表示一个键盘或等价的设备上的一个动作,它可以对应一个特定的键的按下和松开操作,就像KeyEvent类中的KEY_PRESSED和KEY_Event动作一样;也可以对应键入一个特定的Java字符,就像KeyEvent类中的KEY_TYPED动作一样;KeyStroke还可说明在特定动作中匹配出现的组合键,如Alt、Shift、Control等键的修饰符。(2)方块颜色和背景颜色的选择菜单该程序中用到了JColorChooser类,该类可以让用户自己手工选择色彩,这个类提供了三个级别API:一个静态方法显示一个模态的色彩选择对话框,然后返回用户选择的色彩。一个静态方法创建一个色彩选择对话框

57、,对这个对话框ActionListener监听用户按下的色彩选择按钮。在任何容器内直接创建JColorChooser边条的实例,可加入PropertyChange监听接口来检测当前色彩的变化。这些功能在俄罗斯方块游戏的方块颜色和背景颜色的选择菜单中得到了很好地应用。其具体代码见附录。无论是选择方块的颜色还是选择背景颜色,选中相应的菜单项后都会弹出一个对话框,该对话框上有三个标签,分别是HSB、样品和RGB。(3)菜单响应的设置设置菜单的响应,即指定的当用户某种行为后应采取相应的动作。完成该功能的语句如下:菜单项.addActionListerner(动作监听机器);而动作监听器又是以匿名类的形

58、式实现的。其语句形式为:New ActionListerner() /监听方法的描述/ 各菜单项增加监听器和监听接口具体的描述语句见附录。4.2.2方格类的实现俄罗斯方块游戏的个方格是用复制的方法产生的,因此要使方格类实现Cloneable接口。这里可以看出方格类并没有画出方格,只是用颜色代表这是一个什么样的方格。方格的画出实在方块类中进行的。4.2.3方块类的实现 方块类的实现主要使用位运算和位移运算取出表示一个方块的信息,然后根据这些信息用前景颜色或背景颜色画出方块。ErsBlock类的构造的方法可用位运算或位移运算产生一个与STYLES中的元素对应的方块。除了给出的程序注释外,下面再对几

59、个重要的方法进行讨论。ErsBlock类作为一个线程类,它最重要的方法就是run方法。不难看出整个run方法是由一个whlie循环控制的,而whlie循环式根据moving布尔变量控制的。这是一个线程的技巧,其一般形式如下:Public void run() while (moving) / your code here /由于线程中不再使用stop()方法,因此要使用一个moving布尔变量作为循环的控制变量,如有必要可在任何时候设置moving为假,这样即可终止线程的执行。在这个类里也正是利用moving变量控制方块的下落过程,moveTo()方法移动到某个位置时不成功或stopMove(

60、)要停止方块移动时,都是设置moving变量为假,这样即可使线程正常终止。该类的moveTo(int newRow,int newCol)方法也值得注意,这是一个同步方法,该方法通过对成员变量x、y进行操作来控制方块。由于不能同时都来控制方块,要有序地进行,所以设置为同步方法。该方法在通过isMoveAble检验可以移动并且moving为真时才把方块定位在新的位置。4.2.4主类的实现 俄罗斯方块游戏的主类ErsBlocksGrame的轮廓是一个JFrame类,初始化的许多工作都是围绕窗口展开的。在它的主要方法和内部类中构造方法完成了窗口标题的显示、窗口的调整、菜单的创建、游戏面板和控制面板的

61、创建、窗口的布局、窗口及其窗口中构建监听器的加载:私有类Game描述了一轮游戏的过程:main方法调用构造方法初始化当前类的实例,从而启动了整个程序的执行11。4.2.5控制面板类的实现 控制面板类ControlPanel主要按照前面的设计框架填入响应的内容。提示面板TipPanel类的要点是两个类的构造方法,构造方法1创建没有颜色的方块,构造方法2调用构造方法1创建一个方块后,再设置前景色和背景色。setStyle方法设置预显窗口的方块样式,即ErsBlock类的STYLES中的28个值之一,然后由paintComponent方法绘制出这个即将出现的方块。4.2.6游戏画布类的实现 游戏画布类GrameCanvas是该游戏的窗口,该窗口完全是根据方格拼接起来的,画布类GrameCanvas的主要功能是逐行绘制方格,如果某个方格不显示设置这个方格颜色为背景颜色,否则置为前景色。第5章 测试5.1 菜单界面测试1、下图为16进制数0*0f00表示的方块,此方块在游戏界面中能显示出下一个方块的形状:2、此游戏的菜单栏中共有四个菜单,其中“游戏”这个菜单下有六个菜单项,每个菜单项都有它自己的功能。点击新游戏可以结束上次的游戏进入下一次的新的游戏;设置方块颜色和背景颜色是根据自己的

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!