具体如下:元素类
class Elem {
int loc_x;
int loc_y;
int role; //1是人,2是箱子
}
地图类
class Map{
JButton[][] mapBt;
JPanel panel;
JFrame frame;
Map()
{
mapBt = new JButton[10][10];
frame = new JFrame("Boxman");
panel = new JPanel();
frame.setSize(600, 600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 添加面板
frame.add(panel);
int i, j;
for(i=0; i<10; i++)
for(j=0; j<10; j++)
mapBt[i][j] = new JButton();
for(i=0; i<10; i++)
for(j=0; j<10; j++)
{
panel.add(mapBt[i][j]);
}
initmap();
frame.setVisible(true);
}
//初始化地图就是把外转一圈置黑为墙,内部设置为白
void initmap()
{
int i, j;
for(i=0; i<10; i++)
for(j=0; j<10; j++)
{
mapBt[i][j].setBackground(Color.BLACK);
mapBt[i][j].setBounds(20*j, 20*i,20, 20);
}
for(i=1; i<9; i++)
for(j=1; j<9; j++)
{
mapBt[i][j].setBackground(Color.WHITE);
mapBt[i][j].setBounds(20*j, 20*i,20, 20);
}
}
}
游戏类
class Boxgame{
Elem man;
Elem box;
Map gameMap;
Boxgame()
{ //初始化人和箱子及地图
gameMap = new Map();
man = new Elem();
box = new Elem();
man.loc_x = 4;
man.loc_y = 2;
man.role = 1;
box.loc_x = 6;
box.loc_y = 3;
box.role = 2;
}
void run() {
gameKeyEvent(gameMap);
}
void setElem(Elem ele)
{
if(ele.role == 1)
gameMap.mapBt[ele.loc_y][ele.loc_x].setBackground(Color.BLUE); //人是蓝色
else if(ele.role == 2)
gameMap.mapBt[ele.loc_y][ele.loc_x].setBackground(Color.RED); //箱子是红色
}
void move()//人物的移动就是不同颜色到地图上
{
setElem(man);
setElem(box);
}
void gameKeyEvent(final Map map)
{
map.frame.requestFocus();
//响应键盘按键事件
map.frame.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
int key = e.getKeyCode();
if(key == KeyEvent.VK_A)
{
man.loc_x = man.loc_x -1;
map.initmap();
move();
}
if(key == KeyEvent.VK_D)
{
man.loc_x = man.loc_x + 1;
map.initmap();
move();
}
if(key == KeyEvent.VK_W)
{
man.loc_y = man.loc_y -1;
map.initmap();
move();
}
if(key == KeyEvent.VK_S)
{
man.loc_y = man.loc_y + 1;
map.initmap();
move();
}
}
});
}
}
这个类里最难的是事件的窗口事件的监听,不过既然任督二脉打通了就没什么不好理解,只要去找用法就行了。
包和运行代码如下:
package example;
import java.awt.Color;
import java.awt.KeyboardFocusManager;
import java.awt.Window;
import java.io.IOException;
import java.awt.event.*;
import javax.swing.*;
public class Example {
public static void main(String[] args) {
// 创建 game实例
Boxgame game = new Boxgame();
game.run();
}
}
将上面的代码结合起来就能运行了
哈哈成功移动,当然了其它的具体逻辑(如通关、不能撞墙等)就不用写了。
不过还有一个问题就是程序启动的时候,地图并没有按我设置的排序,必须按一下才可以恢复。不知道什么原因,不是我暂时学习的重点,先不考虑了,后面再说。