//6-18完成
//推箱子带音乐版
//右键单击--悔棋功能
//用时1:40分钟
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.util.ArrayList;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class GameFrame extends JFrame implements ActionListener, MouseListener// 主面板类
, KeyListener {
private int grade = 0;
// row,column记载人的行号 列号
// leftX,leftY 记载左上角图片的位置 避免图片从(0,0)坐标开始
private int row = 7, column = 7, leftX = 0, leftY = 0;
// 记载地图的行列数
private int mapRow = 0, mapColumn = 0;
// width,height 记载屏幕的大小
private int width = 0, height = 0;
private boolean acceptKey = true;
// 程序所用到的图片
private Image pic[] = null;
// 定义一些常量,对应地图的元素
final byte WALL = 1, BOX = 2, BOXONEND = 3, END = 4, MANDOWN = 5,
MANLEFT = 6, MANRIGHT = 7, MANUP = 8, GRASS = 9, MANDOWNONEND = 10,
MANLEFTONEND = 11, MANRIGHTONEND = 12, MANUPONEND = 13;
private byte[][] map = null;
private ArrayList list = new ArrayList();
Sound sound;
public void getManPosition() {
for (int i = 0; i < map.length; i++)
for (int j = 0; j < map[0].length; j++)
if (map[i][j] == MANDOWN || map[i][j] == MANDOWNONEND
|| map[i][j] == MANUP || map[i][j] == MANUPONEND
|| map[i][j] == MANLEFT || map[i][j] == MANLEFTONEND
|| map[i][j] == MANRIGHT || map[i][j] == MANRIGHTONEND) {
row = i;
column = j;
break;
}
}
/* 显示提示信息对话框 */
public void DisplayToast(String str) {
JOptionPane.showMessageDialog(null, str, "提示",
JOptionPane.ERROR_MESSAGE);
}
// 撤销移动
public void undo() {
if (acceptKey) {
// 撤销
if (list.size() > 0) {
// 若要撤销 必须走过
Map priorMap = (Map) list.get(list.size() - 1);
map = priorMap.getMap();
row = priorMap.getManX();
column = priorMap.getManY();
repaint();
list.remove(list.size() - 1);
} else
DisplayToast("不能再撤销!");
} else {
DisplayToast("此关已完成,不能撤销!");
}
}
public void nextGrade() {
// grade++;
if (grade >= MapFactory.getCount() - 1) {
DisplayToast("恭喜你完成所有关卡!");
acceptKey = false;
} else {
grade++;
initMap();
repaint();
acceptKey = true;
}
}
public void priorGrade() {
grade--;
acceptKey = true;
if (grade < 0)
grade = 0;
initMap();
repaint();
}
public void initMap() {
map = getMap(grade);
list.clear();
getMapSizeAndPosition();
getManPosition();
// Map currMap=new Map(row, column, map);
// list.add(currMap);
}
/*
* //原来是从数组读取 2012-4-20 public byte[][] getMap(int grade) { return
* MapFactory.getMap(grade); }
*/
public GameFrame() {
super("推箱子游戏带音乐版");
setSize(600, 600);
setVisible(true);
setResizable(false);
setLocation(300, 20);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container cont = getContentPane();
cont.setLayout(null);
cont.setBackground(Color.black);
// 最初始13张图片
getPic();
width = this.getWidth();
height = this.getHeight();
this.setFocusable(true);
initMap();
// 构造方法执行时从优先数据中恢复游戏
// 关卡切换时调用initMap()
// resumeGame();
this.addKeyListener(this);
this.addMouseListener(this);
sound = new Sound();
sound.loadSound();
}
private void getMapSizeAndPosition() {
// TODO Auto-generated method stub
mapRow = map.length;
mapColumn = map[0].length;
leftX = (width - map[0].length * 30) / 2;
leftY = (height - map.length * 30) / 2;
System.out.println(leftX);
System.out.println(leftY);
System.out.println(mapRow);
System.out.println(mapColumn);
}
public void getPic() {
pic = new Image[14];
for (int i = 0; i <= 13; i++) {
pic[i] = Toolkit.getDefaultToolkit().getImage(
"images\\pic" + i + ".JPG");
}
}
public byte grassOrEnd(byte man) {
byte result = GRASS;
if (man == MANDOWNONEND || man == MANLEFTONEND || man == MANRIGHTONEND
|| man == MANUPONEND)
result = END;
return result;
}
private void moveUp() {
// 上一位p1为WALL
if (map[row - 1][column] == WALL)
return;
// 上一位p1为 BOX,BOXONEND,须考虑P2
if (map[row - 1][column] == BOX || map[row - 1][column] == BOXONEND) {
// 上上一位p2为 END,GRASS则向上一步,其他不用处理
if (map[row - 2][column] == END || map[row - 2][column] == GRASS) {
Map currMap = new Map(row, column, map);
list.add(currMap);
byte boxTemp = map[row - 2][column] == END ? BOXONEND : BOX;
byte manTemp = map[row - 1][column] == BOX ? MANUP : MANUPONEND;
// 箱子变成temp,箱子往前一步
map[row - 2][column] = boxTemp;
// 人变成MANUP,往上走一步
map[row - 1][column] = manTemp;
// 人刚才站的地方变成GRASS或者END
map[row][column] = grassOrEnd(map[row][column]);
// 人离开后修改人的坐标
row--;
}
} else {
// 上一位为 GRASS,END,不须考虑P2。其他情况不用处理
if (map[row - 1][column] == GRASS || map[row - 1][column] == END) {
Map currMap = new Map(row, column, map);
list.add(currMap);
byte temp = map[row - 1][column] == END ? MANUPONEND : MANUP;
// 人变成temp,人往上走一步
map[row - 1][column] = temp;
// 人刚才站的地方变成GRASS或者END
map[row][column] = grassOrEnd(map[row][column]);
// 人离开后修改人的坐标
row--;
}
}
}
private void moveDown() {
// 下一位p1为WALL
if (map[row + 1][column] == WALL)
return;
// 下一位p1为 BOX,BOXONEND,须考虑P2
if (map[row + 1][column] == BOX || map[row + 1][column] == BOXONEND) {
// 下下一位p2为 END,GRASS则向下一步,其他不用处理
if (map[row + 2][column] == END || map[row + 2][column] == GRASS) {
Map currMap = new Map(row, column, map);
list.add(currMap);
byte boxTemp = map[row + 2][column] == END ? BOXONEND : BOX;
byte manTemp = map[row + 1][column] == BOX ? MANDOWN
: MANDOWNONEND;
// 箱子变成boxTemp,箱子往下一步
map[row + 2][column] = boxTemp;
// 人变成manTemp,往下走一步
map[row + 1][column] = manTemp;
// 人刚才站的地方变成 grassOrEnd(map[row][column])
map[row][column] = grassOrEnd(map[row][column]);
row++;
}
} else {
// 下一位为 GRASS,END,不须考虑P2,其他情况不用处理
if (map[row + 1][column] == GRASS || map[row + 1][column] == END) {
Map currMap = new Map(row, column, map);
list.add(currMap);
byte temp = map[row + 1][column] == END ? MANDOWNONEND
: MANDOWN;
// 人变成temp,人往下走一步
map[row + 1][column] = temp;
// 人刚才站的地方变成 grassOrEnd(map[row][column])
map[row][column] = grassOrEnd(map[row][column]);
row++;
}
}
}
private void moveLeft() {
// 左一位p1为WALL
if (map[row][column - 1] == WALL)
return;
// 左一位p1为 BOX,BOXONEND
if (map[row][column - 1] == BOX || map[row][column - 1] == BOXONEND) {
// 左左一位p2为 END,GRASS则向左一步,其他不用处理
if (map[row][column - 2] == END || map[row][column - 2] == GRASS) {
Map currMap = new M
没有合适的资源?快使用搜索试试~ 我知道了~
详细解读Java推箱子音乐版2游戏的源代码-课程设计

共33个文件
jpg:14个
mid:5个
class:4个

需积分: 5 0 下载量 172 浏览量
2023-08-14
19:15:38
上传
评论
收藏 100KB ZIP 举报
温馨提示
详细解读Java推箱子音乐版2游戏的源代码--【课程设计】 本系列校训 用免费公开视频,卷飞培训班哈人!打死不报班,赚钱靠狠干! 只要自己有电脑,前后项目都能搞!N年苦学无人问,一朝成名天下知! 喜欢的朋友还可以自己查到本站的N多毕业设计与课程设计, 如果错误或其它需要请留言!或发邮件至8195819@qq.com 本系列校训 用免费公开视频,卷飞培训班哈人!打死不报班,赚钱靠狠干! 只要自己有电脑,前后项目都能搞!N年苦学无人问,一朝成名天下知! 喜欢的朋友还可以自己查到本站的N多毕业设计与课程设计, 如果错误或其它需要请留言!或发邮件至8195819@qq.com
资源推荐
资源详情
资源评论

















收起资源包目录








































共 33 条
- 1
资源评论

- #完美解决问题
- #运行顺畅
- #内容详尽
- #全网独家
- #注释完整

项目花园范德彪
- 粉丝: 8399
- 资源: 258
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 【SEC-2025行业研究报告】Form 10-K Blue Owl Credit Income Corp. .pdf
- 【SEC-2025行业研究报告】Form 10-K CEDAR REALTY TRUST, INC. .pdf
- 【SEC-2025行业研究报告】Form 10-K ChromaDex Corp. .pdf
- 【SEC-2025行业研究报告】Form 10-K BRIGHTHOUSE LIFE INSURANCE Co .pdf
- 【SEC-2025行业研究报告】Form 10-K CPI Card Group Inc. .pdf
- 【SEC-2025行业研究报告】Form 10-K Custom Truck One Source, Inc. .pdf
- 【SEC-2025行业研究报告】Form 10-K Crexendo, Inc. .pdf
- 【SEC-2025行业研究报告】Form 10-K Cyclerion Therapeutics, Inc. .pdf
- 【SEC-2025行业研究报告】Form 10-K Dave Inc. DE .pdf
- 【SEC-2025行业研究报告】Form 10-K Emergent BioSolutions Inc. .pdf
- 【SEC-2025行业研究报告】Form 10-K Eos Energy Enterprises, Inc. .pdf
- 【SEC-2025行业研究报告】Form 10-K Evolus, Inc. .pdf
- 【SEC-2025行业研究报告】Form 10-K FLAGSTAR FINANCIAL, INC. .pdf
- 【SEC-2025行业研究报告】Form 10-Q NKGen Biotech, Inc. .pdf
- 【SEC-2025行业研究报告】Form 10-Q DONALDSON Co INC .pdf
- 【SEC-2025行业研究报告】Form 10-K Flutter Entertainment plc .pdf
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
