java推箱子设计思路
时间: 2023-12-18 12:29:52 浏览: 129
基于Java的推箱子小游戏的设计思路如下:
1.初始化模块:初始化地图,包括地图大小、地图元素(包括箱子、目标点、障碍物等)的位置和状态等。
2.画图模块:将地图元素绘制到游戏界面上,包括箱子、目标点、障碍物等。
3.移动小人模块:通过监听键盘事件,控制小人的移动,包括上下左右四个方向的移动。
4.移动箱子模块:当小人移动时,判断小人前方是否有箱子,如果有,则判断箱子前方是否有障碍物或者其他箱子,如果没有,则将箱子移动到小人前方。
5.功能控制模块:包括游戏开始、暂停、重新开始、下一关等功能的实现。
以下是Java推箱子的代码实现:
```java
// 初始化模块
public class Map {
private int[][] map; // 地图数组
private int row; // 行数
private int col; // 列数
private int playerX; // 小人的横坐标
private int playerY; // 小人的纵坐标
private int boxNum; // 箱子的数量
private int boxOnTargetNum; // 放在目标点上的箱子数量
private int targetNum; // 目标点的数量
// 构造函数
public Map(int[][] map, int row, int col) {
this.map = map;
this.row = row;
this.col = col;
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (map[i][j] == 2) { // 找到小人的位置
playerX = i;
playerY = j;
} else if (map[i][j] == 3) { // 统计箱子的数量和目标点的数量
boxNum++;
targetNum++;
} else if (map[i][j] == 4) { // 统计目标点的数量
targetNum++;
}
}
}
}
// 画图模块
public void drawMap() {
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
switch (map[i][j]) {
case 0: // 空地
System.out.print(" ");
break;
case 1: // 墙
System.out.print("#");
break;
case 2: // 小人
System.out.print("@");
break;
case 3: // 箱子
System.out.print("$");
break;
case 4: // 目标点
System.out.print(".");
break;
case 5: // 箱子在目标点上
System.out.print("*");
break;
case 6: // 小人在目标点上
System.out.print("+");
break;
}
}
System.out.println();
}
}
// 移动小人模块
public void movePlayer(int direction) {
int nextX = playerX;
int nextY = playerY;
switch (direction) {
case 0: // 上
nextX--;
break;
case 1: // 下
nextX++;
break;
case 2: // 左
nextY--;
break;
case 3: // 右
nextY++;
break;
}
if (map[nextX][nextY] == 0 || map[nextX][nextY] == 4) { // 空地或目标点
map[playerX][playerY] = map[playerX][playerY] == 6 ? 4 : 0; // 小人离开目标点或空地
playerX = nextX;
playerY = nextY;
map[playerX][playerY] = map[playerX][playerY] == 4 ? 6 : 2; // 小人到达目标点或空地
} else if (map[nextX][nextY] == 3 || map[nextX][nextY] == 5) { // 箱子或箱子在目标点上
int nextBoxX = nextX;
int nextBoxY = nextY;
switch (direction) {
case 0: // 上
nextBoxX--;
break;
case 1: // 下
nextBoxX++;
break;
case 2: // 左
nextBoxY--;
break;
case 3: // 右
nextBoxY++;
break;
}
if (map[nextBoxX][nextBoxY] == 0 || map[nextBoxX][nextBoxY] == 4) { // 箱子前方是空地或目标点
map[playerX][playerY] = map[playerX][playerY] == 6 ? 4 : 0; // 小人离开目标点或空地
playerX = nextX;
playerY = nextY;
map[playerX][playerY] = map[playerX][playerY] == 4 ? 6 : 2; // 小人到达目标点或空地
map[nextX][nextY] = map[nextX][nextY] == 5 ? 4 : 0; // 箱子离开目标点或空地
map[nextBoxX][nextBoxY] = map[nextBoxX][nextBoxY] == 4 ? 5 : 3; // 箱子到达目标点或空地
if (map[nextBoxX][nextBoxY] == 5) { // 箱子到达目标点
boxOnTargetNum++;
}
}
}
}
// 移动箱子模块
public void moveBox(int direction) {
int nextX = playerX;
int nextY = playerY;
switch (direction) {
case 0: // 上
nextX--;
break;
case 1: // 下
nextX++;
break;
case 2: // 左
nextY--;
break;
case 3: // 右
nextY++;
break;
}
if (map[nextX][nextY] == 0 || map[nextX][nextY] == 4) { // 箱子前方是空地或目标点
map[playerX][playerY] = map[playerX][playerY] == 6 ? 4 : 0; // 小人离开目标点或空地
playerX = nextX;
playerY = nextY;
map[playerX][playerY] = map[playerX][playerY] == 4 ? 6 : 2; // 小人到达目标点或空地
map[nextX][nextY] = map[nextX][nextY] == 5 ? 4 : 3; // 箱子到达目标点或空地
if (map[nextX][nextY] == 5) { // 箱子到达目标点
boxOnTargetNum++;
}
}
}
// 判断游戏是否结束
public boolean isGameOver() {
return boxNum == boxOnTargetNum;
}
}
// 功能控制模块
public class Game {
private Map map; // 地图对象
private int level; // 当前关卡
private boolean isRunning; // 游戏是否正在运行
// 构造函数
public Game(int[][] mapData, int row, int col) {
map = new Map(mapData, row, col);
level = 1;
isRunning = false;
}
// 开始游戏
public void start() {
isRunning = true;
while (isRunning) {
map.drawMap();
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
switch (input) {
case "w":
map.movePlayer(0);
break;
case "s":
map.movePlayer(1);
break;
case "a":
map.movePlayer(2);
break;
case "d":
map.movePlayer(3);
break;
case "r":
restart();
break;
case "n":
nextLevel();
break;
case "q":
isRunning = false;
break;
}
if (map.isGameOver()) {
System.out.println("恭喜你过关了!");
nextLevel();
}
}
}
// 重新开始
public void restart() {
map = new Map(MapData.getData(level), MapData.getRow(level), MapData.getCol(level));
}
// 进入下一关
public void nextLevel() {
level++;
if (level > MapData.LEVEL_NUM) {
System.out.println("已经是最后一关了!");
level = MapData.LEVEL_NUM;
} else {
map = new Map(MapData.getData(level), MapData.getRow(level), MapData.getCol(level));
}
}
}
// 主函数
public class Main {
public static void main(String[] args) {
Game game = new Game(MapData.getData(1), MapData.getRow(1), MapData.getCol(1));
game.start();
}
}
```
阅读全文