基于java+swing+Eclipse的推箱子游戏设计与实现(毕业论文+程序源码)

大家好,今天给大家介绍基于java+swing+Eclipse的推箱子游戏设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题报告PPT模板及论文答辩PPT模板等的小伙伴,可以进入我的博客主页查看左侧最下面栏目中的自助下载方法哦

文章目录:

  • 基于java+swing+Eclipse的推箱子游戏设计与实现(毕业论文+程序源码)
    • 1、项目简介
    • 2、资源详情
    • 3、关键词:
    • 4、毕设简介:
    • 5、源码下载:

1、项目简介

  1. 推箱子游戏的玩法十分简单——控制人物绕过障碍物,到达目的地。此次毕业设计基于Java语言。将游戏地图做成通用的关卡设计,关卡用二维数组实现,在二维数组中设置值域来表示不同对象,运用二维数组的遍历算法来加载对应图片实现了游戏图片初始化状态。同时,通过初始化多个不同二维数组实现了游戏地图关卡的设计,方法巧妙且简单易行,有效的解决了图片排布问题。充分运用类和方法的调用来实现游戏关卡的初始化。用读取键值的方法判断游戏人物移动、停止、到达目的地。舒缓的音乐配合有趣的步骤,相信能引起很多人的兴趣。作为一个具有悠久历史的游戏,也能够引起人的怀念和共鸣。
  2. 基于JAVA的推箱子游戏系统主要用于实现游戏推箱子功能,提供多种不同难度的关卡。本系统结构如下:
    (1)初始化模块: 该模块包括屏幕初始化和游戏第一关的初始化。屏幕初始化用于输出欢迎信息和操
    (2)画图模块: 该模块主要是被其它模块调用,用于画墙、在空地画箱子、在目的地画箱子、画小人和画目的地。
    (3)移动箱子模块: 该模块用于移动箱子,包括目的地之间、空地之间和目的地与空地之间的箱子移动。
    (4)移动小人模块: 该模块用于控制小人移动,从而推动箱子到目的地。
    (5)功能控制模块: 该模块是几个功能函数的集合,包括屏幕输出功能、指定位置状态判断功能和关卡重置功能。

2、资源详情

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


3、关键词:

Java 游戏 二维数组 算法 读取键值 栈 Eclipse


4、毕设简介:

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

引 言
策略性游戏可以锻炼人的思维能力还能缓解人的压力,使人们暂时忘却生活当中的烦恼,增强人们的逻辑思维能力,游戏的艺术美也吸引着越来越多的玩家和厂商,寓教于乐,在放松人们心情的同时还可以活跃双手。

省略

本次的开发尽量多的设置了关卡数目,增强游戏的耐玩性,同时在画面上有所提高,借鉴了许多达人的经验和技术,引发了我对游戏的热爱,丰富了个人生活,相信推箱子游戏在今后的社会总会越来越引人注目。

1 系统分析
1.1 技术可行性分析
1.1.1 可行性目的
通过推箱子游戏中使用的Java技术,让我能够更加熟练的使用Eclipse。同时了解相关运行环境的配置。将理论知识和实际操作结合起来。达到学以致用的目的。网上资料的查询极大的提高了我的自学能力。希望经过此次设计,锻炼自己的思考,解决问题的能力。对系统开发的流程有更深层次的理解,检验学习成果和实际动手能力,对底层知识有更深的了解。为今后的工作打好基础。

1.1.2 可行性研究前提
基本需求:通过规范的开发流程,采用面向对象的分析设计方法实现游戏美观,易玩,及时等特性。操作性方面主要通过键盘的借口实现,操作键位是上下左右。
省略

1.1.3 算法可行性分析
管理可行性:
此次设计基于Java,有面向对象,可移植性,安全性,并发机制,支持可视化图形界面等特点。易于管理。

经济可行性:
经济可行性是指可以使用的资源的可能性(资源包括人力资源、自然资源和资金条件)。

省略

技术可行性:
对于本游戏,可以使用如VB,Java,Delphi等相关的编程语言,但是考虑到编写程序的难易程度以及对编译语言的了解程度,本游戏选择Java程序语言作为编程语言。需要对变量定义、变量初始化、界面初始化、游戏初始化等,然后就可以进入游戏,处理游戏过程中的各种操作。

省略

程序设计思路:
对于工人的操作很简单:4个方向的移动,工人移动箱子也随之移动。

地图数据最为关键:第一关的地图都要更换,这些位置也要变,首先我们设计一个二维数组map.我们所地图想象成一个网格,每个格子就是图片的大小30像素,工人和箱子每步移动的距离也是30像素

假设工人移动方式向右,其它方向原理是一致的,P1、P2分别代表工人移动趋势方向前的两个方格
(1)前方P1是围墙:
如果工人前方是围墙 {
退出规则判断,布局不做任何改变
}
(2)前方P1是通道或目的地
如果工人前方是通道或目的地 {
工人可以进入到P1方格,修改相关位置的格子状态值
}
(3)前方P1是箱子
在这种情况,需要判断箱子(P1)前方P2处的物体,来判断工人是否可以移动,此时有以下可能:
一、P1处为箱子(BOX)或者放到目的地的箱子,P2处为通道:工人可以进到P1方格,P2方格的状态可以修改为箱子,修改相关格子的状态值

二、P1处为箱子或者放到目的地的箱子,P2处为目的地:工人可以进到P1方格,P2处为放到目的地的箱子,修改相关格子的状态值

