【基于深度优先算法的迷宫游戏开发】软件实习项目三

一、项目准备

需求分析
(1)迷宫游戏是非常经典的游戏,在该题中要求随机生成一个迷宫,并求解迷宫;
(2)要求游戏支持玩家走迷宫,和系统走迷宫路径两种模式。玩家走迷宫,通过键盘方向键控制;
(3)系统走迷宫路径基于逆二叉树搜索,输出走迷宫的路径并显示。
(4)设计交互友好的游戏图形界面
编程语言及开发工具
java 基于IDEA

二、实现过程

利用深度遍历的思想。访问到一个节点时,搜索这个节点没有被访问过的相邻节点,选择一个继续做同样的操作,直到没有邻节点为止再回溯到上一个访问的节点,并选择另外的邻节点。

算法思想

  1. 从第一个单元开始,检查当前单元是否堵塞(即周围四个单元都是已被访问或不可访问)
  2. 若不堵塞,则随机选择一个相邻单元作为下一单元,检查是否可访问
  3. 若可访问,则打破当前单元与下一单元之间的墙壁,将当前单元入栈,将下一单元作为当前单元;若不不可访问,则回到步骤2
  4. 若当前单元堵塞,则回退至上一单元
  5. 如此遍历,直到所有的单元都被访问

面板设计

  1. 利用Java Swing的相关函数,进行实线的绘画,以线为墙,实心圆为角色,空白部分为路来画迷宫。
  2. 利用Java函数addKeyListener来监听按键↑↓←→的输入,只有当角色周围是路上,才能移动。当角色到达终点时进入下一关。

三、代码部分

package com.company;
import java.awt.Color;                           //颜色相关操作的类;
import java.awt.Graphics;                        //用以基本计何图形的绘制;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;                         //随机类
import java.util.Stack;                          //栈
import javax.swing.*;
import javax.imageio.ImageIO;

class grid {
   
    static final int InTree = 1;
    static final int NotIntree = 0;
    private int x = -1;
    private int y = -1;
    private int flag = NotIntree;
    private grid father = null;
    public grid(int xx, int yy) {
                //构造函数;
        x = xx;
        y = yy;
    }
    public int getX() {
                             //获取该方格的横坐标;(由于不可直接用对象访问私有变量);
        return x;
    }
    public int getY() {
                             //获取纵坐标;
        return y;
    }
    public int getFlag() {
                          //获取标志位;
        return flag;
    }
    public grid getFather() {
                    //获取方格对象的父节点;
        return father;
    }
    public void setFather(grid f) {
              //修改方格对象的父节点;
        father = f;
    }
    public void setFlag(int f) {
   
        flag = f;                                //修改标志位;
    }
    public String toString() {
                      //以字符串形式导出坐标;
        return new String("(" + x + "," + y + ")\n");
    }
}
    public class Main extends JPanel {
   
    private  static final long serialVersionUID = -8300339045454852626L;
    private int NUM, width, padding;            // NUM为界面总边长,width为每个格子的边长;padding为内边距;
    private grid[][] maze;
    private int myX, myY;                       //定义了两个点;
    int sum = 0;                                //记录步数;
    int rand = 0;                               //记录关数;
    //JButton Level1,Level2,Level3;
    private boolean drawPath = false;           //路径标志位;
    Main(int n, int w, int p) {
                   //Main的构造方法;
        NUM = n;                                //窗口边长;
        width = w;                             //子方格边长;
        padding = p;                            //边线长度
        /*
        Level1=new JButton("难度1");
        Level2=new JButton("难度2");
        Level3=new JButton("难度3");
        this.add(Level1);
        this.add(Level2);
        this.add(Level3);
        Level1.addActionListener( this);
        Level2.addActionListener( this);
        Level3.addActionListener( this);
        this.addKeyListener((KeyListener) this);
        */
        maze = new grid[NUM][NUM];           //调用Lattice的构造函数,对尾端的小方格构造;
        for (int i = 0; i <= NUM - 1; i++)      //对除最后一格外的每一个坐标认定为一个小方格对象并构造;
            for (int j = 0; j <= NUM - 1; j++)
                maze[i][j] = new grid(i, j); //每个在窗口内具有整数坐标的点被视为一个方格对象;
        createMaze();
        setKeyListener();
        this.setFocusable(true);
    }

    private void init() {
   
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值