推箱子趣味游戏
1. 课程设计的目的
随着科技水平的发展,人们的生活,工作节奏越来越快,同时人们的各方面的压力也越来越大。在社会的条件下,压力给人们带来很多烦恼,所以合理的解压,但又不会浪费很多时间的方式成为现代人的共同心愿。游戏随之产生,他的娱乐性和有趣性也越来越被大家所认可,小游戏可以安装在手机里,让人们无论何时何地都能玩到游戏。基于这样的目的, 我们在本次课程设计中为大家开发了一款适合休闲娱乐的小游戏—推箱子趣味游戏。他不仅可以帮助人们消磨时间,还可以在一定程度上开发智力,
此游戏的挑战性更加激发大家玩此游戏的热情。此课设计是配合 JAVA 程序设计课程,深入学习掌握 JAVA 语言,熟练运用 Java 工具对系统的编写。通过课程设计各个项目的综合训练,培养学生实际分析问题,编程和动手能力,提高学生的综合素质。
2. 系统总体设计
在此游戏中本着娱乐为目的,游戏者不仅可以在玩游戏还可以享受音乐,游戏界面简单,操作容易,在玩游戏的同时还可以锻炼大家的反应速度及灵敏程度,在游戏中设置关数,级别由低到高,一关比一关难,提高大家的兴趣,玩家可以自由的选关,并设置了分数的存储系统。系统中又增加了音乐的设置可以让玩家享受音乐。通过对小人移动箱子是否到达墙边进行判断决定胜负及是否可以进入下一关。
2.1系统功能模块划分
  在该系统中总共划分了五个模块
  (1)初始化模块,对游戏界面进行初始化操作,对各个按钮的功能进行操作使之当动作发生时有一定的反应及相应。
  (2)画图模块,主要是对地图的绘制进行画图的操作,在此游戏中不同的数字代表不同的含义。
  (3)移动箱子模块,在推箱子游戏中最主要的模块,用户可以移动箱子到界面中的各个地方,以完成游戏设定的任务。
  (4)移动小人模块,同过对小人的操作使之小人能够操作木块到各个位置。
  (5)功能控制模块,通过对此功能的设置,可以对游戏的功能进行设置,可以设置背景音乐,及通过的关数进行一些必要的设定。
2.2系统功能结构图
  推箱子游戏主要分为初始化模块, 画图模块, 移动箱子模块, 移动小人模块, 功能控制模块.推箱子游戏功能模块图如图1 所示。
1. 功能模块图
2.3系统流程图
    推箱子游戏由功能和规则的确定。系统流程图如下图2所示。
 
     
                                                    否
                                      是               
                         
                           
                                     
                         
                                       
                     
                                                         
                    2. 系统执行流程图
3. 详细设计
3.1程序中自定义类说明
  (1)重来:重新开始当前关;
  (2)悔一步:返回上一移动状态(可以连续返回多步) ;
  (3)第一关:游戏系统默认开始关为第一关,此按钮可以将关从其它关跳跃到第一关;
  (4)上一关:返回到当前关的上一关;
  (5)下一关:返回到当前关的下一关;
  (6)最终关:跳跃到最后一关,即第五十关;
  (7)选关:选择想要玩的关;
  (8)音乐关(开) :默认为开,点击自动关闭音乐和开启音乐;
  (9)更换音乐:从不同的音乐中选取适合玩家的音乐。
3.2程序中主要方法说明
  (1)界面框架与按钮设计
界面设计中包括了,所有你所直观见到的图形界面,窗体的大小,下拉菜单中的功能菜单。使得玩家能够很直观的见到所有游戏中的功能,界面中有菜单, 包括:“选项”“设置音乐”“帮助”,按钮包括:“重来”“悔一步”“第一关”“上一关”“下一关”“最终关”“选关”“音乐”。 部分代码如下:
Menu setmuc=new Menu("设置音乐");
        setmuc.add(nor);
        setmuc.add(qin);
        setmuc.add(po);
  音乐调用代码如下
void mystop()
    {
        midi.stop();
        midi.close();
        sign=false;
    }
    boolean isplay()
    {
        return sign;
    }
  (2)地图的绘制形成