三、P1处为箱子,P2处为墙:退出判断规则布局不做任何改变

1.1.4 平台选择
Eclipse是一个开放源代码的软件开发项目,专注于为高度集成的工具开发提供一个全功能的、具有商业品质的工业平台。它主要由Eclipse项目、Eclipse工具项目和Eclipse技术项目三个项目组成,具体包括四个部分组成——Eclipse Platform、JDT、CDT和PDE。JDT支持Java开发、CDT支持C开发、PDE用来支持插件开发,Eclipse Platform则是一个开放的可扩展IDE,提供了一个通用的开发平台。它提供建造块和构造并运行集成软件开发工具的基础。

省略

1.2 需求分析
1.2.1 引言
省略

1.2.2 游戏需求
玩家是通过对小人的移动操作来控制推动箱子的,并且玩家需要避过障碍物以及死角,才能将其推放到指定位置从而达到过关的目的。如果玩家将箱子推入死角导致箱子无法移动或不能移动到指定位置则闯关失败,可以通过悔步或重新开始等操作来重新挑战本关。

1、能够显示主菜单和功能
游戏需要提供主菜单让玩家进行游戏设置,同时能能够把地图文件中的信息转换成为图像显示到主游戏界面上。

2、能够实现键盘操作功能
能够接收到键盘输入的方向键信息,并根据不同的方向键把游戏任务移动到相应的位置,例如,当玩家单击方向键“上”时,如果向上的位置是可移动的,那么就当把游戏人物向上移动一个方格。

3、能够把放置到位置上的箱子进行变色显示
当玩家把箱子推到指定位置的格子时,需要把这个箱子进行变色。这样就能明确地显示出该箱子是否已经放置到指定位置上。

4、支持游戏扩展功能
玩家可以自己扩展原游戏地图文件,从而生成新的游戏地图。

5、游戏胜负判断功能
在游戏中,当玩家把全部的箱子都推到箱子放置点时,玩家胜利通过当前游戏关口,进行下一关口的游戏,如果玩家无法将指定的箱子全部推到放置点时,玩家失败。玩家可以选择重新进行当前关口的游戏,还是退出游戏。

6、支持关口选择功能
玩家在游戏中可自行选择需要挑战的关口。

7、游戏提供支持背景音乐功能
通过主菜单,在游戏开始后,可以选择播放或者禁止播放背景音乐。

8、系统数据流图(DFD)
1)顶层数据流图

2)0层数据流图

3)1层数据流图

1.2.3 软硬件需求
硬件环境需求:
CPU:Intel i5-6500;
内存:4G;
内存剩余资源:500M;

软件环境需求:
JDK 1.7及其以上的版本。
Eclipse MRAS。

1.2.4 接口控制
使用键盘的接口控件操作,上下左右相关键位控制小人的移动。
addKeyListener
public void addKeyListener(KeyListener l)

添加指定的按键侦听器,以接收发自此组件的按键事件。如果 l 为 null,则不会抛出异常并且不执行动作。

Java.awt.event
接口 KeyListener
用于接收键盘事件(击键)的侦听器接口。旨在处理键盘事件的类要么实现此接口(及其包含的所有方法),要么扩展抽象 KeyAdapter 类(仅重写有用的方法)。

然后使用组件的 addKeyListener 方法将从该类所创建的侦听器对象向该组件注册。按下、释放或键入键时生成键盘事件。然后调用侦听器对象中的相关方法并将该 KeyEvent 传递给它。

方法摘要
void keyPressed(KeyEvent e)
按下某个键时调用此方法。
void keyReleased(KeyEvent e)
释放某个键时调用此方法。
void keyTyped(KeyEvent e)
键入某个键时调用此方法。

1.3 方案论证
学校开设的关于学习编程语言的课程有C语言、C++语言、Java程序语言等,皆可用于编写推箱子小游戏的程序。不同的语言有其不同的特点和优势,下面来逐一分析一下。
1.3.1 C++语言的优点
C++语言支持几乎所有的面对象程序设计特征。可以说,C++语言集中体现了近20年来在程序设计和软件开发领域出现的新的思想和新技术,这主要包括:
(1)抽象数据类型。
(2)封装和信息隐藏。
(3)以继承和派生方式实现程序重用。
(4)以运算符重载和虚函数来实现多态性。
(5)以模版来实现类型的参数化。
省略

1.3.2 Java语言的优点
Java语言的流行除了因为它能够编制嵌入HTML文件中的Applet外,还在于Java语言本身的面向对象、简单、平台无关性、安全性、多线程等特点。其次,Java语言的结构与编写方式,与C++语言类似,因此学习Java语言,不仅要了解Java语言独有的编程特点,同时还要有程序设计基础和面向对象的概念。
省略

1.3.3 C语言的优点
C语言是一种计算机程序设计语言。它既具有高级语言的特点,又具有汇编语言的特点。
它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。

省略

1.3.4 方案选择
省略

因此,经过再三比较三种语言之后,采用了Java语言来编写推箱子小游戏的程序代码。

各类语言使用热度如下图1-2所示:

图1-2 编程语言使用热度排行

图1-3热门编程语言使用热度变化曲线

2 概要设计
概要设计是一个设计师根据用户交互过程和用户需求来形成交互框架和视觉框架的过程,其结果往往以反映交互控件布置、界面元素分组以及界面整体板式的页面框架图的形式来呈现。
省略

