三叶虫的进化(2048)小游戏的开发与设计.docx
三叶虫的进化(2048)小游戏的开发与设计摘要 三叶虫的进化(2048)小游戏是一款几乎人尽皆知的数字益智类单人小游戏。最早于2014年3月20日发行首先在GitHub上发布,原作者是Gabriele Cirulli,后被各个平台运用。缓解生活压力、调节情绪是这款小游戏的初衷。我们采用Java语言和eclipse软件来重新开发了一款界面清晰且具有四个关卡的2048游戏,对游戏的界面、地图、关卡、音效、控制、积分等进行了设计。在设计中,我们借助了JFrame类构建我们的游戏窗体,调用关卡对象的initView()方法来进行界面的搭建,创建一个JLabel对象来显示文本或者图像,使用KeyEvent类来表示组件中发生的键击事件,比如KeyAdapter对象实现 KeyListener 接口,将空白方块放入List集合,不为空的集合,则使用random类来创建对象。以此实现了一个更简洁易操控的2048小游戏。关键词 三叶虫的进化(2048)小游戏 益智 简洁The development and design of the trilobite evolution (2048) mini-gameAbstract Trilobite evolution (2048) mini-game is an almost well-known digital puzzle class single small game. First posted on Github on March 20,2014, by Gabriele Cirulli, then used by various platforms. Alleviate the pressure of life, adjust the mood is the original intention of this small game. We use the Java language and eclipse software to re-develop a clear interface and has four levels of the game 2048, the game interface, map, levels, sound, control, integration and so on. In our design, we use the JFRAME class to build our game form, call the initView() method of the level object to build the interface, and create a JLabel object to display text or images, keyevent classes are used to represent the keystroke events that occur in the component, such as the KeyAdapter object implementing the KeyListener interface, placing blank squares into the List collection, or using the random class to create objects if the collection is not empty. With this has realized a more succinct control 2048 small game.Key Words Trilobite evolution 2048 mini-game puzzle brevity目 录引 言11. 游戏背景11.1 2048小游戏11.2 游戏市场发展现状11.3 开发与设计的意义21.4 本章小结32. 开发环境42.1 开发环境的介绍42.1.1 JDK的介绍42.1.2 Eclipse的介绍42.2 开发环境的搭建42.2.1 JDK的安装与环境变量配置42.2.2 Eclipse的安装与环境变量配置52.3 本章小结53. 系统的需求分析63.1 游戏的可行性分析63.1.1 关于技术可行性63.1.2 关于市场可行性63.2 需求分析63.2.1 系统功能需求分析63.2.2 游戏基本规则73.4 本章小结74. 游戏的基本设计和实现84.1 系统基本设计详细介绍84.1.1 窗体界面搭建84.1.2 窗体的构成94.1.3 游戏面板组件104.1.4 移动控制104.1.5 初始化地图114.2 游戏实现164.2.1 开始界面的实现164.2.2 游戏界面的实现174.2.3 游戏卡片移动功能的实现194.2.4 重新开始游戏功能的实现214.2.5 关卡的实现214.2.6 游戏结束的实现224.3 本章小结225. 游戏测试235.1 游戏系统测试235.2 游戏流程测试235.3 本章小结26总结与展望27参考文献29致 谢30附 录31引 言现今世界,节奏越来越快,休闲益智的小游戏对人们放松心情,释放疲惫,有着不可或缺的作用,这次毕业设计就设计一款休闲益智的三叶虫的进化(2048)小游戏。1. 游戏背景1.1 2048小游戏首先简单的介绍下2048的来历,2014年他利用周末的时间写最早出现的2048这个游戏的程序第一版本就这样问世了,他就是Gabriele Cirulli,他当时呢,也只不过是玩玩罢了。他的最终目的就是拥有一个属于子节点特别的游戏版本。还有很多人在开发这款游戏时也花费了很多时间。在2048这款游戏的创作过程中,主要是在Gitthub上完成这个项目的展示。经过多次的测试和修改之后,功夫不负有心人,最终发表在GithubPages上,得到了大家的广泛关注。2048的使用方法:在游戏开始之初,可以任意选择一个方向去移动,这时,游戏界面中所有的数字方块都会往你所移动的方向汇合,与此同时,就会在空白处出现一个其他在数字的小方块,在这里要强调的是,如果两个相邻的小方块数字是一样的,那么它们就会自动相加,变成一个。就这样循环往复,当界面中出现2048这个数字是,就代表着你成功了,也就意味着游戏的结束。后来,2048渐渐演变出多种模式玩法,传统版,汉服2048,六边形版,朝代版本,2048 3D中文版,2048后宫版等等。游戏闯关技巧:1、将最大的数字尽可能向某一个角落聚集。2、不同的数字按序排列。3、先让前两个最大的数所在的行或列是满的。4、警惕你所移动的数比如新出现的数字2或者4再或者大数旁边尽可能安排与之相近的数。5、关键是要往大数所在的行的方向移动1.2 游戏市场发展现状此次疫情,所有人的宅家生活影响力游戏行业,或许可以通过以下一些数据(图1.2(1)来更直观地体现。在这次疫情中,互联网的使用率创下了新高。尤其是在游戏行业,较其他产业,增长率极为明显。由此可见,休闲益智类小游戏目前市场状况一片良好,甚至大有发展前景,它秉持着便捷,休闲,随玩随停的理念,因而市场前景很好。图1.2(1)图1.2(2)1.3 开发与设计的意义21世纪的今天,我们的生活已经被游戏占据了一席之地,并且游戏对我们生活的影响正在一步步的壮大。回想一下20年前,那时候手机、电视、电脑都不是特别发达,几乎没有什么电子设备,而现如今不仅仅是语言从小抓起,电子行业也扛起了“从小的大旗”。可以说,随着它的近些年的快速发展,游戏产业已经超出了他的最初目的,变成了一种文化。随着市场上游戏的步步壮大, 与其有关的文化也随之广为传播。电子游戏中的益智类小游戏比如我这款三叶虫的进化(2048)小游戏,有教育意义也有娱乐趣味。像这种偏益智类的小游戏主要是锻炼我们的脑力,让玩家快速的去思考,同时也愉悦了自己的身心,达到一箭双雕的效果。现有三叶虫的进化(2048)也有些许的不足,当玩家熟悉了游戏操作之后,很容易就会知道下一个要出现的数字是什么,极大了降低了玩家的游戏体验度,所以,在此基础上,沃恩应该开发出更强大的功能,比如关卡功能,满足玩家的闯关心里。我相信,这样的话会大大的提高玩家们对这款游戏的好感度。1.4 本章小结本次章节一开始是从游戏背景来叙说,主要阐述了当今游戏市场发展现状和此游戏开发的意义两方面,以及简单的介绍了本课题的大致构思内容。2. 开发环境2.1 开发环境的介绍2.1.1 JDK的介绍JDK对于普通人来说并没有太大的用处,它主要是针对于我们一线的开发人员,是一个小型的软件开发包,其中有着库函数,要强调的是还有程序编译功能。JDK是Java语言的软件开发工具包,为Java提供了开发环境和运行环境,JRE是Java Runtime Enviroment的缩写,它指代的是Java的运行环境,是Java程序的使用者。2.1.2 Eclipse的介绍Eclipse-galileo在我们生活当中也有一个别的名字,这个名字我相信大家都耳熟能详,就是eclipse,我们的eclipse有着许许多多的功能,首先,他的源代码是开放的,其次,他的平台是基于java的。我们一线的开发人员可以通过框架和相对应的服务,再加上合适的插件就可以轻轻松松的组成开发环境。当然,Eclipse本身也自带许许多多的插件,JDT就是其中之一。Eclipse的源代码是开放的,主要是负责构建功能较多,且具有商业性质的平台。其中,项目,工具项目,技术项目是他的主要构成。Eclipse也是一个可扩展的IDE,所使用的开发平台基本上都是大家都能用的。Eclipse平台允许工具建造者独立开发与他人无缝集成的工具从而分辨在哪里结束,同时又在哪里开始。2.2 开发环境的搭建2.2.1 JDK的安装与环境变量配置(1) 之前老师给的JDK安装包,下载版本为JDK1.6或者JDK1.7。(2) 双击安装文件JDK。(3) 其次是环境变量的配置:2.2.2 Eclipse的安装与环境变量配置从老师那里直接获取的解压即可得之。步骤和上述类似。2.3 本章小结本章主要介绍开发环境(JDK和eclipse)的安装和环境变量的配置,为游戏的开发与运行做准备,为下文的需求分析和基本设计做铺垫。3. 系统的需求分析3.1 游戏的可行性分析可行性分析是在对本设计进行了详尽的调查之后,对这个项目做出方案,从经济、技术等方面左出一个较为合理的评估,为这个项目的之后开发减少不必要的麻烦,进而减少或者降低失败的可能性。3.1.1 关于技术可行性该工作的作用主要是检测技术方面和系统方面是否合适,以及开发者对软件、硬件需求能否达到预期的需求等。我的这款三叶虫的进化(2048)小游戏,我采用的是java语言作为开发工具,构建图形采用图形库函数,辅以算法演示。Java语言是面向结构化程序设计的语言,它不仅仅具备高级语言有较为高级的效率又具备低级语言同时也高效率的执行。并且它有丰富的数据类型和函数类型,能够完成我们的目标,它的修改、编辑都较为容易掌握,这对后期的修改非常有利。 以上就是对本系统的技术可行性分析,所以无论是从技术还是硬件设备方面,本系统都是满足条件的,符合技术上的可行性。3.1.2 关于市场可行性目前游戏市场发展十分可观,而且此款游戏开发的初衷就是简便,缓解压力,因此面对当今繁忙的日常生活,其具有巨大的市场和发展潜力。关于产品定位,应该是一款老少皆宜的小游戏。该系统将要完成的是三叶虫的进化(2048)小游戏的开发与设计。这是一款随玩随停,使用方便快捷,本设计提供给玩家的仅仅会涉及到简单的方向键的控制、重新游戏等操作,因此需要玩家仅仅熟悉简单的电脑操作即可,不需要专门进行培训。3.2 需求分析3.2.1 系统功能需求分析系统主要实现以下的几个功能:游戏界面、呈现游戏地图、关卡选择、音效控制、重新开始游戏、当前分数和最高分数、积分等功能。关卡选择是当玩家通过方向键中的上下键选择关卡,当选定关卡后,按enter回车键,就会进入游戏界面。重新开始游戏是当玩家无法满足当前进度时点击此按钮,我设置的是ESC键就会再出现游戏界面。游戏界面主要是在4*4的方块中有两到4个数字方块。此时分数为最高分数。游戏界面流程图如图:开始状态显示界面关卡选择游戏界面分数展示游戏名称3.2.2 游戏基本规则在开始游戏后玩家通过方向键盘中的上、下、左、右分别来来控制卡片的移动方向,当相邻的两张卡片数字相同时会合并且自动相加,即显示为这两张卡片之和。在移动之中有三张卡片相同时只会合并向移动方向两张卡片。循环往复。3.4 本章小结这章主要讲述了系统的需求分析,简单的描述了游戏的各个功能模块和游戏的基本规则,大致分为DirectEnum.java ,GameStart.java, WaveThread.java, guanka.java, Window1.java, Window2.java然后是对系统概要设计的介绍。4. 游戏的基本设计和实现4.1 系统基本设计详细介绍4.1.1 窗体界面搭建首先,一开始是还没有加入关卡设置的。所以,我们在在项目的面板中,我们首先需要导入一些类,以便在我们方法体中更好的使用他们。例如:awt包下的Color与Dimension类,swing包下的JFrame类,Color类与Dimension类可以为我们提供更多的颜色设置与更精确的对象组件的宽高;import java.awt.Color;import java.awt.Dimension;在GameStart类中,定义主函数,使用我们之前定义的关卡类创建关卡对象gk;import view.guanka;调用关卡对象的initView()方法,这个方法主要是界面的搭建;设置窗口标题为2048游戏;因为关卡类继承于JFrame类,我们都知道,JFrame类是窗体类,我们可以通过关卡子类直接调用父类JFrame类所拥有的功能,直接调用他的getContentPane方法,以此返回窗体的contentPane对象,在调用他的setPreferredSize方法,他的参数是一个Dimension对象,用来更精确的设置宽高;由于JFrame直接调用setBackground设置背景色不生效,我们继续利用contentPane对象设置背景颜色,参数是Color类中的颜色;去掉最大化按钮,获得最佳大小;gk.setResizable(false); gk.pack();设置窗口相对于指定组件的位置。如果组件当前未显示或者 c 为 null,则此窗口将置于屏幕的中央;gk.setLocationRelativeTo(null);设置隐藏窗口为可见。gk.setVisible(true); 4.1.2 窗体的构成下面主要是开始着手窗口部分的设置:窗口1是不加入了音效、移动特效、合并特效;窗口2是加入了音效、移动特效、合并特效;这里主要介绍窗口2,在后面的关卡部分也调用的是窗口2。先处理字体部分,分数的字体;首先,我们先声明一个私有的,静态的得分变量,以便我们在静态方法中更好的调用他,类名可以直接访问静态资源,优先于对象加载,随着类的加载而加载,并且,静态资源只有静态资源可以调用,所以我们将其加上static修饰词;private static int score = 0; 定义一个字体数组,并创建他的对象,并用final修饰词修饰,来保证他最终可以被执行。final Font fonts = ;其次设置标题ltitle;定义标题为2048,状态居中 ltitle = new JLabel("2048", JLabel.CENTER); 设计字体显示效果 Font mf = new Font(String 字体,int 风格,int 字号); 字体可以选择:TimesRoman, Courier, Arial等等风格包括:三个常量 lFont.PLAIN, Font.BOLD, Font.ITALIC字号:字的大小(磅数)设置组件当前使用的字体:setFont(Font fn)ltitle.setFont(new Font("", Font.BOLD, 50);ltitle.setForeground(new Color(0x776e65);移动组件并调整其大小,使其符合新的有界矩形r。再由r.x和r.y指定组件的新位置,由r.width和r.height指定组件的新大小ltitle.setBounds(0, 0, 120, 60);设置显示“分数”部分;创建一个JLabel对象,JLabel对象可以显示文本或者图像,我们将它赋值给lsctip,用来显示SORCE这个字符串; 设置lsctip的字体格式, 设置lsctip的颜色格式,设置lsctip控件是否透明,true表示不透明,false表示透明。这只有设置为true背景色才生效, 设置它的背景颜色; lsctip的setBounds方法有一些特别,这个方法是用来移动组件并调整其大小,他有四个参数,第一个和第二个参数用来指定左上角的新位置,相当于xy的二维坐标,第三个和第四个参数用来指定新的大小,是height与width。同理设置得分显示部分。4.1.3 游戏面板组件在面板左侧显示按方向键可以控制方块的移动,按ESC键可以重新开始游戏。lgatip = new JLabel("按方向键可以控制方块的移动,按ESC键可以重新开始游戏。", JLabel.LEFT); 设置字体样式;设置颜色格式;lgatip.setFont(new Font("Helvetica Neue", Font.ITALIC, 13); lgatip.setForeground(new Color(0x776e65); lgatip.setBounds(10, 60, 390, 30);移动组件到具体位置,把组件加入窗体,具体实现代码如下: gameBoard = new GameBoard(); gameBoard.setPreferredSize(new Dimension(400, 400); gameBoard.setBackground(new Color(0xbbada0); gameBoard.setBounds(0, 100, 400, 400);gameBoard.setFocusable(true);4.1.4 移动控制其次设置小方块也就是一个一个的方块,声明小方块之间间隙的整型常量为16像素,private static final int GAP_TILE = 16;声明小方块圆角弧度的整型常量为16像素,private static final int ARC_TILE = 16;声明小方块的大小的整型常量为80像素;private static final int SIZE_TILE = 80;将移动的过程分成X段声明成常量;private static final int PAINT_NUM = 20;方向键的控制,主要是KeyEvent类。当我们敲击ESC键时,我们进入initGame方法,我们在此方法中判断是结束还是移动,当敲击ESC键时,判断为结束,则结束游戏。下面介绍方向键盘;我们敲击方向键左键时,调用左移方法,传给move变量,将其赋值给小方块,使小方块左移; 绘制小方块的移动动画效果, 然后我们进行一个游戏是否结束的检测,先进行分数的叠加,然后判断是否还有空着的方格区域,再判断是否存在可以合并的小方块,以此来判断游戏是否继续进行下去。我们敲击方向键右键时,调用右移方法,传给move变量,将其赋值给小方块,使小方块右移; 绘制小方块的移动动画效果,然后我们进行一个游戏是否结束的检测,先进行分数的叠加,然后判断是否还有空着的方格区域,再判断是否存在可以合并的小方块,以此来判断游戏是否继续进行下去我们敲击方向键上键时,调用上移方法,传给move变量,将其赋值给小方块,使小方块上移; 绘制小方块的移动动画效果,然后我们进行一个游戏是否结束的检测,先进行分数的叠加,然后判断是否还有空着的方格区域,再判断是否存在可以合并的小方块,以此来判断游戏是否继续进行下去。我们敲击方向键下键时,调用下移方法,传给move变量,将其赋值给小方块,使小方块下移;绘制小方块的移动动画效果,然后我们进行一个游戏是否结束的检测,先进行分数的叠加,然后判断是否还有空着的方格区域,再判断是否存在可以合并的小方块,以此来判断游戏是否继续进行下去。4.1.5 初始化地图 使用嵌套for循环生成二维图表,生成一开始的两个小方块,其次获取当前空白的小方块,并加入列表;for (int i = 0; i < 4; i+) for (int j = 0; j < 4; j+) tilesij = new Tile();声明一个List集合,他的泛型为小方块类,将空白方块放入List集合,如果集合不为空,则使用random类创建对象;List<Tile> list = getBlankTiles();Random random = new Random();随机生成小方块,获取集合中的下标,并赋值给小方块,再用一个三目运算符,来判断初始化的小方块的值是2或者4 int index = random.nextInt(list.size(); Tile tile = list.get(index); tile.value = random.nextInt(100) > 50 ? 4 : 2; 再进行判断是否存在可合并的两个小方块;if (tilesij.value = tilesij + 1.value | tilesij.value = tilesi + 1j.value)如果小方块在列上有相同的值或者在行上有相同的值,则合并;当前移动小方块不能到达边界,且不能为空白小方块,前方小方块不能是合成小方块,当小方块纵坐标大于且小方块的坐标值不等于0且当前小方块的下一个,是否是合并的。如果当前小方块的下一个值等于0,则左移当前小方块或者与左边方块合并;我们接下来进行小方块的绘制,首先先绘制小方块背景,再画出小方块所在的位置,横坐标用j计算,纵坐标用i计算;这里我们需要用到 Graphics2D类,对几何,坐标和颜色的控制,主要应用于Java。使用Graphics2D的对象会使我们在二维空间内更加的精确组件的位置;绘制小方块文字; 文字的颜色; 文字的格式;这是文字在小方块中的坐标,横坐标用j计算,纵坐标用i计算;移动的步数 public int step;显示的数字 public int value;移动的方向 public DirectEnum directEnum;是否是合并的 public boolean ismerge;设置每个小方块的背景颜色 public Color getBackground如果小方块上的值是2,则返回颜色十六进制为0xeee4da的颜色;如果小方块上的值是4,则返回颜色十六进制为0xede0c8的颜色;设置图形用户界面上的字体样式 public Font getTileFont() 关卡部分public class guanka extends JFrame Java的程序的基本思路是以JFrame为基础,它是屏幕上window的对象,能够最大化、最小化、关闭。设置四个关卡 private void drawTile(Graphics gg, int i, int j) ;我们使用switch case语句,来判断i与关卡的关系。当i等于0时,匹配进入case后的表达式,我们使他的值为第一关,并顺序执行后面的所有case程序代码,完成之后的所有关卡;当i等于1时,匹配进入case后的表达式,我们使他的值为第二关,并顺序执行后面的所有case程序代码,此时只需要完成第二关及以后的关卡;当i等于2时,匹配进入case后的表达式,我们使他的值为第三关,并顺序执行后面的所有case程序代码,此时只需要完成第三关及以后的关卡;当i等于3时,匹配进入case后的表达式,我们使他的值为第四关,并顺序执行后面的所有case程序代码,此时只需要完成第四关及以后的关卡。用于播放音效的线程:private boolean merged;是否合并private int value;值构造方法 Tile(int val) value = val;设置get和set方法 getValue()setMerged(boolean m)合并方法 int mergeWith(Tile other) if (canMergeWith(other) value *= 2;合并值翻倍merged = true;return value;return -1;判断是否可以移动 movesAvailable 清楚面板clearMerged 变量State静态成员 start, won, running, over游戏状态colorTable颜色库new Color(0x701710), new Color(0xFFE4C3), new Color(0xfff4d3),new Color(0xffdac3), new Color(0xe7b08e), new Color(0xe7bf8e),new Color(0xffc4c3), new Color(0xE7948e), new Color(0xbe7e56),new Color(0xbe5e56), new Color(0x9c3931), new Color(0x701710);目标分数 final static int target = 2048;游戏的高度static int highest;游戏的分数static int score; 方格颜色private Color gridColor = new Color(0xBBADA0); 空颜色private Color emptyColor = new Color(0xCDC1B4); 开始颜色private Color startColor = Color(0xFFEBCD); 随机数private Random rand = new Random();数字块数组 存放全部数字块private Tile tiles; 格子大小4*4 private int side = 4;游戏状态private State gamestate = State.start; 可否移动状态private boolean checkingAvailableMoves; Game2048构造方法setPreferredSize(new Dimension(900, 700);setBackground(new Color(0xFAF8EF);setFont(new Font("SansSerif", Font.BOLD, 48);setFocusable(true);监听鼠标监听键盘绘制组件 paintComponent初始化画图开始游戏 Gamestart如果游戏的状态不等于运行状态则分数等于0,将运行状态赋值给游戏状态创建小方块对象使用随机方法生成小方块绘制面板 drawGridg.setColor(gridColor);设置颜色g.fillRoundRect(200, 100, 499, 499, 15, 15);填充背景判断游戏状态绘制数字块 drawTile随机生成数字块 addRandomTile ,随机找空位置添加 4或2移动数字块 move根据方向进行移动一系列移动方法上:boolean moveUp() return move(0, -1, 0);下:boolean moveDown() return move(side * side - 1, 1, 0);左:boolean moveLeft() return move(0, 0, -1);右:boolean moveRight() return move(side * side - 1, 0, 1);4.2 游戏实现4.2.1 开始界面的实现在GameStart类中,定义主函数,使用我们之前定义的关卡类创建关卡对象gk;import view.guanka;调用关卡对象的initView()方法,这个方法主要是界面的搭建;设置窗口标题为2048游戏;因为关卡类继承于JFrame类,我们都知道,JFrame类是窗体类,我们可以通过关卡子类直接调用父类JFrame类所拥有的功能,直接调用他的getContentPane方法,以此返回窗体的contentPane对象,在调用他的setPreferredSize方法,他的参数是一个Dimension对象,用来更精确的设置宽高;由于JFrame直接调用setBackground设置背景色不生效,我们继续利用contentPane对象设置背景颜色,参数是Color类中的颜色;其次调用setDefaultCloseOperation方法,返回用户在此窗体上发起“close”时执行的操作,就是可以关闭窗口;去掉最大化按钮,获得最佳大小;gk.setResizable(false); gk.pack();设置窗口相对于指定组件的位置。如果组件当前未显示或者 c 为 null,则此窗口将置于屏幕的中央;gk.setLocationRelativeTo(null);设置隐藏窗口为可见。gk.setVisible(true); 图4.1 开始界面4.2.2 游戏界面的实现首先设置分数部分,声明静态变量score为分数 定义一个字体数组创建字体对像,并在参数中设置格式 new Font("Helvetica Neue", Font.BOLD, 48), 然后定义界面上需要出现的内容,比如,游戏的名字2048,得分,分数,关卡等等。声明 JLabel 类型的 ltitle 变量作为游戏的名字;声明 JLabel 类型的 lsctip 变量作为游戏的得分;声明 JLabel 类型的 lscore 变量作为游戏的分数;声明 JLabel 类型的 lgatip 变量作为游戏的关卡;具体设置各个模块标题部分 设置标题为2048,格式为中间 ltitle = new JLabel("2048", JLabel.CENTER);设置标题的字体 ltitle.setFont(new Font("", Font.BOLD, 50);设置标题的颜色 ltitle.setForeground(new Color(0x776e65);设置标题的位置,大小宽度 ltitle.setBounds(0, 0, 120, 60);得分部分 设置得分为score,格式为中间得分部分 lsctip = new JLabel("SCORE", JLabel.CENTER);设置得分的字体 lsctip.setFont(new Font("", Font.BOLD, 16);设置得分的颜色 lsctip.setForeground(new Color(0xeee4da);设置得分的控件为不透明 lsctip.setOpaque(true);/只有设置为true背景色才生效lsctip.setBackground(new Color(0xbbada0);设置得分的位置,大小宽度 lsctip.setBounds(290, 5, 100, 25);分数部分 设置分数为0,格式为中间 lscore = new JLabel("0", JLabel.CENTER);设置分数的字体 lscore.setFont(new Font("Helvetica Neue", Font.BOLD, 22);设置分数的颜色 lscore.setForeground(Color.WHITE);设置分数的控件为不透明 lscore.setOpaque(true);lscore.setBackground(new Color(0xbbada0);设置分数的位置,大小宽度 lscore.setBounds(290, 30, 100, 25);引导语部分lgatip = new JLabel("按方向键可以控制方块的移动,按ESC键可以重新开始游戏。", JLabel.LEFT);设置引导语的字体格式 lgatip.setFont(new Font("Helvetica Neue", Font.ITALIC, 13);设置引导语的颜色 lgatip.setForeground(new Color(0x776e65);设置引导语的位置与大小 lgatip.setBounds(10, 60, 390, 30);游戏面板组件gameBoard = new GameBoard();设置面板组件的精度 gameBoard.setPreferredSize(new Dimension(400, 400);设置面板组件的颜色 gameBoard.setBackground(new Color(0xbbada0);设置面板组件的位置,大小 gameBoard.setBounds(0, 100, 400, 400);gameBoard.setFocusable(true);设置面板组件 Component 的焦点状态设置为指定值。回此值覆盖 Component 的默认焦点状态。把组件加入窗体添加标题 this.add(ltitle);this.add(lsctip);添加分数 this.add(lscore);添加游戏面板 this.add(lgatip);添加组件的设置 th