//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
项目花园范德彪
- 粉丝: 7748
- 资源: 219
最新资源
- 基于springboot的校车管理信息系统源码(java毕业设计完整源码).zip
- GEE使用 computePixels 可从计算图像(例如合成图像)中获取图像数据.ipynb
- 2022150150_4_%E5%96%BB%E5%AD%90%E8%81%AA_%E6%8A%A5%E5%91%8A.pdf
- 基于springboot的株洲崔氏服装有限公司服装生产管理信息系统设计与实现源码(java毕业设计完整源码).zip
- 用于Keepass浏览器,自输入插件.官网不便下载
- C#松下PLC通信工具,支持松下MEWTOCOL协议,支持串口通信,网口通信,部分代码稍作修改后可直接copy到自己的上位机软件使用 主要功能: 1.支持I O实时监控,可自由改变要监控的I O 2
- 水下图像处理与分析综述:模型分类与发展趋势
- 基于springboot的桂林旅游网站系统源码(java毕业设计完整源码).zip
- 基于springboot的毕业季旅游一站式定制服务平台源码(java毕业设计完整源码).zip
- 基于S7-200 PLC和组态王组态污水处理控制系统的设计 1.1 研究的目的和意义 3 1.2 国内外发展概况 3 2 系统设计和实现 4 2.1设计要求 4 2.2 系统组成 4 3 硬件设计 6
- 基于springboot的毕业生就业推荐系统源码(java毕业设计完整源码).zip
- 机装猎兵EX.exe机装猎兵EX1.exe机装猎兵EX2.exe
- 四轮线控转向控制 4WIS CarSim与Simulink联合 控制器为离散LQR控制器 带有完整详细的控制器、二自由度稳定性控制目标推导说明, MATLAB版本为2018b CarSim版本为20
- 基于springboot的毕业生追踪系统源码(java毕业设计完整源码).zip
- 计算机网络-网络层-思维导图
- 基于springboot的民宿管理系统源码(java毕业设计完整源码).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