import java.awt.*;
import java.awt.event.*;
import java.util.Stack;
import javax.swing.*;
import java.io.*;
public class BoxWorld
{
public static void main(String[] args)
{
new MainFrame();
}
}
class MainFrame extends JFrame implements ActionListener
{
private MenuBar bar;
private Menu menuFile, menuGame, menuHelp;
private MenuItem itemOpen, itemSave, itemReplay, itemRetrack, itemLast,
itemNext, itemExit, itemAbout, itemFirst, itemEnd;
private JButton btnReplay, btnLast, btnNext, btnFirst, btnEnd, btnRetrack;
private JFileChooser fc;
private GamePanel game;
private MessagePanel dataPanel;
MainFrame()
{
// 设置窗口基本属性
super ("BoxWorld v3.0");
setSize(445,368);
setLocation(300,200);
setVisible(true);
setResizable(false);
setBackground(Color.black);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container ctn = getContentPane();
ctn.setLayout(null);
ctn.setBackground(Color.black);
// 创建菜单栏
itemOpen = new MenuItem("读取存档", new MenuShortcut(KeyEvent.VK_O));
itemSave = new MenuItem("保存进度", new MenuShortcut(KeyEvent.VK_S));
itemExit = new MenuItem("退出");
itemRetrack = new MenuItem("悔一步", new MenuShortcut(KeyEvent.VK_Z));
itemReplay = new MenuItem("重新开始", new MenuShortcut(KeyEvent.VK_R));
itemFirst = new MenuItem("第一关", new MenuShortcut(KeyEvent.VK_F));
itemLast = new MenuItem("上一关", new MenuShortcut(KeyEvent.VK_X));
itemNext = new MenuItem("下一关", new MenuShortcut(KeyEvent.VK_C));
itemEnd = new MenuItem("最后一关", new MenuShortcut(KeyEvent.VK_E));
itemAbout = new MenuItem("关于 BoxWorld");
itemOpen.addActionListener(this);
itemSave.addActionListener(this);
itemExit.addActionListener(this);
itemRetrack.addActionListener(this);
itemReplay.addActionListener(this);
itemFirst.addActionListener(this);
itemLast.addActionListener(this);
itemNext.addActionListener(this);
itemEnd.addActionListener(this);
itemAbout.addActionListener(this);
menuFile = new Menu(" 文件 ");
menuFile.add(itemOpen);
menuFile.add(itemSave);
menuFile.addSeparator();
menuFile.add(itemExit);
menuGame = new Menu(" 游戏 ");
menuGame.add(itemRetrack);
menuGame.add(itemReplay);
menuGame.add(itemLast);
menuGame.add(itemNext);
menuGame.add(itemFirst);
menuGame.add(itemEnd);
menuHelp = new Menu(" 帮助 ");
menuHelp.add(itemAbout);
bar = new MenuBar();
bar.add(menuFile);
bar.add(menuGame);
bar.add(menuHelp);
setMenuBar(bar);
// 创建按钮
btnRetrack = new JButton("悔一步");
btnReplay = new JButton("重新开始");
btnFirst = new JButton("第一关");
btnEnd = new JButton("最后一关");
btnLast = new JButton("上一关");
btnNext = new JButton("下一关");
btnRetrack.setBounds(320,120,120,30);
btnReplay.setBounds(320,153,120,30);
btnFirst.setBounds(320,186,120,30);
btnLast.setBounds(320,219,120,30);
btnNext.setBounds(320,252,120,30);
btnEnd.setBounds(320,285,120,30);
btnRetrack.addActionListener(this);
btnFirst.addActionListener(this);
btnLast.addActionListener(this);
btnNext.addActionListener(this);
btnReplay.addActionListener(this);
btnEnd.addActionListener(this);
add(btnRetrack);
add(btnReplay);
add(btnFirst);
add(btnLast);
add(btnNext);
add(btnEnd);
dataPanel = new MessagePanel();
add(dataPanel);
game = new GamePanel(dataPanel);
add(game);
game.level = 1;
game.loadMap();
game.requestFocus();
validate();
}
public void actionPerformed(ActionEvent event)
{
Object e = event.getSource();
if (e == itemOpen) {
if (fc == null) {
fc = new JFileChooser(".\\save");
fc.addChoosableFileFilter(new GameFileFilter());
fc.setAcceptAllFileFilterUsed(false);
}
int returnVal = fc.showOpenDialog(MainFrame.this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
game.loadFile(file);
}
fc.setSelectedFile(null);
}
else if (e == itemSave) {
if (fc == null) {
fc = new JFileChooser(".\\save");
fc.addChoosableFileFilter(new GameFileFilter());
fc.setAcceptAllFileFilterUsed(false);
}
int returnVal = fc.showSaveDialog(MainFrame.this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
game.saveFile(file);
}
fc.setSelectedFile(null);
}
else if (e == itemRetrack || e == btnRetrack) {
game.retrackOnceMove();
game.requestFocus();
}
else if (e == itemReplay || e == btnReplay) {
game.loadMap();
game.requestFocus();
}
else if (e == itemLast || e == btnLast) {
if (game.level == 1) {
JOptionPane.showMessageDialog(this, "已经是第一关了!",
"提示", JOptionPane.INFORMATION_MESSAGE);
}
else {
--game.level;
}
game.loadMap();
game.requestFocus();
}
else if (e == itemNext || e == btnNext) {
if (game.level == game.totalLevel) {
JOptionPane.showMessageDialog(this, "已经是最后一关了!",
"提示", JOptionPane.INFORMATION_MESSAGE);
}
else {
++game.level;
}
game.loadMap();
game.requestFocus();
}
else if (e == itemFirst || e == btnFirst) {
game.level = 1;
game.loadMap();
game.requestFocus();
}
else if (e == itemEnd || e == btnEnd) {
game.level = game.totalLevel;
game.loadMap();
game.requestFocus();
}
else if (e == itemExit) {
System.exit(0);
}
else if (e == itemAbout) {
ImageIcon icon = new ImageIcon("images\\icon.gif");
JOptionPane.showMessageDialog(this,
"BoxWorld\nVersion 3.0\n\n作者 : Elric\n邮箱 : q.wwj@qq.com\n",
"关于 BoxWorld",JOptionPane.INFORMATION_MESSAGE, icon);
}
}
}
class GamePanel extends JPanel implements KeyListener
{
final int imgLen = 20;
private Image[] elemImage;
private GameMaps maps;
private MessagePanel dataPanel;
private int[][] curMap;
private int[][] initMap;
private int curManX;
private int curManY;
private Stack <Integer> stepsStack;
public int level = 1;
public int steps = 0;
public int totalLevel;
GamePanel(MessagePanel data)
{
dataPanel = data;
setBounds(0,0,320,320);
setBackground(Color.white);
setVisible(true);
addKeyListener(this);
elemImage = new Image[10];
for (int i=0; i<10; ++i) {
elemImage[i] = Toolkit.getDefaultToolkit().createImage("images\\image_" + i + ".gif");
}
stepsStack = new Stack <Integer>();
maps = new GameMaps();
totalLevel = maps.getTotalLevels();
}
public void loadMap()
{
initMap = maps.getMap(level);
curMap = maps.getMap(level);
steps = 0;
for (int x=0; x<maps.mapSize; ++x)
for (int y=0; y<maps.mapSize; ++y)
if (curMap[x][y] == GameMaps.MAN_DOWN) {
curManX = x;
curManY = y;
stepsStack.clear();
repaint();
dataPanel.showMessage(level, steps);
return;
}
JOptionPane.showMessageDialog(this, "地图存在错误,请退出后修改地图!",
"地图错误", JOptionPane.INFORMATION_MESSAGE);
System.exit(1);
}
public void loadFile(File file)
{
if (!file.getName().endsWith(".bws")) {
file = new File(file.getPath()+".bws");
}
try {
FileInputStream fis = new FileInputStream(file);
byte[] s = new byte[4+2*maps.mapSize*maps.mapSize];
fis.read(s);
level = s[0];
steps = s[1];
curManX = s[2];
curManY = s[3];
int i = 4;
for (int x=0; x<maps.mapSize; ++x) {
for (int y=0; y<maps.mapSize; ++y) {
curMap[x][y] = s[i++];
initMap[x][y] = s[i++];
}
}
} catch (Exception e) {
JOptionPane.showMessageDialog(this, "打开文件出错!",
"错误", JOptionPane.ERROR_MESSAGE);
}
stepsStack.clear();
repaint();
dataPanel.showMessage(level, steps);
}
public void saveFile(File file)
{
if (!file.getName().endsWith(".bws")) {
fil