2.1 游戏设计分析
分析对象的技巧在于它的重复利用及维护效率。如果要把设计出来的程序在不同的显示平台上执行,就要作大幅度的更动甚至重写,这样就失去了面向对象属性,所以在本程序分析时将不变与易变的因素分别做成对象,如地图文件、小人与箱子的移动以及程序的运算逻辑就是不变的项目,而绘图及显示平台会因为环境而有所不同属于易变的项目。

此次推箱子游戏需要用到Java GUI来对界面和图形进行编程。GUI全称Graphical User Interfaces,意为图形用户户界面,又称为图形用户接口,GUI指的就是采用图形方式显示的计算机操作用户界面, 实现GUI编程的必不可少的三个条件是组件、事件

AWT组件
AWT组件是重量级组件,它依赖于本地操作系统的GUI,缺乏平台独立性。但是AWT组件简单稳定,兼容于任何一个JDK版本。AWT所涉及到的类一般在Java.awt的包及其子包中。Java.awt中的类负责与本地操作系统进行交互,让本地操作系统显示和操作组件。AWT中的两个核心类是Container(容器)和Component类,如下图所示:

图2-1 Container和Component类

Component类
Java图形用户界面最基本组成部分是Component,Component类及其子类的对象用来描述以图形化的方式显示在屏幕上并能够与用户进行交互的GUI元素(标签、按钮)。

Container类
用来组织界面上的组件或者单元。有两种常用的Container(容器),一是Window,Window对象表示自由停泊的顶级窗口,另一个是Panel对象可作为容纳其他Component对象,但不能够独立存在,必须被添加到其他Container中,比如说Window或者Applet中。Container它有一定的范围和大小,一般都是矩形。也有一定的位置,这个位置可分相对位置和绝对位置。

一个Container中可以包含其他Container,Container中可以嵌套Container,当Container显示时候,它里面的元素也被小时出来,当Container隐藏时或者关闭时,它包含的元素也被隐藏。

事件
事件是指组件触发的动作事件,Java中不同的事件由不同的监听器处理,组件是事件源对象,而监听器主要用来接收来自事件源对象产生的动作事件,然后对其处理。

需要特别注意的是:
事件实现过程中产生的对象:事件、事件源、监听器。
事件:用户在界面上的某一个操作,通常使用各种输入设备,如鼠标、键盘等。

事件源:产生事件的组件,例如在一个按钮上的单击就是事件源。

事件监听
监听器:包含事件处理器,负责检查事件是否发生,若发生则激活事件处理器对其处理。

监听过程: 当事件源对象产生某种事件时,先封装该事件的信息,然后向监听器传送此事件对象,监听器在接收到事件对象后,为了能让监听器检查组件是否发生了该事件,会向该事件源对象(即该组件)注册事件监听器,然后事件处理器会检查事件是否发生,如果发生了,那么激活事件处理器进行处理。

从面向对象的观念出发,本程序可分为以下几个对象:
1.地图文件的引用。
2.小人与箱子的移动。
3.程序运算逻辑。
4.绘图。
5.显示平台。

2.1.1 地图文件的引用
在设计游戏程序时,通常都是把游戏的画面布局数据存放在一个地图文件中。程序通过读取地图文件中的数据来获取画面的布局安排。

地图文件是20*20的变量数组文件,在地图不同的数字代表不同的意义。把这组数据保存到一个文件中,这个文件就是地图文件了。

Java读取txt文件内容。可以作如下理解:
1、首先获得一个文件句柄。File file = new File(); file即为文件句柄。即为两个端建立联系。
2、通过这条线路读取甲方的信息:new FileInputStream(file) 目前这个信息已经读进来内存当中了。接下来需要解读成乙方可以理解的东西
3、使用FileInputStream()。那么对应的需要使用InputStreamReader()这个方法进行解读刚才装进来内存当中的数据
4、解读完成后要输出呀。那当然要转换成IO可以识别的数据呀。那就需要调用字节码读取的方法BufferedReader()。同时使用bufferedReader()的readline()方法读取txt文件中的每一行数据。

