java 如何表示二维坐标_Java迷宫游戏

一、思考过程

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

  想了一下各种数据结构,似乎树是比较合适的,从根节点到每一个子节点都只有一条路径。假设入口是根节点,出口是树中某个子节点,那么,从根节点到该子节点的路径肯定是唯一的。

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

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

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

  之后就是想一下该怎么实现这样一棵树。

二、两个问题

 1、树怎么表示?

    2、怎么构造这棵树?

1.树怎么表示?

  假设像写二叉树一样实现这棵树,那么每个树节点里就要存储一个坐标(X,Y)表示一个格子,另外还要存储四个指针。指针中有的为空,有的不为空,不为空的指针指向子节点,子节点保存邻居格子的坐标。这样做最大的问题是无法判定是否所有的格子都在树中。也许还要用一个二维数组作标志数组。

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

  2.怎么构造这棵树?

  首先选定一个格子作为根节点。为了让迷宫的形状够随机,我选择随机生成一个坐标作为根节点。其实,选择确定的一个坐标也可以。

  然后,怎样往这棵树上增加节点呢?

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

  在程序里就是以下过程:

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

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

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

  解决了这两个问题,其余的画迷宫、显示路径、小球移动也就比较简单了。

package lyy9; 
import java.awt.*;//java.awt:Abstract Window ToolKit(抽象窗口工具包),需要调用本地系统方法实现功能。属重量级控件。   
import java.awt.event.*;//响应界面编程的事件包 
import java.util.*;//包含集合框架,collection 类、事件模型、日期和时间设施、国际化和数组各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 import javax.swing.*;//javax.swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现。增强了移植性,属轻量级控件。 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;   public Lattice(int xx, int
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值