java推箱子小游戏代码
时间: 2023-09-04 17:09:32 浏览: 73
推箱子(Sokoban)是一款经典的益智游戏,下面是Java实现的推箱子游戏代码,希望能帮到你:
```java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Sokoban extends JFrame implements KeyListener {
private int x, y; // 玩家所在的位置
private int[][] map; // 地图
private int rows, cols; // 地图的行数和列数
private JLabel[][] lblMap; // 用于显示地图的标签
private ImageIcon iconBox, iconMan, iconWall, iconDest; // 箱子、玩家、墙和目的地的图标
public Sokoban() {
// 初始化地图
initMap();
// 初始化图标
iconBox = new ImageIcon("box.png");
iconMan = new ImageIcon("man.png");
iconWall = new ImageIcon("wall.png");
iconDest = new ImageIcon("dest.png");
// 初始化界面
JPanel pnlMap = new JPanel(new GridLayout(rows, cols));
lblMap = new JLabel[rows][cols];
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
lblMap[i][j] = new JLabel(getIcon(map[i][j]));
pnlMap.add(lblMap[i][j]);
}
}
add(pnlMap, BorderLayout.CENTER);
// 监听键盘事件
addKeyListener(this);
setFocusable(true);
}
private void initMap() {
rows = 6; cols = 8;
map = new int[][] {
{1, 1, 1, 1, 1, 1, 1, 1},
{1, 2, 0, 0, 3, 0, 0, 1},
{1, 0, 0, 0, 0, 0, 0, 1},
{1, 0, 3, 0, 0, 0, 0, 1},
{1, 0, 0, 0, 0, 0, 0, 1},
{1, 1, 1, 1, 1, 1, 1, 1},
};
x = 1; y = 1;
}
private Icon getIcon(int n) {
switch (n) {
case 0: return null; // 空地
case 1: return iconWall; // 墙
case 2: return iconMan; // 玩家
case 3: return iconBox; // 箱子
case 4: return iconDest; // 目的地
case 5: return new ImageIcon("boxok.png"); // 箱子在目的地上
default: return null;
}
}
public void keyPressed(KeyEvent e) {
int dx = 0, dy = 0;
switch (e.getKeyCode()) {
case KeyEvent.VK_UP: dy = -1; break;
case KeyEvent.VK_DOWN: dy = 1; break;
case KeyEvent.VK_LEFT: dx = -1; break;
case KeyEvent.VK_RIGHT: dx = 1; break;
}
// 移动
if (dx != 0 || dy != 0) {
int nx = x + dx, ny = y + dy;
if (map[nx][ny] == 0 || map[nx][ny] == 4) { // 空地或目的地
x = nx; y = ny;
} else if (map[nx][ny] == 3 || map[nx][ny] == 5) { // 箱子或箱子在目的地上
int nnx = nx + dx, nny = ny + dy;
if (map[nnx][nny] == 0 || map[nnx][nny] == 4) { // 箱子能够移动到的位置
if (map[nx][ny] == 3) {
map[nx][ny] = 0;
} else {
map[nx][ny] = 4;
}
if (map[nnx][nny] == 0) {
map[nnx][nny] = 3;
} else {
map[nnx][nny] = 5;
}
x = nx; y = ny;
}
}
// 更新地图
updateMap();
}
}
private void updateMap() {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
lblMap[i][j].setIcon(getIcon(map[i][j]));
}
}
}
public void keyTyped(KeyEvent e) {}
public void keyReleased(KeyEvent e) {}
public static void main(String[] args) {
Sokoban frame = new Sokoban();
frame.setTitle("Sokoban");
frame.setSize(400, 300);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
```
需要注意的是,这里用到的图片文件需要放在项目的根目录下,并且要求图标的大小一致。