部分代码如下:

  public static void readTxtFile(String filePath){try {String encoding="GBK";File file=new File(filePath);if(file.isFile() && file.exists()){ //判断文件是否存在InputStreamReader read = new InputStreamReader(new FileInputStream(file),encoding);//考虑到编码格式BufferedReader bufferedReader = new BufferedReader(read);String lineTxt = null;while((lineTxt = bufferedReader.readLine()) != null){System.out.println(lineTxt);}read.close();}else{System.out.println("找不到指定的文件");}} catch (Exception e) {System.out.println("读取文件内容出错");e.printStackTrace();}}public static void main(String argv[]){String filePath = "L:\\Apache\\htdocs\\res\\20121012.txt";readTxtFile(filePath);}

2.1.2 程序运行逻辑
程序中逻辑运算包含小人与箱子的移动、键盘事件的响应、保存数据以实现悔步以及重新开始的操作等等。

运行游戏载入相应的地图,屏幕中出现一名推箱子的工人其周围是围人可以走的通道、几个可以移动的箱子、和箱子的放置目的地。玩家通过按上下左右键控制工人推箱子、当所有的箱子推到目的地后出现过关信息,并显示下一关。

如果推错了,玩家通过单击鼠标右键可以撤消上次的移动操作、还可以按空格键重玩这一关,直到通过全部关卡。
游戏中我们用到的是二维数组来完成游戏的基础绘图。

2.1.3 绘图
绘图主要是用于在小人与箱子的移动后,原位置由草地填补,以此来表示小人与箱子的移动以及其画面的连贯性。
部分代码如下:
绘制地图:

mainpanel(){ setBounds(15,50,600,600);setBackground(Color.white);addKeyListener(this);myImage=new Image[10];for(int i=0; i<10; i++){myImage[i] = Toolkit.getDefaultToolkit().getImage("pic\\"+i+".gif");}setVisible(true);判断运动方向和填补空白:
void moveup(){if(map[manY-1][manX]==2||map[manY-1][manX]==4){if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)map[manY][manX]=4;else map[manY][manX]=2;map[manY-1][manX]=8;repaint();manY--;mystack.push(10);}else if(map[manY-1][manX]==3){if(map[manY-2][manX]==4){if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)map[manY][manX]=4;else map[manY][manX]=2;map[manY-1][manX]=8;map[manY-2][manX]=9;repaint();manY--;mystack.push(11);}else if(map[manY-2][manX]==2){if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)map[manY][manX]=4;else map[manY][manX]=2;map[manY-1][manX]=8;map[manY-2][manX]=3;repaint();manY--;mystack.push(11);}else {map[manY][manX]=8;repaint();}}else if(map[manY-1][manX]==9){if(map[manY-2][manX]==4){if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)map[manY][manX]=4;else map[manY][manX]=2;map[manY-1][manX]=8;map[manY-2][manX]=9;repaint();manY--;mystack.push(11);}else if(map[manY-2][manX]==2){if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)map[manY][manX]=4;else map[manY][manX]=2;map[manY-1][manX]=8;map[manY-2][manX]=3;repaint();manY--;mystack.push(11);}else {map[manY][manX]=8;repaint();}}if(map[manY-1][manX]==1){map[manY][manX]=8;
repaint();}}

2.1.4 显示平台
省略

2.2 注意事项
小游戏在设计时要注意绘图部分的设计代码,还要注意通过输入流读取地图文件与图像文件部分的设计代码等等。

2.3 游戏流程图

图2-4系统功能模块

本程序包括5个模块,分别是初始化模块、画图模块、移动箱子模块、移动小 模块和功能控制模块,如图1所示。各个模块的功能描述如下:
(1)初始化模块。该模块包括屏幕初始化和游戏第一关的初始化。屏幕初始化用于输出欢迎信息和操
(2)画图模块。该模块主要是被其它模块调用,用于画墙、在空地画箱子、在目的地画箱子、画小人和画目的地。
(3)移动箱子模块。该模块用于移动箱子,包括目的地之间、空地之间和目的地与空地之间的箱子移动。
(4)移动小人模块该模块用于控制小人移动,从而推动箱子到目的地。
(5)功能控制模块。该模块是几个功能函数的集合,包括屏幕输出功能、指定位置状态判断功能和关卡重置功能。

2.4 函数模型

图2-5函数模型图

1.putoutChar()
函数原型:void putoutChar(int y,int x,char ch,char fc,char bc) putoutChar()函数在屏幕上的指定位置输出指定的字符。其中,x、y指明输出的位置,ch表示输出的字符,fc表示输出的字符颜色,bc 表示背景色。

2.printWall()
函数原型:void printWall(int x,int y) printWall()函数用于画墙壁,传入参数x、y指明位置。该函数调用putoutChar()进行输出,以黑色为背景画绿色墙,用小方块表示墙(ASCII值为219)。

3.printBox()
函数原型:void printBox(int x,int y) printBox()函数用于在非目的地画箱子,传入参数x、y指明位置。该函数调用putoutChar()进行输出,以黑色为背景白色箱子,用ASCII值为10的字符表示箱子。

4.printBoxDes()
函数原型:void printBoxDes(int x,int y) printBoxDes()函数用于在目的地画箱子,传入参数x、y指明位置。该函数调用putoutChar()进行输出,以黑色为背景画黄色箱子,仍用ASCII值为10的字符表示箱子。

5.printDestination()
函数原型:void printDestination(int x,int y) printDestination()函数用于画目的地,传入参数x、y指明位置。该函数调用putoutChar()进行输出,以黑色为背景画黄色目的地,用心型表示(ASCII值为003)。

6.printDestination1()
函数原型: void printDestination1(int x,int y,winer **win,winer **pw) printDestination1()函数与printDestination()函数功能基本相同,都是画目的地函数,但是printDestination1()增加了记录每一个目的地位置的功能。其中x、y指明目的地的位置,每一关的所有目的地位置存放在结构体struct winer中,形成一条链表,**winer返回链表的头,**pw则指向链表的尾部。

7.printMan()
函数原型: void printMan(int x,int y) printMan()函数用于画小人。X、y指明画的位置。该函数通过软中断来实现,首先设置寄存器AX的高位和低位,设置高位0xa表示在光标位置显示字符;设置低位02(ASCII值),表示输出的字符;然后设置寄存器CX为01,表示重复输出的次数,这里只输出一次;最后产生类型为0x10的中断,表示显示器输出。

8.init()
函数原型: void init() init()函数用于初始化屏幕。该函数首先用两个for循环初始化屏幕20*20范围内的状态,初始化为0,以后根据实际情况重新赋值;然后设置屏幕输出状态,最后移动光标到指定的位置输出操作提示信息以及版权信息。

9.初始化游戏
函数原型:level(); 这个函数分别初始化游戏的第一关。这些函数的功能和实现步骤相似。首先根据需要在指定的位置画墙壁和画箱子,在这里可以设置游戏的难度,初始化的墙壁越复杂,箱子越多,则游戏就越难。游戏的第一关至第四关难度依次增加。然后分别调用printDestination1()和printMan()函数画目的地和小人。函数返回包含各个目的地位置的链表。

