# 基于Java Swing JFream 组件的趣味推箱子小游戏
# 一 需求分析
设计一个经典的推箱子小游戏,在窗体里有墙,箱子,胜利的标志,和工人,用户可以通过键盘上的“上”、“下”、“左”、“右”按键控制工人的上下左右移动动轨迹,工人具有推箱子的功能,箱子会根据工人的运动而运动,墙起到阻碍的用,箱子碰到墙会停下来,工人碰到墙也会停下来,当所有箱子都停在胜利的标志的位置时,游戏便胜利。本趣味推箱子游戏是一个Java Application应用程序。本程序设计是基于java Swing JFream 组件设计与实现。 创建一个主类:GrameFrame,然后通过一系列的加入板块,实现人工以及墙体的加入。最后在箱子被推到指定地点时,利用监听事件,响应出信息。
下图为系统的流程图:
![](http://www.write-bug.com/myres/static/uploads/2021/10/19/0d7b93835866e53090f298a20b9a95ce.writebug)
# 二 系统设计
## 2.1 **界面设计**
下图为程序需要用到的图片。工人上下左右移动图片,箱子图片,背景墙体图片等, 墙的设计需要用数组添加图片,其他图片添加需要SETBOUNS来设定其的位置和大小。
![](http://www.write-bug.com/myres/static/uploads/2021/10/19/37174d9db2de3296f423314d8ba2cf97.writebug)
![](http://www.write-bug.com/myres/static/uploads/2021/10/19/61747fea5429fda8988a1ff44fb299b6.writebug)
![](http://www.write-bug.com/myres/static/uploads/2021/10/19/b2940808a248aa26df98b7c3a0b151fc.writebug)
## 2.2 **系统功能模块设计**
在该系统中总共划分了三个模块:
- **初始化模块**,对游戏界面进行初始化操作,对各个按钮的功能进行操作使之当动作发生时有一定的反应及相应
- **移动箱子模块**,在推箱子游戏中最主要的模块,用户可以移动箱子到界面中的各个地方,以完成游戏设定的任务
- **移动小人模块**,通过对工人的操作使之能上下左右移动,能够操作木块到各个位置
# 三 程序实现
本程序主要利用窗体来加载游戏,用面板来装入所有成员,墙用数组来设定它的位置,箱子、工人、墙和胜利的标志的图片均用JLabel来装载,在主类里添加键盘监听器,监听器里添加了keyPressed、keyReleased、keyTyped方法,其中keyPressed方法里实现了工人的移动,箱子的移动,箱子与工人、墙之间的碰撞检测,游戏的胜利,keyReleased、keyTyped均设置为空。
## 3.1 Swing 中的基本控件
本项目中会分别使用JFrame、JPanel、JLabel、JOptionPane四种控件,含义如下:
- JFrame:代表窗体对象,Windows 操作系统中的一个窗体都可以看做一个JFrame 对象。JFrame 常见的操作有设置标题(setTitle)、设置窗口大小(setBounds)、设置是否显示(setVisible)等
- JPanel:即面板,面板中可以包含各种Swing 控件。JPanel 常见的操作有设置背景色(setBackground)、添加控件(add)、设置布局(setLayout)等
- JLabel:即标签,可以用来显示文字或图片。JLabel 常见的操作有设置图片(setIcon)、设置位置(setBounds)等
- JOptionPane:通常使用JOptionPane 的showMessageDialog 方法弹出对话框
## 3.2 GameFrame类中的方法
| 方法 | 继承关系 | 作用 | 实现的功能 |
| ----------- | --------------- | --------------------------- | --------------------------- |
| GameFrame | extends JFrame | 定义所有成员,箱子,工人等等。 | 主类,包含了所有的功能。 |
| keyPressed | 没有 | 响应工人和箱子的移动以及工人、箱子、墙之间的碰撞检测。 | 响应工人和箱子的移动以及工人、箱子、墙之间的碰撞检测。 |
| keyReleased | 没有 | 完成定义 | 没有 |
## 3.3 关键类与方法实现
### 3.3.1 主类GameFrame
用于初始化各种对象。
```java
JPanel panel = new JPanel();
JLabel worker int SPEED = 12;
int[] pos = new int[];
JLabel[] walls
JLabelboxJLabel goal
```
方法 GameFrame 用于完善信息.然后再进行动作事件的监听,主要的监听对象为:
**判断工人的移动方向是否会出界**
```java
worker.setBounds(worker.getX() + xSpeed, worker.getY() + ySpeed, worker.getWidth(),worker.getHeight());
```
### 3.3.2 使工人可以推动箱子
```java
f (worker.getBounds().intersects(box.getBounds())) {
box.setBounds(box.getX() + xSpeed, box.getY() + ySpeed,
box.getWidth(), box.getHeight());
}
```
### 3.3.3 判断箱子是否撞到墙壁
```java
for (int i = 0; i < walls.length; i++) {
if (box.getBounds().intersects(walls[i].getBounds())) {
worker.setBounds(worker.getX() - xSpeed, worker.getY() - ySpeed,worker.getWidth(), worker.getHeight());
box.setBounds(box.getX() - xSpeed, box.getY() - ySpeed,box.getWidth(), box.getHeight());
}
}
```
### 3.3.4 判断是否胜利
```java
if (box.getX()==goal.getX() && box.getY()==goal.getY()) {
JOptionPane.showMessageDialog(null, "您赢啦!");
}
```
# 四 运行测试
游戏运行时可以通键盘上的“上”、“下”、“左”、“右”按键移动工人,并且推动箱子。下图为游戏运行界面。
![](http://www.write-bug.com/myres/static/uploads/2021/10/19/4efd7dc50164179d458727ee7a56ae88.writebug)
当箱子与所给定的目标物重合时,游戏胜利,弹出窗口,显示“你赢了!”的字样,此时游戏结束。下图为游戏胜利界面。
![](http://www.write-bug.com/myres/static/uploads/2021/10/19/3aa7453932fb2de5d3d50d725204b452.writebug)
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
34750120713216237.zip (16个子文件)
sokoban-game
src
java课设.docx 294KB
Sokoban
.classpath 295B
.settings
org.eclipse.jdt.core.prefs 587B
src
GameFrame.java 4KB
workerLeft.png 2KB
workerUp.png 2KB
box.png 3KB
workerRight.png 2KB
bin
GameFrame$1.class 2KB
GameFrame.class 2KB
wall.png 6KB
.project 366B
workerDown.png 2KB
goal.png 3KB
LICENSE 1KB
README.md 6KB
共 16 条
- 1
资源评论
工具盒子
- 粉丝: 59
- 资源: 1313
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功