地图以二维数组的形式进行存储的,不同的数字有着不同的含义。在地图当中不同的数字代表不同的含义我当时是将 0~9 解读成为不同的图形与图像。
①"0"代表"地图以内的空位";
②"1"代表"地图中的边缘";
③"2"代表"地图以内的空位非点位;
④"3"代表"地图中的箱子";
⑤"4"代表"点位";
⑥"5"代表"小人面部朝下";
⑦"6"代表"小人面部朝左";
⑧"7"代表"小人面部朝右";
⑨"8"代表"小人面部朝上";
⑩"9"代表"箱子已经到达点位。
  (3)推箱子游戏的游戏性
其主要功能是给用户一个友好的游戏界面,游戏中包括 50 关的地图,推箱 子这个游戏的50 个地图是事先完成的,将所有地图上面的信息以数字的形式储 存在一个 20*20 的二维数组当中;然后,每一关都按照数组重新绘制地图,这样就拥有了50 张地图
  (4)游戏规则的设置
在游戏中要保证箱子不能重叠,箱子不能碰到墙壁,在设置过程中一定要将移动一次箱子的位置后位置的布尔值要设置为 true,不然移动一次箱子后不能再移动。
  (5)小人与箱子移动的算法
移动中包括正移动,与"悔一步"的负移动。正移动:小人上下左右的移动是,归结起来上下左右是一个判断的算法,判断都是通过判断小人前面是否是空位箱子或者是墙,如果没有,就移动;有的话,据判断箱子是否可以移动,最后讨论箱子推过的,小人移动,以及被遮挡住点的图形变化,重新绘制地图,算法判断完毕.传出数据记录在一个栈当中,以备“悔一步”使用。负移动:通过记录在栈中的数据判断,前一步是的移动方向以及移动使用过的算法,逆向将代码重新运行,同时绘制地图以达到前一步的状态。
  (6)移动的代码
在本游戏系统中,给人的视觉感受应该是能感受都动作的变化,逼真的人物 动作会使系统更有效。通过控制人物,箱子,空地,障碍物在数组中的位置的改变来控制移动动作。
  (7)的应用
推箱子中的数据存储是很重要的,不然无法进行“悔一步”的操作本系统。采用栈的存储方式来存储并控制人物,箱子的移动和地图的变换,悔一步操作让 玩家有了反悔的一步,这节省玩家的时间,避免因错位导致重新开始。
4. 设计结果与分析
4.1 程序运行结果
    程序编译无错误,单击运行按钮,运行通过,开始时弹出该游戏的页面,然后开始游戏。一般的会显示出第一关的游戏,玩家可以根据自己的实际水平去操作,而后选择适于自己水平的关卡来玩。
一开始运行程序,显示该页面时,会在页面的正中央显示出该关为第一关,以提醒玩家。
第一关如下图3所示。
3. 推箱子游戏第一关界面
    当玩家想选关时,可以根据自己的意愿去选关闯。选第50关,如下图4所示。
4. 推箱子游戏第50关页面
4.2 尚需解决的问题
游戏的背景音乐比较单一,可以通过在“选项”模式中添加“背景音乐导入”模块,导入玩家自己喜欢的音乐。在此次课程设计中,遇到了一些问题,如:对于面向对象的方法了解不够透彻,运用到实际的软件开发中存在着困难;对于Java语言,只学习到了一些最基本的知识,这导致编写程序时经常出现一些语法错误,而且要在短时间内用Java语言来设计一个具体的系统是一个较大的挑战;还有对于正规开发一个系统的流程不熟悉,适应起来比较慢,编写各个模块相对应的操作时,自己感觉难以动手,这表明所学的知识不能灵活运用到实际中。
  对于以上的问题,自己有清楚的认识,解决办法是需要大量阅读相关的书籍,对于书上以及网站上下载的资料中的Java实例必须有清楚的理解,还有就是多跟精通此方面的老师和同学交流,取其精华。对于实际动手能力与系统开发的流程的适应,必须多进行实际的练习与操作,才能有大的进步。