10.移动箱子
函数原型: void moveBoxSpacetoSpace(int x,int y,char a)、void moveBoxDestoSpace(int x,int y, char a)、void moveBoxSpacetoDes(int x,int y,char a)、void moveBoxDestoDes(int x,int y,char a) 这几个函数实现的功能分别是人空地移动箱子到空地、从目的地移动箱子到空地、从空地移动箱子到目的地和中从目的地移动箱子到目的地。X、y指明小人当前所处的位置,字符a表示移动的方向,有“u”、“d”、“l”和“r”4个值,分别表示向上、下、左、右移动。这几个函数的实现原理大致相似。对于前面两个函数,首先判断移动的方向,人小人所在的位置沿着移动的方向移动一步画小人,移动两步画箱子(调用printBox()函数),并设置状态为“b”;对于后面两个参数,首先判断移动的方向,从小人所在的位置沿着移动方向移动一步画小人,移动两上在目的地画箱子(调用printBoxDes()函数),并设置状态为“i”,表明箱子在目的地上。

11.isWin()
函数原型: Judge(),int judge(int x,int y) judge()根据结构体struct[x][y]中存的值来判断该点的状态。

12.move()
函数原型: void moid(int x,int y,char a) Move()函数根据按下的键来处理小人的移动。小人移动的方向有上(MoveUp())、下(MoveDown())、左(MoveLeft())、右(MoveRight())4个,4个方向的处理方式一样。首先判断移动的方向,然后根据小人的当前位置、下一步位置以及下下一步位置所在的状态进行处理。
(1)若下一步所在位置的状态为墙壁(“w”),则直接退出,不作任何处理。

(2)若下一步所在位置的状态为目的地(“i”)或者什么都没有(“0”),则: ① 若当前位置的状态为目的地,则在当前位置画目的地(调用printDestination()函 数)、在下一步位置画小人(调用printMan()函数)。 ② 若当前位置的状态为非目的地,则输出空格清空当前位置的小人,并在下一步位置画 小人(调用printMan()函数)。

(3)若下一步所在位置的状态为箱子(“b”),则:
① 如果下下一步位置的状态为“0”,则把箱子从空地移动到空地(调用 moveBoxSpacetoSpace()函数),然后把光标移动到下一步位置(如果当前位置的状态为目的地,则应先画目的地(调用printDestinanion()函数))。
② 如果下下一步位置的状态为目的地,则把箱子从空地移动到目的地(调用 moveBoxSpacetoDes()函数),然后把光标移动到下一步位置(如果当前位置的状态 为目的地,则应先画目的地(调用printDestination()函数))。
③ 其它情况则直接返回,不作任何处理。

(4)若下一步所在位置的状态为箱子在目的地(“i”),则:
① 如果下下一步位置的状态为“0”,则把箱子从目的地移动到空地(调用 moveBoxDestoSpace()函数),然后把光标移动到下一步位置(如果当前位置的状态为目的地,则应先画目的地(调用printDestination()函数))。
② 如果下下一步位置的状态为目的地,则把箱子从目的地移动到目的地(调用 moveBoxDestoDes()函数),然后把光标移动到下一步位置(如果当前位置的状态为目的地,则应先画目的地(调用printDestination()函数))。
③ 其它情况则直接返回,不作任何处理。

13.reset()
函数原型:void reset(int i) reset()函数的功能是重置当前关。该函数首先判断当前关是第几关,然后调用init()函数和初始化当前关的函数进行重置。

14.主函数
主函数首先进行显示状态的设置,初始化屏幕,初始化第一关,并显示操作提示信息和版权信息。然后根据按下的键(KeyPress()函数返回按下的键值)进行处理,处理过程由move()类函数进行(如果按下Esc键,则退出程序)。对于每一关,如果所有的表示目的地的状态都由“false”变成了“true”,则表示通过该关,可以进入下一关。

3 详细设计
3.1 游戏总体结构与代码
推箱子的小游戏界面如图3-1所示:

图3-1小游戏界面

(1)界面框架与按钮设计
本游戏界面简单清晰,操作界面优美,有很强的带入性,游戏操作模块分为:“悔一步”,“重来”,“上一关”,“下一关”,“第1关”,“最终关”,“选关”“音乐关”并且各个按钮的名称与相关功能为:
“悔一步”:返回上一移动状态(可以连续返回多步);
“重来”:重新开始当前关;
“上一关”:返回到当前关的上一关;
“下一关”:跳转到当前关的下一关;
“第1关”:游戏系统默认开始关为第一关,此按钮让玩家可以方便从其它关卡直接跳转到第一关;
“最终关”:可以跳转到最后一关,即游戏系统默认的最后一个关。

mainFrame(){super("推箱子v2.0");setSize(720,720);setVisible(true);setResizable(false);setLocation(300,20);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);Container cont=getContentPane();cont.setLayout(null);cont.setBackground(Color.black);Menu choice=new Menu("    选项");choice.add(renew);choice.add(last);choice.add(next);choice.add(choose);choice.add(back);choice.addSeparator();choice.add(exit);renew.addActionListener(this);last.addActionListener(this);next.addActionListener(this);choose.addActionListener(this);exit.addActionListener(this);back.addActionListener(this);Menu setmuc=new Menu("    设置音乐")setmuc.add(nor);setmuc.add(qin);setmuc.add(po);setmuc.add(guang);setmuc.add(eye);nor.addActionListener(this);qin.addActionListener(this);po.addActionListener(this);guang.addActionListener(this);eye.addActionListener(this);Menu help=new Menu("    帮助");help.add(about);about.addActionListener(this);MenuBar bar=new MenuBar();bar.add(choice);bar.add(setmuc);bar.add(help);setMenuBar(bar);
}

