package maze;
import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Point;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.util.Stack;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EtchedBorder;
class Maze extends JPanel {
private Point entrance = null;
private Point exit = null;
private int rowNumber;// 行数
private int colNumber;// 列数
private int LatticeWidth;// 格子的宽度
private Ball ball;
private Lattice[][] mazeLattice;
private boolean startTiming = false;
private JPanel panel = new JPanel();
private JTextField timeText = new Timers(), stepNumberText = new JTextField("0");
private boolean computerDo = false;
private Thread thread = null;
private Thread audioThread = null;
private int stepNmber;
private static final char DepthFirstSearchSolveMaze = 0;
private static final char BreadthFirstSearchSolveMaze = 1;
private char solveMaze = DepthFirstSearchSolveMaze;
private static final char DepthFirstSearchCreateMaze = 0;
private static final char RandomizedPrimCreateMaze = 1;
private static final char RecursiveDivisionCreateMaze = 2;
private char createMaze = DepthFirstSearchCreateMaze;
private boolean promptSolveMaze = false;
public Maze(int row, int col) {
this.setRowNumber(row);
this.setColNumber(col);
this.LatticeWidth = 15;
mazeLattice = new Lattice[getRowNumber() + 2][getColNumber() + 2];
setLayout(new BorderLayout(0, 0));
getTimeText().setForeground(Color.BLUE);
getTimeText().setFont(new Font("宋体", Font.PLAIN, 14));
getTimeText().setHorizontalAlignment(JTextField.CENTER);
stepNumberText.setEnabled(false);
getStepNumberText().setForeground(Color.BLUE);
getStepNumberText().setFont(new Font("宋体", Font.PLAIN, 14));
getStepNumberText().setHorizontalAlignment(JTextField.CENTER);
Label timeLabel = new Label("Time:"), stepLabel = new Label("StepNumber:");
timeLabel.setAlignment(Label.RIGHT);
stepLabel.setAlignment(Label.RIGHT);
panel.setLayout(new GridLayout(1, 4));
add(panel, BorderLayout.NORTH);
panel.add(timeLabel);
panel.add(getTimeText());
panel.add(stepLabel);
panel.add(getStepNumberText());
panel.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
this.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (!isComputerDo()) {
requestFocus();
}
}
});
setKeyListener();
createMaze();
}
public void init() {
mazeLattice = new Lattice[getRowNumber() + 2][getColNumber() + 2];
setPromptSolveMaze(false);
setComputerDo(false);
setThreadStop();
resetStepNumber();
resetTimer();
for (int i = 1; i < getRowNumber() + 1; ++i)
for (int j = 1; j < getColNumber() + 1; ++j) {
mazeLattice[i][j] = new Lattice();
}
for (int i = 0; i < getRowNumber() + 2; ++i) {
mazeLattice[i][0] = new Lattice();
mazeLattice[i][getColNumber() + 1] = new Lattice();
}
for (int j = 0; j < getColNumber() + 2; ++j) {
mazeLattice[0][j] = new Lattice();
mazeLattice[getRowNumber() + 1][j] = new Lattice();
}
ball = new Ball(0, 1);
setEntrance(new Point(0, 1));
setExit(new Point(getColNumber() + 1, getRowNumber()));
mazeLattice[getEntrance().y][getEntrance().x].setPassable(true);
mazeLattice[getExit().y][getExit().x].setPassable(true);
}
// 是否已经走出迷宫
public boolean isWin() {
if (getExit().x == ball.getX() && getExit().y == ball.getY()) {
return true;
}
return false;
}
// 如果已经走出迷宫即跳出游戏结束对话框
private void GameOverMessage() {
((Timers) getTimeText()).stop();
try {
// 读取当前java工程项目下的yy.wav文件
File file1 = new File("media//win.wav");
AudioClip sound = Applet.newAudioClip(file1.toURI().toURL());
sound.play();
} catch (Exception e) {
e.printStackTrace();
}
JOptionPane.showMessageDialog(null,
"Congratulations on getting out of the maze!\n" + "Time you have used to go out of the maze is: "
+ timeText.getText() + "\nThe number of the steps you have used to go out of the maze is: "
+ stepNmber,
"GameOver", JOptionPane.INFORMATION_MESSAGE);
}
// 验证横纵坐标是否超界
private boolean isOutofBorder(int x, int y) {
if ((x == 0 && y == 1) || (x == getColNumber() + 1 && y == getRowNumber()))
return false;
else
return (x > getColNumber() || y > getRowNumber() || x < 1 || y < 1) ? true : false;
}
// 绘制迷宫
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
for (int i = 0; i < getRowNumber() + 2; ++i)
for (int j = 0; j < getColNumber() + 2; ++j) {
g.drawRect((j + 1) * LatticeWidth, (i + 1) * LatticeWidth + 30, LatticeWidth, LatticeWidth);
if (mazeLattice[i][j].isPassable())
g.setColor(Color.WHITE);
else
g.setColor(Color.BLACK);
g.fillRect((j + 1) * LatticeWidth, (i + 1) * LatticeWidth + 30, LatticeWidth, LatticeWidth);
}
g.setColor(Color.RED);
g.fillRect((getColNumber() + 2) * LatticeWidth, (getRowNumber() + 1) * LatticeWidth + 30, LatticeWidth,
LatticeWidth);
g.setColor(ball.getColor());
g.drawOval((ball.getX() + 1) * LatticeWidth, (ball.getY() + 1) * LatticeWidth + 30, LatticeWidth, LatticeWidth);
g.fillOval((ball.getX() + 1) * LatticeWidth, (ball.getY() + 1) * LatticeWidth + 30, LatticeWidth, LatticeWidth);
if (isPromptSolveMaze()) {
Stack<Point> pathStack = promptsolveMaze();
g.setColor(Color.GREEN);
Point start = pathStack.pop();
while (!pathStack.isEmpty()) {
Point end = pathStack.pop();
Graphics2D g2 = (Graphics2D) g;
g2.setStroke(new BasicStroke(3.0f));
g2.drawLine((int) (start.getX() + 1) * LatticeWidth + LatticeWidth / 2,
(int) (start.getY() + 1) * LatticeWidth + 30 + LatticeWidth / 2,
(int) (end.getX() + 1) * LatticeWidth + LatticeWidth / 2,
(int) (end.getY() + 1) * LatticeWidth + 30 + LatticeWidth / 2);
start = end;
}
}
}
// 设置键盘监听器
synchronized private void move(int c) {
int tx = ball.getX(), ty = ball.getY();
switch (c) {
case KeyEvent.VK_LEFT:
--tx;
break;
case KeyEvent.VK_RIGHT:
++tx;
break;
case KeyEvent.VK_UP:
--ty;
break;
case KeyEvent.VK_DOWN:
++ty;
break;
case KeyEvent.VK_ESCAPE:
System.exit(0);
break;
default:
// 防止按键盘上其他键仍然产生键盘音效、使计步器递增
tx = 0;
ty = 0;
break;
}
if (!isOutofBorder(tx, ty) && mazeLattice[ty][tx].isPassable()) {
try {
File file1 = new File("media//keyPressed.wav");
AudioClip sound = Applet.newAudioClip(file1.toURI().toURL());
sound.play();
} catch (Exception e) {
e.printStackTrace();
}
ball.setX(tx);
ball.setY(ty);
++stepNmber;
stepNumberText.setText(Integer.toString(stepNmber));
if (!isStartTiming()) {
setStartTiming(!isStartTiming());
((Timers) getTimeText()).start();
}
}
}
private void setKeyListener() {
this.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (!isWin()) {
int c = e.getKeyCode();
move(c);
repaint();
if (isWin() && !isComputerDo())
GameOverMessage();
}
}
});
}
// 将计时器归零
public void resetTimer() {
setStartTiming(false);
getTimeText().setText("00:00:00");
((Timers) timeText).restart();
}
// 将计步器归零
public void resetStepNumber() {
setStepNmber(0);
stepNumberText.setText(Integer.toString(stepNmber));
}
// 设置小球的位置
public void setBallPosition(Point p) {
ball.setX(p.x);
ball.setY(p.y);
repaint();
}
// 建立一个迷宫
public void createMaze() {
init();
AbstractCreateMaze c = null;
if (getCreateMaze() == DepthFirstSearch
没有合适的资源?快使用搜索试试~ 我知道了~
java课程设计项目-Java语言编写的一个迷宫小游戏,涉及迷宫生成算法、深度、广度巡径等算法(源码+详细说明文档)
共17个文件
java:7个
wav:3个
jpg:3个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 104 浏览量
2023-06-23
22:24:05
上传
评论
收藏 2.17MB ZIP 举报
温馨提示
java课程设计项目——Java语言编写的一个迷宫小游戏(源码+详细说明文档) 说明文档部分内容: 软件总体框架 该软件主要分为如下三个模块: 参数设置模块 按钮功能模块按钮功能模块 迷宫主界面模块迷宫主界面模块 软件各模块介绍 参数设置模块 迷宫大小相关参数: ROWS(即迷宫行数,默认设置为奇数,最小值为11,最大值为99,默认值为11); COLS(即迷宫列数,默认设置为奇数,最小值为11,最大值为99,默认值为11); Lattice’s width(即组成迷宫的格子的宽度,迷宫格子默认设置为正方形,指定了迷宫格子的宽度相当于指定了迷宫格子的大小,默认设置为自然数,最小值为5,最大值为30,默认值为15)。 java课程设计项目——Java语言编写的一个迷宫小游戏(源码+详细说明文档)java课程设计项目——Java语言编写的一个迷宫小游戏(源码+详细说明文档)java课程设计项目——Java语言编写的一个迷宫小游戏(源码+详细说明文档)java课程设计项目——Java语言编写的一个迷宫小游戏(源码+详细说明文档)java课程设计项目——Java语言编写的一个迷宫小游戏(
资源推荐
资源详情
资源评论
收起资源包目录
Maze-game-master.zip (17个子文件)
Maze-game-master
.classpath 387B
media
bgmStart.JPG 8KB
bgmClose.JPG 8KB
win.wav 381KB
background.wav 2.03MB
keyPressed.wav 39KB
maze.jpg 43KB
.settings
org.eclipse.jdt.core.prefs 587B
src
maze
Lattice.java 525B
Maze.java 16KB
SolveMaze.java 4KB
MazeFrame.java 14KB
Ball.java 499B
CreateMaze.java 7KB
Timers.java 1KB
说明文档.md 14KB
.project 363B
共 17 条
- 1
资源评论
白话机器学习
- 粉丝: 8182
- 资源: 7687
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- YOLOV4-TINY权重文件
- 以下是一个使用贪心算法解决多机调度问题的基本步骤0.txt
- 基于大数据的房产估价是近年来随着技术的发展而兴起的一种新型估价方法.txt
- 企业供应链管理系统v3.rar
- 富芮坤FR8016HA蓝牙开发板使用手册+硬件PCB图+封装库+DEMO演示软件源代码.zip
- 基于YOLOv7的芯片表面缺陷检测系统
- 京东物流 数字化供应链综合研究报告2018.rar
- 基于YOLOv7的植物虫害识别&防治系统
- 2000.1-2023.8中国经济政策不确定性指数月度数据.xlsx
- Screenshot_2024-04-21-20-42-15-443_com.tencent.mm.jpg
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功