5. 设计体会
通过这次课程设计我充分了解了理论与课程设计相结合的重要性,理论基础上必须有实际上的应用,在实际的应用中才能发现个种问题,再灵活的应用理论知识去解决它们。在这一周的学习过程中,我不仅能够把以前所学知识联系起来,并且还学会了一些新的知识,在此期间通过对 JAVA 设计的系统训练,使我基本上达到了这周的课程设计目的,并且懂得了要想学好课,除了要有扎实的基础知识的功底深厚外,还需要有一定的实践动手能力,操作能力.我们要学习别人的长处,改掉自己的缺点, 要懂得用网络,现在的网络包括的知识很多,就是看你能不能把握住,有没有那个心在网络上要善于讨论,在论坛里向那些高人学习,学习他们学习的方法和思想.。虽然课程设计已经完事,可是我们觉得应该继续努力,自己做点东西,增加自己的学习经历和学习经验,不断的深入,了解它的内部,借助它创造财富。课程设计之所以进行的如此顺利,得力于老师的信任和支持,得力于同学们的真诚配合和勤勉不断的努力!为此,我们深深地感恩!感谢老师谆谆教导,感恩同学们间的互帮互助
6. 参考文献
[1] 文杰书院.JAVA程序设计完全自学手册[M].北京:机械工业出版社,2010
[2] 张永常.JAVA2 程序设计实用教程[M].北京:电子工业出版社,2010
[3] 朱仲杰.JAVA2 全方位学习[M].北京:机械工业出版社,2008
[4] 张永常等.JAVA程序设计实践教程[M].北京:清华大学出版社,2010
[5] 梁勇.Java 语言程序设计[M].北京:机械工业出版社,2011
[6] 郑莉.Java 程序设计[M]. 北京:清华大学出版社,2011
[7] 张广彬.Java课程设计[M].北京:清华大学出版社,2011
[8] 狄祥义. Java面向对象程序设计[M]. 北京:清华大学出版社,2010
附录
程序具体代码:
(1)主界面设置代码如下:
class mainFrame extends JFrame implements ActionListener,ItemListener
{
    private static final long serialVersionUID = 1L;
    JLabel lb;
    JLabel lb2;
    JButton btnrenew,btnlast,btnnext,btnchoose,btnfirst,btnover,btnmuc,btnback;
    mainpanel panel;
    Sound sound;
    JComboBox jc=new JComboBox();
    MenuItem renew=new MenuItem("重新开始");
    MenuItem back=new MenuItem("悔一步");
    MenuItem last=new MenuItem("上一关");
    MenuItem next=new MenuItem("下一关");
    MenuItem choose=new MenuItem("选关");
    MenuItem exit=new MenuItem("退出");
    MenuItem qin=new MenuItem("琴萧合奏");
    MenuItem po=new MenuItem("泡泡堂");
    MenuItem guang=new MenuItem("灌篮高手");
    MenuItem nor=new MenuItem("默认");
    MenuItem eye=new MenuItem(" eyes on me");
    MenuItem about=new MenuItem("关于推箱子...");
    mainFrame()
    {
        super("推箱子v2.0");
        setSize(720,700);
        setVisible(true);
        setResizable(false);
        setLocation(150,10);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container cont=getContentPane();
        cont.setLayout(null);
        cont.setBackground(Color.black);
        Menu choice=new Menu("选项");
        choice.add(renew);sql建立学生表
        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);                                       
        nor.setEnabled(false);
        lb=new JLabel("推箱子",SwingConstants.CENTER);
        lb2=new JLabel("更换音乐",SwingConstants.CENTER);
        add(lb);
        add(lb2);
        lb.setBounds(100,20,400,20);
        lb.setForeground(Color.white);
        lb2.setBounds(625,500,55,20);
        lb2.setForeground(Color.white);
        btnrenew=new JButton("重来");
        btnback=new JButton("悔一步");
        btnlast=new JButton("上一关");
        btnnext=new JButton("下一关");
        btnchoose=new JButton("选关");
        btnfirst=new JButton("第1关");
        btnover=new JButton("最终关");
        btnmuc=new JButton("音乐关");
        add(btnrenew);
        add(btnlast);
        add(btnnext);
        add(btnchoose);
        add(btnfirst);
        add(btnover);
        add(btnmuc);
        add(btnback);
        btnrenew.setBounds(625,100,80,30);
        btnrenew.addActionListener(this);
        btnback.setBounds(625,150,80,30);
        btnback.addActionListener(this);
        btnfirst.setBounds(625,200,80,30);
        btnfirst.addActionListener(this);
        btnlast.setBounds(625,250,80,30);
        btnlast.addActionListener(this);
        btnnext.setBounds(625,300,80,30);
        btnnext.addActionListener(this);
        btnover.setBounds(625,350,80,30);
        btnover.addActionListener(this);
        btnchoose.setBounds(625,400,80,30);
        btnchoose.addActionListener(this);
        btnmuc.setBounds(625,450,80,30);
        btnmuc.addActionListener(this);foreach循环的值已经定义了
        jc.setBounds(625,530,80,20);
        jc.addItem("默认");
        jc.addItem("琴萧合奏");
        jc.addItem("泡泡堂");-*
        jc.addItem("灌篮高手");
        jc.addItem("eyes on me");
        jc.addItemListener(this);
        cont.add(jc);
        sound=new Sound();
        sound.loadSound();
        panel=new mainpanel();
        add(panel);
        panel.Tuixiangzi(panel.level);
        questFocus();
        validate();
(2)音乐调用代码如下:
class Sound
{
    String path=new String("musics\\");
    String  file=new String("nor.mid");
    Sequence seq;
    Sequencer midi;
    boolean sign;
    void loadSound()
    {
        try {
            Sequence(new File(path+file));
            Sequencer();
            midi.open();
            midi.setSequence(seq);
            midi.start();
            midi.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
        sign=true;
    }
    void mystop()
    {java手机游戏下载
        midi.stop();
        midi.close();
        sign=false;
    }
    boolean isplay()
    {
        return sign;
    }
    void setMusic(String e)
    {
        file=e;
    }
}
(3)规则代码如下:
public void createWall() {
  for (int i = 5; i < 12; i++) {
  Node walls = new Node(i, 5);
  wallList.add(walls);
  }
  for (int i = 11; i < 14; i++) {
  Node walls = new Node(i, 6);
  wallList.add(walls);
  }
  wallList.add(new Node(13, 7));
  wallList.add(new Node(13, 8));
  wallList.add(new Node(13, 9));
  wallList.add(new Node(12, 9));
  wallList.add(new Node(12, 10));
  for (int i = 12; i > 4; i--) {
  Node walls = new Node(i, 11);
  wallList.add(walls);
  }
  wallList.add(new Node(5, 10));
  wallList.add(new Node(4, 10));
查看oracle版本的命令
  wallList.add(new Node(4, 9));
  wallList.add(new Node(4, 8));
  wallList.add(new Node(4, 8));
  wallList.add(new Node(4, 7));
  wallList.add(new Node(5, 7));
  wallList.add(new Node(5, 6));
  wallList.add(new Node(7, 7));
  wallList.add(new Node(8, 7));
  wallList.add(new Node(9, 7));
  wallList.add(new Node(8, 9));
  wallList.add(new Node(8, 10));
  // 将墙壁的对象置为true
  for (int i = 0; i < wallList.size(); i++) {
  Node n = (Node) (i);
  a[n.x][n.y] = true;
  }
}
public void moveDisable(Node n, int d1, int d2) {
  switch (direction) {
  case 4:
  n.x -= d1;
  break;
  case 1:
  n.y -= d2;
  break;
  case 2:
  n.x -= d1;
  break;
  case 3:
  n.y -= d2;
  break;
  }
}
//
public void moveDisable(Node n1, Node n2, int d1, int d2) {系统对象模型
  switch (direction) {
  case 4:
  n1.x -= d1;
  n2.x -= d1;
  break;
  case 1:
  n1.y -= d2;
  n2.y -= d2;
  break;
  case 2:
  n1.x -= d1;
  n2.x -= d1;
  break;
  case 3:
  n1.y -= d2;
  n2.y -= d2;
  break;
  }
}
(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();
    }
}
else Source()==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;
        }
    }
    questFocus();
}
else Source()==nor)
{
    jc.setSelectedIndex(0);
}
else Source()==qin)
{
    jc.setSelectedIndex(1);
}
else Source()==guang)
{
    jc.setSelectedIndex(3);
}
else Source()==eye)
{
    jc.setSelectedIndex(4);
}
else Source()==po)
{
    jc.setSelectedIndex(2);
}
boolean isMystackEmpty()
{
    return mystack.isEmpty();
}
int  back()
{
    return (Integer)mystack.pop();
}
void remove()
{
    veAllElements();
}
(4)栈的代码如下所示:
else Source()==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;
        }
    }
    questFocus();
}
else Source()==nor)
{
    jc.setSelectedIndex(0);
}
else Source()==qin)
{
    jc.setSelectedIndex(1);
}
else Source()==guang)
{
    jc.setSelectedIndex(3);
}
else Source()==eye)
{
    jc.setSelectedIndex(4);
}
else Source()==po)
{
    jc.setSelectedIndex(2);
}
boolean isMystackEmpty()
{
    return mystack.isEmpty();
}
int  back()
{
    return (Integer)mystack.pop();
}
void remove()
{
    veAllElements();
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。