Java迷宫小游戏,老程序员花一天时间完成,你可以吗?

本文介绍了老程序员使用Java开发迷宫小游戏的全过程,包括创建窗口、菜单、绘制迷宫单元,实现迷宫算法,以及添加键盘监听。详细讲解了深度优先算法用于生成迷宫路径,并提供了代码实现。
摘要由CSDN通过智能技术生成

Java迷宫,老程序员又来了

作者简介

作者名:编程界明世隐
简介:CSDN博客专家,从事软件开发多年,精通Java、JavaScript,博主也是从零开始一步步把学习成长、深知学习和积累的重要性,喜欢跟广大ADC一起打野升级,欢迎您关注,期待与您一起学习、成长、起飞!

系列目录

1. Java俄罗斯方块
2. Java五子棋小游戏
3. 老Java程序员花一天时间写了个飞机大战
4. Java植物大战僵尸
5. 老Java程序员花2天写了个连连看
6. Java消消乐(天天爱消除)
7. Java贪吃蛇小游戏
8. Java扫雷小游戏
9. Java坦克大战

效果图

在这里插入图片描述

实现思路

1.创建运行窗口。
2.创建菜单。
3.绘制迷宫的每个单元。
4.通过算法计算迷宫路径,并打通路径,形成迷宫。
5.绘制起点终点。
6.添加键盘事件控制起点方块移动。
7.收尾。

迷宫算法(网上参考的)

  1. 将起点作为当前迷宫单元并标记为已访问
  2. 当还存在未标记的迷宫单元,进行循环
    1).如果当前迷宫单元有未被访问过的的相邻的迷宫单元
    (1).随机选择一个未访问的相邻迷宫单元
    (2).将当前迷宫单元入栈
    (3).移除当前迷宫单元与相邻迷宫单元的墙
    (4).标记相邻迷宫单元并用它作为当前迷宫单元
    2).如果当前迷宫单元不存在未访问的相邻迷宫单元,并且栈不空
    (1).栈顶的迷宫单元出栈
    (2).令其成为当前迷宫单元

**这个算法叫做“深度优先”,简单来说,就是从起点开始走,寻找它的上下左右4个邻居,然后随机一个走,到走不通的时候就返回上一步继续走,直到全部单元都走完。 **

相关图示说明

  1. 每个单元的墙,分为上墙、右墙、下墙、左墙,把这些墙用长度为4的数组表示,元素的值为true则表示墙存在,否则墙不存在,代码里数组的下标方式来确定墙是否存在。

  2. 单元是根据行列来创建的,会用到双循环,类似表格,比如第二行用 i 来表示的话就是 1,第3列用 j 来表示就是2,那第二行第3列的元素组合起来就是(1,2)

  3. 那同理它的上邻居就是(0,2),右邻居(1,3),下邻居(2,2),左邻居(1,1),也就是上下邻居是 i 减加1,左右邻居是 j 减加1。

  4. 正方形4个点的坐标分别为(x1,y1)(x2,y2)(x3,y3)(x4,y4),计算坐标的公式为(其中start为相对偏移量,为了让迷宫两边有些空隙):

    //i代表行 j代表列 h为单元高度
    //左上角坐标
    this.x1=start+jh;
    this.y1=start+i
    h;
    //右上角坐标
    this.x2=start+(j+1)h;
    this.y2=start+i
    h;
    //右下角坐标
    this.x3=start+(j+1)*h;
    this.y3=start+(i+1)h;
    //左下角坐标
    this.x4=start+j
    h;
    this.y4=start+(i+1)*h;

计算坐标,假如每个正方形的宽高都是40,那么(1,2)这个单元的坐标如下图:

5. 墙的处理,之前说到墙是以一个4个元素的数组来表示的,比如数组为:[true,true,true,true],则图为:

如果数组为[false,true,true,true],则图为:

6. 如果要联通右边的邻居要怎么做呢?当前单元去除右墙,右边单元去除左墙,这样就联通了。

去除后就这样,以此类推

代码实现

创建窗口

首先创建一个游戏窗体类GameFrame,继承至JFrame,用来显示在屏幕上(window的对象),每个游戏都有一个窗口,设置好窗口标题、尺寸、布局等就可以。

import javax.swing.JFrame;
/**
 *窗体类
 */
public class GameFrame extends JFrame {
	//构造方法
	public GameFrame(){
		setTitle("迷宫");//设置标题
		setSize(420, 470);//设置窗体大小
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭后进程退出
		setLocationRelativeTo(null);//居中
		setResizable(false);//不允许变大
		//setVisible(true);//设置显示窗体
	}
}

创建面板容器GamePanel继承至JPanel

import javax.swing.JMenuBar;
import javax.swing.JPanel;

/*
 * 画布类
 */
public class GamePanel extends JPanel{
	private JMenuBar jmb = null;
	private GameFrame mainFrame = null;
	private GamePanel panel = null;
	private String gameFlag=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值