GameFrame.java
package TXZ4;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class GameFrame extends JFrame {
private JPanel panel = null;
private JLabel[] goals = null;
private JLabel[] boxs = null;
private JLabel[] walls = null;
private JLabel worker = null;
private int index = 1;
private String[] workerImgpaths = null;
GameFrame(String title){
super(title);
setSize(22*48+15,12*48+35);
setLocationRelativeTo(null);
setDefaultCloseOperation(3);
initPanel();
addEvent();
}
public void LoadLevelData(LevelData levelData) {
panel.removeAll();
initWalls(levelData.getWallsImgpaths(), levelData.getWallsLocations());
workerImgpaths = levelData.getWorkerImgpaths();
worker = initLabel(workerImgpaths[0], levelData.getWorkerLocations());
int[][] boxLocations = levelData.getBoxLocations();
boxs =new JLabel[boxLocations.length];
for (int i = 0; i < boxLocations.length; i++) {
boxs[i] = initLabel(levelData.getBoxImgpaths(),boxLocations[i]);
}
int[][] goalLocations = levelData.getGoalLocations();
goals = new JLabel[goalLocations.length];
for (int i = 0; i < goalLocations.length; i++) {
goals[i] = initLabel(levelData.getGoalImgpaths(),goalLocations[i]);
}
panel.repaint();
}
private void initPanel(){
panel = new JPanel();
panel.setBackground(Color.GRAY);
panel.setLayout(null);
setContentPane(panel);
}
private JLabel initLabel(String impath,int[] location){
ImageIcon img = new ImageIcon("imgs/"+impath);
JLabel label = new JLabel(img);
panel.add(label);
label.setBounds(location[0]*48,location[1]*48,48,48);
return label;
}
private void initWalls(String wallsImgPath, int[][] wallsLocations) {
ImageIcon wallImg = new ImageIcon("imgs/" + wallsImgPath);
walls = new JLabel[22 * 2 + (12 - 2) * 2 + wallsLocations.length];
for (int i = 0; i < walls.length; i++) {
walls[i] = new JLabel(wallImg);
}
int index = 0;
for (int i = 0; i < 22; i++) {
panel.add(walls[index]);
walls[index++].setBounds(i * 48, 0, 48, 48);
panel.add(walls[index]);
walls[index++].setBounds(i * 48, 11 * 48, 48, 48);
}
for (int i = 1; i <= 10; i++) {
panel.add(walls[index]);
walls[index++].setBounds(0, i * 48, 48, 48);
panel.add(walls[index]);
walls[index++].setBounds(21 * 48, i * 48, 48, 48);
}
for (int i = 0; i < wallsLocations.length; i++) {
int[] location = wallsLocations[i];//{6, 3}
panel.add(walls[index]);
walls[index++].setBounds(location[0] * 48, location[1] * 48, 48, 48);
}
}
private void addEvent(){
addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
int keycold = e.getKeyCode();
int x = 0,y = 0;
int workerImgpathIndex = 0;
if (keycold==KeyEvent.VK_W||keycold==KeyEvent.VK_UP){
y = -48;
}else if (keycold==KeyEvent.VK_S||keycold==KeyEvent.VK_DOWN){
y = 48;
workerImgpathIndex = 1;
}else if (keycold==KeyEvent.VK_A||keycold==KeyEvent.VK_LEFT){
x=-48;
workerImgpathIndex=2;
}else if (keycold==KeyEvent.VK_D||keycold==KeyEvent.VK_RIGHT){
x = 48;
workerImgpathIndex=3;
}
ImageIcon workerImg = new ImageIcon("imgs/"+workerImgpaths[workerImgpathIndex]);
worker.setBounds(worker.getBounds().x+x,worker.getBounds().y+y,48,48);
worker.setIcon(workerImg);
for (int i = 0; i < walls.length; i++) {
if (worker.getBounds().intersects(walls[i].getBounds())){
worker.setBounds(worker.getBounds().x-x,worker.getBounds().y-y,48,48);
break;
}
}
for (int i = 0; i < boxs.length; i++) {
if (worker.getBounds().intersects(boxs[i].getBounds())){
boxs[i].setBounds(boxs[i].getBounds().x+x,boxs[i].getBounds().y+y,48,48);
break;
}
}
for (int i = 0; i < boxs.length; i++) {
for (int j = 0; j < boxs.length; j++) {
if (i==j) continue;
if (boxs[i].getBounds().intersects(boxs[j].getBounds())){
boxs[i].setBounds(boxs[i].getBounds().x-x,boxs[i].getBounds().y-y,48,48);
worker.setBounds(worker.getBounds().x-x,worker.getBounds().y-y,48,48);
break;
}
}
}
for (int i = 0; i < walls.length ; i++) {
for (int j = 0; j < boxs.length; j++) {
if (boxs[j].getBounds().intersects(walls[i].getBounds())){
boxs[j].setBounds(boxs[j].getBounds().x-x,boxs[j].getBounds().y-y,48,48);
worker.setBounds(worker.getBounds().x-x,worker.getBounds().y-y,48,48);
break;
}
}
}
int count = 0;
for (int i = 0; i < boxs.length; i++) {
for (int j = 0; j < goals.length; j++) {
if (boxs[i].getBounds().intersects(goals[j].getBounds())){
count++;
}
}
}
if (count== boxs.length){
JOptionPane.showMessageDialog(null,"恭喜通过第【"+index+"】关");
index++;
LevelData levelData = LevelDataManager.getNowLevelData(index);
if (levelData==null){
JOptionPane.showMessageDialog(null,"恭喜通关");
System.exit(0);
}else{
LoadLevelData(levelData);
}
}
}
@Override
public void keyReleased(KeyEvent e) {
}
});
}
}
LevelData.java
package TXZ4;
public class LevelData {
public String goalImgpaths;
public int[][] goalLocations;
public String boxImgpaths;
public int[][] boxLocations;
public String[] workerImgpaths;
public int[] workerLocations;
public String wallsImgpaths;
public int[][] wallsLocations;
public String getGoalImgpaths() {
return goalImgpaths;
}
public void setGoalImgpaths(String goalImgpaths) {
this.goalImgpaths = goalImgpaths;
}
public int[][] getGoalLocations() {
return goalLocations;
}
public void setGoalLocations(int[][] goalLocations) {
this.goalLocations = goalLocations;
}
public String getBoxImgpaths() {
return boxImgpaths;
}
public void setBoxImgpaths(String boxImgpaths) {
this.boxImgpaths = boxImgpaths;
}
public int[][] getBoxLocations() {
return boxLocations;
}
public void setBoxLocations(int[][] boxLocations) {
this.boxLocations = boxLocations;
}
public String[] getWorkerImgpaths() {
return workerImgpaths;
}
public void setWorkerImgpaths(String[] workerImgpaths) {
this.workerImgpaths = workerImgpaths;
}
public int[] getWorkerLocations() {
return workerLocations;
}
public void setWorkerLocations(int[] workerLocations) {
this.workerLocations = workerLocations;
}
public String getWallsImgpaths() {
return wallsImgpaths;
}
public void setWallsImgpaths(String wallsImgpaths) {
this.wallsImgpaths = wallsImgpaths;
}
public int[][] getWallsLocations() {
return wallsLocations;
}
public void setWallsLocations(int[][] wallsLocations) {
this.wallsLocations = wallsLocations;
}
}
LevelDataManager.java
package TXZ4;
public class LevelDataManager {
public static LevelData getNowLevelData(int i){
LevelData levelData =new LevelData();
if (i==1){
levelData.setGoalImgpaths("goal3.png");
int[][] goalLocations = {{8,9}, {17,6}};
levelData.setGoalLocations(goalLocations);
levelData.setBoxImgpaths("box3.png");
int[][] boxLocations = {{3,3}, {9,5}};
levelData.setBoxLocations(boxLocations);
String[] workerImgpaths = {"workerUp3.png","workerDown3.png","workerLeft3.png","workerRight3.png"};
levelData.setWorkerImgpaths(workerImgpaths);
levelData.setWorkerLocations(new int[]{17,6});
levelData.setWallsImgpaths("wall3.png");
int[][] wallsLocations = {
{4, 6},
{6, 8},
{7, 9},
{6, 3},
{8, 6},
{10, 3},
{12, 3},
{12, 4},
{12, 5},
{14, 2}
};
levelData.setWallsLocations(wallsLocations);
}else if (i==2){
levelData.setGoalImgpaths("goal.png");
int[][] goalLocations = {{8,9}, {17,6}};
levelData.setGoalLocations(goalLocations);
levelData.setBoxImgpaths("box.png");
int[][] boxLocations = {{3,3}, {9,5}};
levelData.setBoxLocations(boxLocations);
String[] workerImgpaths = {"workerUp.png","workerDown.png","workerLeft.png","workerRight.png"};
levelData.setWorkerImgpaths(workerImgpaths);
levelData.setWorkerLocations(new int[]{17,6});
levelData.setWallsImgpaths("wall.png");
int[][] wallsLocations = {
{4, 6},
{6, 8},
{7, 9},
{6, 3},
{8, 6},
{10, 3},
{12, 3},
{12, 4},
{12, 5},
{14, 2}
};
levelData.setWallsLocations(wallsLocations);
}else {
return null;
}
return levelData;
}
}
Run.java
package TXZ4;
public class Run {
public static void main(String[] args) {
GameFrame gameFrame = new GameFrame("推箱子4.0");
LevelData levelData =LevelDataManager.getNowLevelData(1);
gameFrame.LoadLevelData(levelData);
gameFrame.setVisible(true);
}
}