admin管理员组

文章数量:1567042

2024年1月13日发(作者:)

精品文档

Java设计报告

1.1设计背景:

经典的推箱子游戏是一个来自日本的古老游戏, 目的是在训练逻辑思考能力。 在一个狭

小的仓库中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住 的情况,所以需要巧妙的利用有限的空间和通道, 合理安排移动的次序和位置,才能顺利的 完成任i欢迎下载

精品文档

务。 一想起这款小游戏,就想起了我的童年,它陪我们这一代度过了一段美好且愉

快的时光。所以想到自己也写一个推箱子游戏,

己的Java设计能力。

既可以享受过去的美好回忆, 又可以锻炼自

1.2设计目的:

综合运用在校期间所学到的理论知识和技能,并且结合课外参考资料,设计开发基于

的推箱子小游戏,让自己能够熟悉并熟练应用系统的开发过程,

JAVA

培养独立思考能力, 检验学

习成果和实际动手能力,以及提高工程实践能力,为今后的工作打下坚实的基础。

1.3游戏需求:

玩家是通过对小人的移动操作来控制推动箱子的,

将其推放到指定位置从而达到过关的目的。

并且玩家需要避过障碍物以及死角, 才能

如果玩家将箱子推入死角导致箱子无法移动或不

能移动到指定位置则闯关失败,可以通过悔步或重新开始等操作来重新挑战本关。

游戏功能需求如下所示:

游戏界面需求:简洁美观的用户界面,可以带给用户自然清晰的画面。

游戏内容需求::小人需要前、后、左、右四张图片,移动中的箱子与终点上的箱子要所有区 别,因此需要两不同的图片以示区别。

键盘处理事件:控制小人与箱子的移动,可通过键盘方向键(上、下、左、右键)对小人进 行上、下、左、右的移动,并且能够推动箱子。

显示需求:当所有箱子都到达指定位置后即可过关,若进入死角则无法过关,需要进行悔步 或重新开始的操作。可以由玩家喜欢选择关卡进行游戏。

2.1游戏设计分析

从面向对象的观念出发,本程序可分为以下几个对象:

地图文件的引用 小人与箱子的移动 程序运算逻辑 绘图 显示平台

分析对象的技巧在于它的重复利用及维护效率。

上执行,就要作大幅度的更动甚至重写,

将不变与易变的因素分别做成对象,

如果要把设计出来的程序在不同的显示平台

这样就失去了面向对象属性,所以在本程序分析时

如地图文件、小人与箱子的移动以及程序的运算逻辑就

是不变的项目,而绘图及显示平台会因为环境而有所不同属于易变的项目。

2.2.1. 地图文件的引用

在设计游戏程序时,通常都是把游戏的画面布局数据存放在一个地图文件中。

地图文件中的数据来获取画面的布局安排。

地图文件是20*20的变量数组文件,在地图不同的数字代表不同的意义。

一个文件中,这个文件就是地图文件了。

把这组数据保存到

程序通过读取

2.2.2. 程序运逻辑

程序中逻辑运算包含小人与箱子的移动、

始的操作等等。

键盘事件的响应、保存数据以实现悔步以及重新开

2欢迎下载

精品文档

2.2.3. 绘图

绘图主要是用于在小人与箱子的移动后,

以及其画面的连贯性。

原位置由草地填补,以此来表示小人与箱子的移动

2.24显示平台

“可移植性高”是 Java的属性之一,Java的应用涉及许多领域,如手机、单机程序及浏览 器等,不同的平台对于它的设定不尽相同,

完整性及移植程序的快速性。

若将显示平台独立为一个类, 将有助于主程序的

3•详细设计

界面图如下:

(1)界面框架与按钮设计

界面设计中包括了所有玩家可以直观见到的图形界面, 窗体的大小,界面中的功能按钮, 让

玩家可以方便使用操作。 界面中的按钮包括:“Regret step ",“Restart ",“The last level ”,

3欢迎下载

精品文档

“The next level ”,“The first pass”,“Select ”。并且各个按钮的名称与相关功能为:

“Regret step ”:返回上一移动状态(可以连续返回多步)

“Restart ”:重新开始当前关;

“The last level ”:返回到当前关的上一关; “The next level ”:跳转到当前关的下一 关;

“The first pass ”:游戏系统默认开始关为第一关,此按钮让玩家可以方便从其它关卡直

接跳转到第一关;

“Select ”:选择想要挑战的关卡。

public class Tuixiangzi

{

public static void main(String[] args)

{

newmainFrame();

}

}

class mainFrame extends JFrame implements ActionListener,ltemListener

