项目三 Java开发迷宫游戏

您所在的位置:网站首页 难度最变态的闯关游戏 项目三 Java开发迷宫游戏

项目三 Java开发迷宫游戏

2024-07-01 13:31| 来源: 网络整理| 查看: 265

一.项目预习:

思考过程:

  迷宫由一个一个格子组成,要求从入口到出口只有一条路径.

  通过树实现是比较容易的,从根节点到每一个子节点都只有一条路径。假设入口是根节点,出口是树中某个子节点,那么,从根节点到该子节点的路径肯定是唯一的。

  所以构造一棵树把所有的格子都覆盖到,也就能够做出一个迷宫了。

  要求树的父节点和子节点必须是界面上相邻的格子。

  在界面显示时,父节点和子节点之间共用的边不画,其他的边都画出来,就能画出一个迷宫。

1.树的表示:

  要实现这棵树,那么每个树节点里就要存储一个坐标(X,Y)表示一个格子,另外还要存储四个指针。指针中有的为空,有的不为空,不为空的指针指向子节点,子节点保存邻居格子的坐标。

用二维数组表示迷宫的格子。每个数组元素存储一个指向父节点的引用,这样也可以形成一个虚拟的树。于是就用一个N*N的二维数组,表示N*N个格子,每个数组元素(Lattice)中有一个指向父节点的引用(father)。另外,为了能方便的获取格子的坐标,还要保存坐标信息。

2.构造树:

选定一个格子作为根节点。。我选择确定的一个坐标作为根节点。选择随机生成一个坐标作为根节点也可以。

每次扫描在当前树中找一个节点,看它的邻居格子是否在树中,如果还没在树中,就将该邻居格子加入树中,如果已在树中,就看下一个邻居格子,如果该节点所有邻居格子都在树中了,就找下一个节点,继续同样的操作。

3.走迷宫:

选定格子作为根节点,从它开始随机地深度搜索前进,开出一条路来,直到无路可走了,退回一步,换另一条路,再走到无路可走,回退一步,换另一条……如此循环往复,直到完全无路可走。

选择一个格子根节点,将它压进栈里。

    然后在栈不为空的时候执行以下循环:

  取出一个格子,将它的INTREE标志设置为1,然后将它的所有不在树中的邻居格子压进栈里(顺序随机),并且让这些邻居格子的father指向该格子。

二.遇到的问题:

1.每个格子的坐标都存放在二维数组中;给每一个格子设定四个指针,存放周围未出界且连通的格子。

2.frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);frame的关闭操作有四种:

DO_NOTHING_ON_CLOSE : 不执行任何操作;要求程序处理已注册WindowListener对象的windowClosing方法中的操作。 HIDE_ON_CLOSE : 在调用任何已注册的WindowListener对象后自动隐藏帧。只关闭当前程序。 DISPOSE_ON_CLOSE : 在调用任何已注册的WindowListener对象后自动隐藏和处置帧。只关闭当前程序。 EXIT_ON_CLOSE : 使用系统退出方法退出应用程序。仅在应用程序中使用此选项。关闭由此打开的所有程序。

3.迷宫地图的形成,调用画线函数生成网格,父子节点之间的墙用画背景线覆盖。

4.周围格子的遍历函数,顺序为上右下左。在树中压栈。

三.实现相关代码:

1.开始的界面展示,可选择不同的游戏模式“简单—中等—困难”。详解见注释。

public static void main(String[] args) { final int LX1 = 800, LY1 = 300; JPanel pan = new JPanel();//创建容器; pan.setBounds(20,40,240,280);//设置容器大小; //pan.setBackground(Color.RED); JButton pan4=new JButton("请选择难度等级"); JButton pan1=new JButton("简单");//按钮显示; JButton pan2=new JButton("中等"); JButton pan3=new JButton("困难"); GridLayout grid2 = new GridLayout(4, 1); pan.setLayout(grid2);//容器分割为四行,用于存放按钮。 pan.add(pan4); pan.add(pan1);//按钮加入容器中。 pan.add(pan2); pan.add(pan3); Cal frame1 = new Cal();//创建Cal类的对象frame1. frame1.setTitle("Welcome");//设置框架标题。 frame1.add(pan);//pan容器加入框架; frame1.setLayout(null);//设置容器与框架边界有间隔。 frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//默认关闭; frame1.setSize(300, 400 ); frame1.setLocation(LX1, LY1);//frame1在屏幕的显示位置; frame1.setVisible(true);//框架可视化; frame1.setResizable(false);//大小不可更改; pan1.addActionListener(frame1); pan2.addActionListener(frame1);//按钮加入侦听; pan3.addActionListener(frame1); }

2.根据选择模式初始化并进入游戏,这里只列举了中等模式的初始化方法。

else if(e.getActionCommand().equals("中等")){ final int n = 30, width = 600, padding = 25, LX = 700, LY = 100;//设定大小; JPanel p = new Maze(n, (width - padding - padding) / n, padding);//生成迷宫; JFrame frame = new JFrame("欢迎来到迷宫游戏 中等模式 提示:(按空格键显示或隐藏路径)"); frame.getContentPane().add(p);//迷宫容器加入frame. frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); frame.setSize(width + padding, width + padding + padding);//设置frame的大小。 frame.setLocation(LX, LY);//屏幕上的显示位置; frame.setVisible(true);//可视化; }

3.类Lattic初始化每个节点所包含的信息,坐标,是否在树中以及父节点。

import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.Random; import java.util.Stack; import javax.swing.*; class Lattice { static final int INTREE = 1; static final int NOTINTREE = 0; private int x = -1; private int y = -1; private int flag = NOTINTREE; private Lattice father = null;//根节点为LATTIC的对象,取名father; public Lattice(int xx, int yy) {//定义格子参数; x = xx; y = yy; } public int getX() { return x; } public int getY() { return y; } public int getFlag() { return flag; } public Lattice getFather() { return father;//返回父节点 } public void setFather(Lattice f) { father = f;//初始化父节点 } public void setFlag(int f) { flag = f; } public String toString() { return "(" + x + "," + y + ")\n";//节点坐标 } }

4.给定迷宫的参数,生成迷宫。NUM是二维数组的维度,width是每个格子的宽度,padding是迷宫边界与frame边界的距离。用迷宫的每个格子出初始化二维数组。

Maze(int m, int wi, int p) { NUM = m; width = wi; padding = p; maze = new Lattice[NUM][NUM];//构建二维数组; for (int i = 0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3