3.2 选关模块
“选关”:选择想要挑战的关卡。当游戏玩家想要自主选择关卡时,可以随意输入想要跳入的关卡,节约了时间,玩家同过选择的关卡可以有效地挑战自我,连接上次的游戏进度。
其中,这个部分的部分代码为:

void Tuixiangzi(int i){Levelmap=new Readmap(i);Levelmaptmp=new Readmap(i);map=Levelmap.getmap();manX=Levelmap.getmanX();manY=Levelmap.getmanY();maptmp=Levelmaptmp.getmap();repaint();}int maxlevel(){return max;}public void paint(Graphics g){for(int i=0; i<20; i++)for(int j=0; j<20; j++){g.drawImage(myImage[map[j][i]],i*len,j*len,this);}      g.setColor(new Color(0,0,0));g.setFont(new Font("楷体_2312",Font.BOLD,30));g.drawString("现在是第",150,40);g.drawString(String.valueOf(level),310,40);g.drawString("关",360,40);}

推箱子选关模式如图3-2所示

图3-2 选关模块

3.3 地图的绘制形成
地图以二维数组的形式进行存储,不同的数家代表了不同的含义。在本小游戏的地图文件中,0~9这十个数字的定义如下所示:
编号0:代表未定义的区域;
编号1:代表障碍物(或者边界);
编号2:代表草地;
编号3:代表箱子(未到指定位置);
编号4:代表目的地;
编号5:代表小人向下移动方向;
编号6:代表小人向左移动方向;
编号7:代表小人向右移动方向;
编号8:代表小人向上移动方向;
编号9:代表到达指定位置时的箱子。

例如下图3-3所示(左边是二维数组的地图文件,右边是相对应的小游戏界面):

图3-3 地图文件与相应界面

推箱子小游戏的游戏性,其主要功能是给用户一个良好的游戏界面,游戏中包括50关的地图文件。地图文件是是先写好的,所有界面信息以数的形式存放在一个20*20的二维数组当中并且把这些地图文件统一放在一个地图文件中,便于程序调用地图文件。然后,每一关就会按照这些数组数据重新绘制地图,从而达到小游戏的可用性及其相应的目的。

推箱子地图文件如图3-4所示:

图3-4地图文件
部分代码如下所示:

private int[][] mymap=new int[20][20];
FileReader r;
BufferedReader br;
String bb="";
int[] x;int c=0;
Readmap(int k)
{level=k;String s;File f=new File("maps\\"+level+".map");r=new FileReader(f);br=new BufferedReader(r);}while ((s=br.readLine())!=null){bb=bb+s;}byte[] d=bb.getBytes();int len=bb.length();int[] x=new int[len];for(int i=0;i<bb.length();i++)x[i]=d[i]-48;for(int i=0;i<20;i++){for(int j=0;j<20;j++){mymap[i][j]=x[c];if(mymap[i][j]==5){mx=j;my=i;}c++;}}

3.4 小人与箱子移动的算法
小人与箱子的移动中包括了正移动以及“悔一步”的负移动。
正移动:小人向上、下、左、右的移动是一个判断算法,其判断都是通过判断小人前面是否是草地或者是箱子或者是障碍物(或者边界)。如果是障碍物或者是边界,就不能够进行移动;如果是没有箱子或者是障碍物,就可以自由移动;又如果是有箱子,就要判断是否可以移动箱子,最后再讨论箱子被推过的位置,小人移动的位置,以及它们的原位置和被遮挡住的新位置的图形变化等等,需要运用算法使其重新绘制地图,填补空白。算法判断完毕后,传出数据并且将其记录在一个堆栈中,以备“悔一步”时使用。

负移动:通过记录在堆栈中的数据来判断,前一步小人的移动方向以及移动中使用过的算法,逆向将代码重新运行,同时绘制并刷新地图以达到前一步的状态。
其中,这个部分的部分代码为:

void moveup(){if(map[manY-1][manX]==2||map[manY-1][manX]==4){if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)map[manY][manX]=4;else map[manY][manX]=2;map[manY-1][manX]=8;repaint();manY--;mystack.push(10);}else if(map[manY-1][manX]==3){if(map[manY-2][manX]==4){if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)map[manY][manX]=4;else map[manY][manX]=2;map[manY-1][manX]=8;map[manY-2][manX]=9;repaint();manY--;mystack.push(11);}else if(map[manY-2][manX]==2){if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)map[manY][manX]=4;else map[manY][manX]=2;map[manY-1][manX]=8;map[manY-2][manX]=3;repaint();manY--;mystack.push(11);}else {map[manY][manX]=8;repaint();}}else if(map[manY-1][manX]==9){if(map[manY-2][manX]==4){if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)map[manY][manX]=4;else map[manY][manX]=2;map[manY-1][manX]=8;map[manY-2][manX]=9;repaint();manY--;mystack.push(11);}else if(map[manY-2][manX]==2){if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)map[manY][manX]=4;else map[manY][manX]=2;map[manY-1][manX]=8;map[manY-2][manX]=3;repaint();manY--;mystack.push(11);}else {map[manY][manX]=8;repaint();}}if(map[manY-1][manX]==1){map[manY][manX]=8;repaint();}}

