三叶虫的进化(2048)小游戏的开发与设计

三叶虫的进化(2048)小游戏是一款几乎人尽皆知的数字益智类单人小游戏。最早于2014年3月20日发行首先在GitHub上发布,原作者是Gabriele Cirulli,后被各个平台运用。缓解生活压力、调节情绪是这款小游戏的初衷。我们采用Java语言和eclipse软件来重新开发了一款

  引言

  现今世界,节奏越来越快,休闲益智的小游戏对人们放松心情,释放疲惫,有着不可或缺的作用,这次毕业设计就设计一款休闲益智的三叶虫的进化(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))来更直观地体现。在这次疫情中,互联网的使用率创下了新高。尤其是在游戏行业,较其他产业,增长率极为明显。
  由此可见,休闲益智类小游戏目前市场状况一片良好,甚至大有发展前景,它秉持着便捷,休闲,随玩随停的理念,因而市场前景很好。
三叶虫的进化(2048)小游戏的开发与设计
  图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++){
  tiles<i>[j]=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(tiles<i>[j].value==tiles<i>[j+1].value||tiles<i>[j].value==tiles[i+1][j].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,
  将运行状态赋值给游戏状态
  创建小方块对象
  使用随机方法生成小方块
  绘制面板drawGrid
  g.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);
  添加组件的设置this.add(gameBoard);
  4.2.3游戏卡片移动功能的实现
  首先定义四个方向键上、下、左、右,来控制。
  package main;
  public enum DirectEnum{
  NONE,
  LEFT,
  RIGHT,
  UP,
  DOWN;
  }
  二维数组是这款游戏的关键所在。
  水平相左:
  1、行代表水平,列代表垂直。
  2、向左说明数据的优先考虑的位置是从左开始的。这样就确定了一维数组的遍历开始的位置。
  图中共四行,每一个行都能得到一个以为数组
  arr1:[0,0,2,0];
  arr2:[0,4,2,0];
  arr3:[0,0,4,4];
  arr4:[2,0,2,0];
  var getData=function(arr){
  遍历数组从数组的的当前位置的下一个开始遍历,找不是0的位置()
  如果当前位置和下一个位置相等,将当前位置数据*2,下个位置数据为0。
  首先判断是否存在可合并的两个小方块,在嵌套for循环中,如果方块的二维坐标值等于纵向坐标下一个小方块的值或者横向坐标下一个小方块的值,则使判断结束的变量为false;
  当前移动瓦片不能到达边界,不能为空白瓦片,前方瓦片不能是合成瓦片。以左键为例,如下:
  当小方块纵坐标大于且小方块的坐标值不等于0且当前小方块的下一个是否是合并的如果当前小方块的下一个值等于0,则左移当前小方块或者与左边方块合并。
  增添绘制动画效果
  private void invokeAnimate(){
  如果是小方块的合并,则创建线程,调用其start方法,开始合并,调用合并的动画方法,如果是小方块的合并
  if(isMerge||isMove){
  createTile();
  isMerge=false;
  isMove=false;
  }
  }
  后面增添了键盘响应事件的代码使我们的方向键得以应用private void moveAnimate()
  合并算法可以认为是我们所了解到的分治算法。
  绘制小方块背景g.setColor(tile.getBackground());
  横坐标用j计算,纵坐标用i计算
  绘制小方块文字;
  设置文字的颜色格式;
  设置文字的字体格式;
  创建FontMetrics类对象,这个对象用来封装在特定的屏幕上呈现特定字体的有关信息;
  这是文字在小方块中的坐标,横坐标用j计算,纵坐标用i计算;
  移动的步数public int step;
  显示的数字public int value;
  移动的方向public DirectEnum directEnum;
  是否是合并的public boolean ismerge;
  4.2.4重新开始游戏功能的实现
  主要是利用enter键,像赋予上、下、左、右、ESC键一样赋予enter键刷新页面。
  switch(e.getKeyCode()){
  case KeyEvent.VK_ENTER:
  System.out.print("000");
  initGame1(kk);
  break;
  }
  4.2.5关卡的实现
  将enter键,上键,下键赋予选择关卡的能力,上下键选择关卡,enter键选定。
  定义Enter键的方法,public void keyPressed(KeyEvent e){}
  参数是键盘,如果键盘事件是敲击Enter键,则输出000,并且选择关卡;
  case KeyEvent.VK_ENTER:System.out.print("000");
  如果键盘事件是敲击方向键上键,如果关卡小于等于1,则跳出事件或者是关卡自减并且创建小方块;if(kk<=1)break;
  else{kk–;}
  inovkeCreateTile(kk);
  break;
  如果键击事件是方向键下键,如果kk>3,则跳出循环,创建小方块,重新绘制
  case KeyEvent.VK_DOWN:
  if(kk>3)
  break;
  else
  kk++;
  inovkeCreateTile(kk);
  break;
  设置四个关卡private void drawTile(Graphics gg,int i,int j){};
  我们使用switch case语句,来判断i与关卡的关系。
  当i等于0时,匹配进入case后的表达式,我们使他的值为第一关,并顺序执行后面的所有case程序代码,完成之后的所有关卡;case 0:value="第一关";break;
  当i等于1时,匹配进入case后的表达式,我们使他的值为第二关,并顺序执行后面的所有case程序代码,此时只需要完成第二关及以后的关卡;
  当i等于2时,匹配进入case后的表达式,我们使他的值为第三关,并顺序执行后面的所有case程序代码,此时只需要完成第三关及以后的关卡;
  当i等于3时,匹配进入case后的表达式,我们使他的值为第四关,并顺序执行后面的所有case程序代码,此时只需要完成第四关及以后的关卡。
  4.2.6游戏结束的实现
  利用嵌套for循环组件二维空间,利用Graphics2D类画出结束标题。
  如果游戏结束if(isOver){}
  设置颜色g.setColor();
  设置宽高g.fillRect(0,0,getWidth(),getHeight());
  设置字体g.setFont()
  定义一个字符串为GameOver,画出字符串GameOver,在指定的位置
  String value="Game Over";g.drawString(value,(getWidth()-fms.stringWidth(value))/2,getHeight()/2);
  4.3本章小结
  本章主要借助语言和代码,结合起来,一步步分解,以及编写代码的时候的构思,想法再到实践及搭建框架,一步步的经历,比如首先考虑的是开始界面,然后思索开始界面应该是什么样子的,应该包括哪些东西,比如,标题,得分,分数,游戏界面,游戏结束界面,如何记录分数,游戏的小方块如何移动,还有一开始完成不了的关卡部分以及我没想到的一些必要内容的具体解释。虽然不够完整但大体上是“麻雀虽小五脏俱全”。

  5.游戏测试

  5.1游戏系统测试

  游戏系统测试准备就绪
  环境安装完整
  图5.1系统测试

  5.2游戏流程测试

  (1)首先运行程序,右击GameStart.java,其次单击run as
三叶虫的进化(2048)小游戏的开发与设计
  图5.2(1)运行程序
  (2)打开界面,如图所示
  图5.2(2)开始界面
  (3)第一关,第二关,第三关,第四关,通过键盘方向键(上、下键)控制,选择关卡,enter回车键确认所选关卡,进入所选择的关卡,并且,按住ESC键可以任意刷新,重新开始游戏,如下图所示:
  图5.2(3)-1选中第1关图5.2(3)-2进入第1关
  图5.2(3)-3选中第2关图5.2(3)-4选中第3关
  图5.2(3)-5选中第4关图5.2(3)-6按ESC键可刷新游戏

  5.3本章小结

  这章主要展示了游戏的基本测试,具体的展示了不同状态下的不同的游戏界面,本游戏设置了四个关卡,首先打开游戏后是呈现的关卡选择界面,选定你想进入的关卡后,开始游戏,当然,无论什么时候,你可以按住ESC键来进行游戏的刷新,那么你将重新开始这个游戏。此游戏,用键盘上的方向键部分进行操控。上、下、左、右键分别进行你想小方块的掉落位置。此游戏到2048即为胜利。

  总结与展望

  经过了近五个月的研究终于把三叶虫的进化(2048)小游戏的开发与设计完成了,经过这次的毕业设计的学习,让我明白了许多,事情需要循序渐进,一步一步脚踏实地的完成,“一口不能吃成个胖子”,有些事情看起来很简单,但真的动手操作就有了一定的难度,只有经过不断的学习和细细挖掘,才把这个游戏的功能基本实现了,最后只实现了记录当前成绩的功能,本来还希望能够实现排行榜这个功能,不过以我目前的能力还不足以完成,不过我以后有机会定会去实现的它,完善它!
  常言道,不积跬步无以至千里,不积小流无以成江海,在书中和网上找了又找,试了又试,一遍又一遍程序中的很多方法,最终才把需要的方法,能够使用的方法融入到程序当中,实现了必要的功能模块。通过本次的毕业设计,我发现,程序的编写还是在于平时的积累,这样的话就不会遇到一个问题就需要去查阅资料,也就是说我所做的还是很不足的。针对我薄弱的方面,我会在今后的学习生活中加以改善,让我设计的这款游戏更加丰富、多彩。
  我以前就玩过这个游戏,确实让我沉迷了一阵子,所以在此次选题时,我对这个题目略有好感。在游戏的开发与设计之前,我先在互联网上找到相关的游戏,了解了这个游戏的玩法,通过一次次试玩,自己慢慢地熟悉了之后,渐渐发现了其中的奥秘,之后才开始慢慢琢磨,运用逆向思维,比如对游戏的需求分析,如何创建界面、地图,如何选择关卡,如何设计音效、积分,就关卡这一模块来说,真的感觉是很难的事情,关卡部分经过我不断耐心的学习,实验,最终呈现出来了,我真的很开心,通过这一点使我了解到我现在需要学习的内容确实还有很多,今后我一定积极去学习需要学习的知识,做到融会贯通,多做项目使自己在实践中学习,为将来打好铺垫。
  最终因为目前掌握的知识量还很有限,时间又较为短暂,三叶虫的进化(2048)小游戏只是实现了基本功能,具体的美化、优化等等还没来得及做,虽然只做了这么一小部分,但是我还是学到了很多平时没有掌握到的知识,虽然不太完美,但是总体来看我还是比较满意,相信只要有实践就会有收获,只要肯努力就会有回报。经过科学地分析,如果时间、人手、经济允许的条件下经过再学习,我设计的这款游戏能再更新完善的样子:由于当玩家到达2048后,或者一次次的使用之后,玩家可能会对闯关失去兴趣,如果一款游戏使人失去了兴趣,这就是它的败笔。因此,我会在能力范围内对此款游戏的将来延续性的工作提出一点设想,比如设置网状的关卡界面,通过第一关才能解锁第二关,如此下去;再比如定期更新,设置出新的玩法,简单又不失乐趣。成功的大门永远为那些追逐目标而奋发图强的人而开。

  参考文献

  [1]熊一利.一种基于Java的电子商务系统设计[J].科技广场,2015,0(06):30-33.
  [2]阎新芳.Java设计模式在数据库编程中的应用研究[J].信息通信,2014,4(11):120-123.
  [3]陈亚探.Struts2+Spring+Hiberna框架技术与项目实战[M].北京:清华大学出版社,2012.
  [4]王国辉.Java Web编程宝典:十年典藏版[M].北京:人民邮电出版,2011.
  [5]张琳娜.Java多态性机制应用研究[J].攀枝花学院学报,2016,14(02):25-28.
  [6]赵利庆.Java Web架构中数据库优化模式的研究与实现[D].北京:北京邮电大学,2015.
  [7]杨静.基于Java Web中MVC模式的研究与应用[J].电脑知识与技术,2014,9(28):68-71.
  [8]李孟燃.网页设计中计算机多媒体技术的应用[J].计算机光盘软件与应用,2014,6(12):55-57
  [9]李国娟.基于JavaEE架构的网上购物系统的设计与实现[D].河北:河北工业大学,2011.
  [10]闾燕.基于用户体验的购物网站界面设计研究[J].中国包装工业,2014,11(16):19-20.
  [11]霍斯特曼科内尔.Java核心技术[M].北京:机械工业出版社,2014.
  [12]贺伟,李凤.基于项目驱动式教学的《Java面向对象程序设计》课程实践[J].计算机产品与流通,2019(01):263-264.
  [13]丁慧.基于游戏项目二维分解的教学改革——以Java教学为例[J].科学大众(科学教育),2019(01):156.
  [14]倪海顺.计算机软件开发的Java编程语言应用探讨[J].信息与电脑(理论版),2019(02):60-61.
  [15]张永强.计算机软件Java编程特点及其技术分析[J].计算机产品与流通,019(01):23.
  [16]马寅璞,孔阳坤.用JAVA实现一个推箱子游戏[J].技术与市场,2019,26(02):82-83.

  致谢

  撰写论文的过程就是不断学习的过程,从开题到论文终稿,经历了一次又一次的修改,导师也十分细心,耐心,面对我们的问题,悉心地帮助我们。如今,即将在此画上了句号,在我看来,撰写论文所代表的不是简单的汉字或者简单的代码,而是努力的结果,是我的一段大学生涯的落幕。
  在此,我要再一次感谢我的指导老师。无论是在论文格式上还是内容上,或者是各种分析方面给予的热情指导和帮助,如果没有您不厌其烦的指导,我自己一定是完成不了这份论文的,您细心严谨,逻辑清晰,总能发现我的问题,解决我的疑惑,让我受益匪浅。当然也要感谢大学四年一直陪伴我们的,给与我们帮助的所有任课老师,辅导员老师等等,正是有了这些任课老师一年一年的课业铺垫,我才能够用所学知识完成这次的毕业设计内容。
  我的这一短暂而充实的大学生涯虽然即将结束了,但学习的脚步永远不止,相信大学四年的学习生活和我在这学校的点点滴滴定会对我以后的生活也会有莫大的帮助。
  谢谢我这大学四年。
下载提示:

1、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“文章版权申述”(推荐),也可以打举报电话:18735597641(电话支持时间:9:00-18:30)。

2、网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。

3、本站所有内容均由合作方或网友投稿,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务。

原创文章,作者:写文章小能手,如若转载,请注明出处:https://www.447766.cn/chachong/14778.html,

Like (0)
写文章小能手的头像写文章小能手游客
Previous 2021年11月3日
Next 2021年11月3日

相关推荐

My title page contents