{

JLabel lb;

JLabel Ib2;

JButton btnrenew,btnlast,btnnext,btnchoose,btnfirst,btnover,btnmuc,btnback;

mainpanel panel;

Sound sound;

JComboBox jc= newJComboBox();

MenuItem renew= new Menuitem(” Restart");

MenuItem back= newMenultem(” Regret step");

Menuitem last= newMenultem(” The last level");

Menuitem next= newMenultem(” The next level");

Menuitem choose= new Menultem(" 选关");

Menuitem exit= newMenultem(" 退出");

Menultem qin= newMenultem(" 1");

Menuitem po= new Menultem(" 2");

Menuitem guang= new Menuitem(" 3");

Menuitem nor= newMenuitem(" 默认");

Menuitem eye= newMenuitem(" 4");

Menuitem about= new Menuitem(" 关于推箱子...");

mainFrame()

{

super ("推箱子 v2.0");

setSize(720,720);

setVisible( true );

setResizable( false );

setLocation(300,20);

setDefaultCloseOperation(JFrame.

Container cont=getContentPane();

out( null );

EXlT_ON_CLC)SE

4欢迎下载

精品文档

kground(Color.

black);

Menu choice= newMenu(” 选项");

(renew);(last);(next);(choose);(back)

J

arator();(exit);

ionListener( this );

ionListener(

ionListener(

this );

this );

ionListener( this );

ionListener(

ionListener(

Menu setmuc= newMenu("

this );

this );

设置音乐”);

(nor);(qin);(po);(guang);(eye);

ionListener(

ionListener(

this );

this );

ionListener( this );

ionListener( this );

ionListener( this );

Menu help= new Menu("

(about);

ionListener( this );

帮助");

MenuBar bar= newMenuBar();

(choice);(setmuc);(help);

setMenuBar(bar);

bled( false );

lb= new JLabel("JAVA 推箱子 v2.0 版!

! ! ",SwingConstants.

CENTER

lb2= newJLabel("更换音乐",SwingConstants.

CENTER

add(lb);add(lb2);

nds(100,20,400,20);

eground(Color.

white);

nds(625,500,55,20);

eground(Color.

white);

btnrenew= new JButton("Restart");

btnback= newJButton("Regret step");

btnlast= newJButton("The last level");

btnnext= newJButton("The next level");

btnchoose= new JButton(” 选关");

btnfirst= new JButton("The first pass");

btnover= newJButton("The final closing");

btnmuc=new JButton("The music");

add(btnrenew);add(btnlast);add(btnnext);add(btnchoose);add(btnfirst);add(btnover);add(b tnmuc);add(btnback);

nds(625,100,80,30);

ionListener( this ); nds(625,150,80,30);

ionListener( this ); nds(625,200,80,30); ionListener( this );

nds(625,250,80,30); ionListener( this ); nds(625,300,80,30);

5欢迎下载

精品文档

ionListener( this );

nds(625,350,80,30); ionListener( this );

nds(625,400,80,30); ionListener( this );

nds(625,450,80,30); ionListener( this ); nds(625,530,80,20);

m(” 默认"); m('T); m("2"); m("3"); m("4");

mListener( this ); (jc);

sound=new Sound(); sound .lo adSound(); panel= new mainpanel(); add(panel);

ngzi(); tFocus(); validate();

}

(2 )地图的绘制形成

地图以二维数组的形式进行存储, 0~9这不同的数家代表了不同的含义。

十个数字的定义如下所示: 编号0:代表未定义的区域;

编号1 :代表障碍物(或者边界)

编号2:代表草地;

编号3:代表箱子(未到指定位置)

编号4:代表目的地;

编号5:代表小人向下移动方向;

编号6:代表小人向左移动方向;

编号7:代表小人向右移动方向;6欢迎下载

在本小游戏的地图文件中,

精品文档

编号&代表小人向上移动方向; 编号9:代表到达指定位置时的箱子。

F图为数字对应的实际界面

00000000

00000000

00000000

00000000

00000000

00000000

00000000

11000000

41000000

11000000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

00000000

88888888888888888888

(3 )推箱子小游戏的游戏性

其主要功能是给用户一个良好的游戏界面,游戏中包括

写好的,所有界面信息以数家的形式存放在一个

50关的地图文件。地图文件是是先

20*20的二维数组当中并且把这些地图文件

从屈jW! ! !

统一放在一个地图文件中, 便于程序调用地图文件。 然后,每一关就会按照这些数组数据重 新绘制地图,从而达到小游戏的可用性及其相应的目的。

(4 )小人与箱子移动的算法

小人与箱子的移动中包括了正移动以及" Regret step ”的负移动。

正移动:小人向上、下、左、右的移动是一个判断算法,其判断都是通过判断小人前面是否 是草地或者是箱子亦或者是障碍物(或者边界) 。如果是障碍物或者是边界,就不能够进行

又如果是有箱子,就要判断是否可 移动;如果是没有箱子或者是障碍物,就可以自由移动;

以移动箱子,最后再讨论箱子被推过的位置,

住的新位置的图形变化等等,

小人移动的位置, 以及它们的原位置和被遮挡

填补空白。算法判断完毕后, 需要运用算法使其重新绘制地图,

传出数据并且将其记录在一个堆栈中,以备" Regret step ”时使用。

负移动:通过记录在堆栈中的数据来判断, 前一步小人的移动方向以及移动中使用过的算法,

逆向将代码重新运行,同时绘制并刷新地图以达到前一步的状态。

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;

7欢迎下载

精品文档

else map[manY][manX]=2;

map[manY-1][manX]=8;

repaint();manY--;(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--;(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--;(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--;(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--;(11);

}

else {map[manY][manX]=8;repaint();}

8欢迎下载

精品文档

}

if(map[manY-1][manX]==1)

{

map[manY][manX]=8;repaint();

}

}

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++;

}

void movedown()

{

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]=5;

repaint();manY++;(20);

}

else if(map[manY+1][manX]==3)

{

if(map[manY+2][manX]==4)

9欢迎下载

精品文档

{

if(maptmp[manY][manX]==4||maptmp[manY][manX]==9) map[manY][manX]=4;

else map[manY][manX]=2;

map[manY+1][manX]=5;

map[manY+2][manX]=9;

repaint();manY++;(21);

}

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]=5;

map[manY+2][manX]=3;

repaint();manY++;(21);

}

else {map[manY][manX]=5;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]=5;

map[manY+2][manX]=9;

repaint();manY++;(21);

}

else if(map[manY+2][manX]==2)

{

if(maptmp[manY][manX]==4||maptmp[manY][manX]==9)

map[manY][manX]=4;

10欢迎下载

本文标签: 移动箱子小人程序游戏