3.5 小人上下移动模块
在本小游戏系统中,小人与箱子的移动应该是能带给玩家较为逼真的视觉感受,这样才能体现系统的有效性与娱乐性。玩家通过控制小人,推动箱子在草地上避过障碍物与边界死角来到达指定的终点位置。
其中,这个部分代码分为上下左右移动。其中代码原理相同,转向利用下一步位置的判断。

void moveleft(){……}
void movedown(){……}
void moveright(){……}小人向后转的代码如下:
void backup(int t){int n=t;if(n==10){if(maptmp[manY][manX]==4||maptmp[manY][manX]==9){map[manY][manX]=4;}else map[manY][manX]=2;}else if(n==11){if(maptmp[manY][manX]==4||maptmp[manY][manX]==9){map[manY][manX]=9;}else map[manY][manX]=3;if(maptmp[manY-1][manX]==4||maptmp[manY-1][manX]==9){map[manY-1][manX]=4;}else map[manY-1][manX]=2;}map[manY+1][manX]=8;repaint();manY++;}

小人移动如图3-5所示:

图3-5 小人移动

3.6 悔棋模块
在推箱子小游戏中,数据的存储是非常重要的,不然就无法进行“悔一步”的操作。本小游戏系统受用了堆栈的存储方式来存储并且控制小人与箱子的移动以及地图文件的变换。而“悔一步”的操作让玩家可以进行反悔这一步操作,可避免因一时失手走错而导致的阻塞书面,可以节省玩家重新开始的时间。
其中,这个部分的部分代码为:

