项目三 基于A*搜索算法迷宫游戏开发

一.实验目标

1.迷宫游戏是非常经典的游戏,在该题中要求随机生成一个迷宫,并求解迷宫;

2.要求游戏支持玩家走迷宫,和系统走迷宫路径两种模式。玩家走迷宫,通过键盘方向键控制,并在行走路径上留下痕迹;系统走迷宫路径要求基于A*算法实现,输出走迷宫的最优路径并显示。

3.设计交互友好的游戏图形界面。

二.实验代码

MAP类

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package 迷宫;

import java.util.ArrayList;

public class EMap {
    private ArrayList<Integer> blockPos = new ArrayList();
    private int[][] d = new int[][]{{0, -1}, {1, 0}, {0, 1}, {-1, 0}};
    private boolean[][] a;
    private int width;
    private int height;
    private boolean fl = false;

    public EMap(boolean[][] b) {
        this.width = (b.length - 1) / 2;
        this.height = (b[0].length - 1) / 2;
        this.a = new boolean[b.length][b[0].length];

        for(int i = 0; i < b.length; ++i) {
            for(int j = 0; j < b[0].length; ++j) {
                this.a[i][j] = b[i][j];
            }
        }

    }

    private void dfs(int x, int y, int c) {
        if (x == this.width * 2 && y == this.height * 2 - 1) {
            this.fl = true;
        } else {
            for(int i = 0; i < 4; ++i) {
                if (c != i) {
                    int dx = x + this.d[i][0];
                    int dy = y + this.d[i][1];
                    if (this.ise(dx, dy) && this.a[dx][dy]) {
                        if (this.fl) {
                            break;
                        }

                        this.blockPos.add(dx);
                        this.blockPos.add(dy);
                        this.a[dx][dy] = false;
                        this.dfs(dx, dy, (i + 2) % 4);
                    }
                }
            }

            if (!this.fl) {
                this.blockPos.remove(this.blockPos.size() - 1);
                this.blockPos.remove(this.blockPos.size() - 1);
            }

        }
    }

    public ArrayList<Integer> exitmap() {
        this.blockPos.add(0);
        this.blockPos.add(1);
        this.dfs(0, 1, 3);
        return this.blockPos;
    }

    private boolean ise(int dx, int dy) {
        return 0 <= dx && dx <= this.width * 2 && 0 <= dy && dy <= this.height * 2;
    }
}

test类

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package 迷宫;

import java.awt.Component;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;

public class Test extends JFrame implements ActionListener, KeyListener {
    boolean[][] map = (new PMap()).prim(2, 0, 20, 19, true);
    PaintMap p;

    public Test() {
        this.p = new PaintMap(this.map, (new EMap(this.map)).exitmap());
        this.setTitle("迷宫游戏");
        this.add(this.p);
        this.setSize(500, 500);
        this.setVisible(true);
        this.setLocationRelativeTo((Component)null);
        this.setDefaultCloseOperation(3);
        this.addKeyListener(this);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                (new Test()).setVisible(true);
            }
        });
    }

    public void keyPressed(KeyEvent key) {
        switch (key.getKeyCode()) {
            case 32:
                this.p.PressSp();
            case 33:
            case 34:
            case 35:
            case 36:
            default:
                break;
            case 37:
                this.p.moveLeft();
                break;
            case 38:
                this.p.moveUp();
                break;
            case 39:
                this.p.moveRight();
                break;
            case 40:
                this.p.moveDown();
        }

    }

    public void keyReleased(KeyEvent arg0) {
    }

    public void keyTyped(KeyEvent arg0) {
    }

    public void actionPerformed(ActionEvent arg0) {
    }
}

三.实验图解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值