else if(e.getSource()==btnback||e.getSource()==back){if(panel.isMystackEmpty())JOptionPane.showMessageDialog(this, "您还未移动!!!");else{switch(panel.back()){case 10:panel.backup(10);break;case 11:panel.backup(11);break;case 20:panel.backdown(20);break;case 21:panel.backdown(21);break;case 30:panel.backleft(30);break;case 31:panel.backleft(31);break;case 40:panel.backright(40);break;case 41:panel.backright(41);break;}}

推箱子悔棋如图3-6所示:

图3-6悔棋模块

3.7 音乐控制
在推箱子小游戏中,音乐的选择是非常重要的,通过音乐选择可以提高游戏的娱乐性。让游戏玩家可以再轻松越快的环境中进行游戏,同时游戏的随关卡转换也是本次设计的一大特点。使用了Java MIDI技术中的Sequence类和Sequencer容器和其中的getSequence()方法等。
其中,这个部分的部分代码为:

public void itemStateChanged(ItemEvent ie){int no=jc.getSelectedIndex();switch(no){case 0:sound.setMusic("nor.mid");if(sound.isplay())sound.mystop();sound.loadSound();btnmuc.setLabel("音乐关");nor.setEnabled(false);qin.setEnabled(true);guang.setEnabled(true);eye.setEnabled(true);po.setEnabled(true);
panel.requestFocus();
break;case 1:sound.setMusic("qin.mid");if(sound.isplay())sound.mystop();sound.loadSound();btnmuc.setLabel("音乐关");nor.setEnabled(true);qin.setEnabled(false);guang.setEnabled(true);eye.setEnabled(true);po.setEnabled(true);
panel.requestFocus();
break;case 2:……case 3:……case 4:sound.setMusic("eyes on me.mid");if(sound.isplay())sound.mystop();sound.loadSound();btnmuc.setLabel("音乐关");nor.setEnabled(true);qin.setEnabled(true);guang.setEnabled(true);eye.setEnabled(false);po.setEnabled(true);
panel.requestFocus();break;}

运行结果如图3-7所示:

图3-7 音乐选择

4 游戏测试
4.1 软件测试
4.1.1 软件测试简介
省略

4.2 测试方法
软件测试方法可以分为静态测试和动态测试。
省略

4.3 测试步骤
有效的软件测试实际上分为4步进行,即:单元测试、集中测试、确认测试、系统测试。
省略
总的来说测试包括一下基本流程和步骤:

4.4 游戏系统性能分析
经过对系统进行测试和运行。总结出游戏系统性能如下:
(1)界面友好,游戏操作方便
系统风格可爱,界面简单,功能较完善,游戏操作简单。
(2)系统响应较快,运行较稳定
在系统运行时,游戏过程中的消息响应处理很快,且系统整体运行安全且稳定。
(3)部分系统功能仍需完善
由于开发时间等方面的原因,该系统还可以在联网进行玩家比赛、难度调节等方面予以完善。

5 项目经验与总结
省略

6 参考文献
[1].胡海星. 推箱子游戏——2002年第2期题解[J]. 程序员,2002,(04):101-102.
[2].鲁帅. 推箱子游戏中AI的实现[J]. 电脑编程技巧与维护,2010,(19):78-79.
[3].Java面向对象程序设计[M]. 北京:清华大学出版社,2003
[4].赵英. 基于移动设备的游戏软件的研究与开发[D].南昌大学,2011.
[5].潘惠勇,夏敏捷. Java实现2.5D推箱子游戏[J]. 电脑编程技巧与护,2014,(19):28-31+56.
[6].周凤英 ,文惺. Java游戏开发Step by Step系列——Java游戏开发规则[J]. 电脑爱好者,2003,(13):116
[7].曾佑新. Java程序设计.科学出版社,2007:124~400
[8].《Thinking in Java》,Bruce Eckel,机械工业出版社,2005年
[9].KarenLeland. Course Management System Applications and Implements.Oversea Publishing House,2006:120~333
[10] Steven John Metsker William C Wake,Java设计模式.北京:人民邮电出版社,2006:132~463

7 致谢
省略

8 外文原文及中文翻译
省略

文献翻译:
省略


5、源码下载:

本项目源码及论文如下,有需要的朋友可以点击进行下载。如果链接失效可点击下方卡片扫码自助下载。

序号 毕业设计全套资源(点击下载)
本项目源码 基于java+swing+Eclipse的推箱子游戏设计与实现(源码+文档)_JAVA_swing_Eclipse_推箱子游戏

【java毕业设计】基于java+swing+Eclipse的推箱子游戏设计与实现(毕业论文+程序源码)——推箱子游戏相关推荐

  1. java毕业设计——基于JSP+sqlserver的网络在线考试系统设计与实现(毕业论文+程序源码)——在线考试系统

    基于JSP+sqlserver的网络在线考试系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于JSP+sqlserver的网络在线考试系统设计与实现,文章末尾附有本毕业设计的论文和源码下 ...

  2. Android毕业设计——基于Android+Tomcat的网络视频探索系统设计与实现(毕业论文+程序源码)——网络视频探索系统

    基于Android+Tomcat的网络视频探索系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于Android+Tomcat的网络视频探索系统设计与实现,文章末尾附有本毕业设计的论文和源 ...

  3. asp毕业设计—— 基于asp+access的软件信息发布系统设计与实现(毕业论文+程序源码)——软件信息发布系统

    基于asp+access的软件信息发布系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+access的软件信息发布系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需 ...

  4. asp毕业设计——基于asp+access的教师档案管理系统设计与实现(毕业论文+程序源码)——教师档案管理系统

    基于asp+access的教师档案管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+access的教师档案管理系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需 ...

  5. C#毕业设计——基于C#+asp.net+Access的视频点播系统设计与实现(毕业论文+程序源码)——视频点播系统

    基于C#+asp.net+Access的视频点播系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于C#+asp.net+Access的视频点播系统设计与实现,文章末尾附有本毕业设计的论文 ...

  6. C#毕业设计——基于C#+asp.net+sqlserver作业审阅系统设计与实现(毕业论文+程序源码)——作业审阅系统

    基于C#+asp.net+sqlserver作业审阅系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于C#+asp.net+sqlserver作业审阅系统设计与实现,文章末尾附有本毕业设 ...

  7. asp毕业设计—— 基于asp+access的企业人力资源管理系统设计与实现(毕业论文+程序源码)——人力资源管理系统

    基于asp+access的企业人力资源管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+access的企业人力资源管理系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地 ...

  8. asp毕业设计——基于asp+sqlserver的教学互动管理系统设计与实现(毕业论文+程序源码)——教学互动管理系统

    基于asp+sqlserver的教学互动管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+sqlserver的教学互动管理系统设计与实现,文章末尾附有本毕业设计的论文和源码下 ...

  9. asp毕业设计—— 基于asp+access的客户管理信息系统设计与实现(毕业论文+程序源码)——客户管理信息系统

    基于asp+access的客户管理信息系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+access的客户管理信息系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦. ...

  10. asp毕业设计——基于asp+sqlserver的在线手机销售系统设计与实现(毕业论文+程序源码)——在线手机销售系统

    基于asp+sqlserver的在线手机销售系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+sqlserver的在线手机销售系统设计与实现,文章末尾附有本毕业设计的论文和源码下 ...

最新文章

  1. ImportError: cannot import name ‘secure_filename‘的解决办法
  2. JavaScript之表单元素操作
  3. Facebook:正变为下一个微信?
  4. 在数组中找出3个数使得它们和为0
  5. 【线上直播】Xilinx U30 视频转码 + AI 的应用技术实践
  6. Button with Round Progress
  7. Ubuntu 实现点击菜单栏图标最小化程序
  8. Kubernetes Scheduler Deep Dive
  9. 软件基本功能测试用例,测试用例实例—常见功能测试点().docx
  10. BP神经网络时间序列预测-附代码
  11. PS技巧一-----镜头光晕
  12. 一个程序员绝对真实的生活感悟
  13. 小米商城官网(登录页,首页,详情页,我的购物车页,我的订单页,确认订单页)HTML+CSS+JS
  14. 架构师的工作都干些什么?!想做架构师必看!
  15. 打印钻石图形python_Python pandas高效数据处理之绘图
  16. antdesignpro ProTable 搜索模式自定义搜索字段
  17. 万字详解5G车联网技术
  18. mirai 高效率 QQ 机器人框架
  19. 关于不能用莱布尼兹准则判别级数敛散性时的其中一种方法示例
  20. windows 多种 socket 模型的理解

热门文章

  1. 磨金石教育||商业插画的发展现状如何?学习插画可以月入过万吗?
  2. knex简单的增删改查
  3. win7计算机时间显示错误,win7系统时间怎么调总是不对如何解决?win7系统时间总是不对解决方法...
  4. uva 11800 Determine the Shape
  5. Python的学习笔记案例8--空气质量指数计算6.0
  6. 计算机网络打不开怎么办,电脑网页打不开怎么回事
  7. 计算机毕业设计Java-ssmC语言教学辅导网站源码+系统+数据库+lw文档
  8. PUNCH图剖分浅析
  9. nginx逻辑指令笔记(if等)
  10. kdj超卖_如何正确理解KDJ?