public class BoxGame { public static boolean isWin = false; private int row, col;// 有多少行,多少列 private int box_count;// 箱子个数 private int[][] gameCore;// 游戏核心 二维地图 static private final Random RANDOM = new Random(); public static final Scanner scanner = new Scanner(System.in); public BoxGame() { init(); } private void init(){ System.out.println("请输入地图行数,以回车键结束."); setRow(scanner.nextInt()+2); System.out.println("请输入地图列数,以回车键结束."); setCol(scanner.nextInt()+2); System.out.println("请输入需完成目标数,以回车键结束."); setBox_count(scanner.nextInt()); gameCore = new int[this.row][this.col]; createBoxGame(); player(); } public BoxGame(int row, int col, int box_count) { if (row < 2 || col < 2 || box_count < 1) throw new RuntimeException("参数异常,导致地图创建失败!"); this.row = row + 2;// 多加二行,用于制造墙壁 this.col = col + 2;// 多加二列,用于制造墙壁 this.box_count = box_count; gameCore = new int[this.row][this.col]; } public void createBoxGame() { int type = 0; for (int i = 0; i < this.row; i++) { for (int j = 0; j < this.col; j++) { type = RANDOM.nextInt(10); // 初始化地图 if (type < 1 || i == 0 || i == this.row - 1 || j == 0 || j == this.col - 1) { gameCore[i][j] = 1;// 墙壁 } else { gameCore[i][j] = 0;// 空地 } } } //人 gameCore[1][1] = 5; // 往地图上放星星 makeStar(); // 往地图上放箱子 makeBox(); } // 往地图上放星星 private void makeStar() { int row = 0; int col = 0; for (int i = 0; i < box_count; i++) { row = RANDOM.nextInt(this.row); col = RANDOM.nextInt(this.col); // 判断构建的星星在地图上是否合法 if (gameCore[row][col] == 0) { // 合法 gameCore[row][col] = 2;// 记录星星的位置 } else { i--;//添加失败,次数还原 } } } // 往地图上放箱子 private void makeBox() { int row = -1; int col = -1; int type = -1; for (int i = 0; i < box_count; i++) { row = RANDOM.nextInt(this.row); col = RANDOM.nextInt(this.col); // 检查箱子的合法性及可行性 type = checkBox(row, col); if(type != -1){ gameCore[row][col]=type; }else{ i--; } } } private int checkBox(int row, int col) { if (gameCore[row][col] == 1 || gameCore[row][col] == 3 || gameCore[row][col] == 4 ||gameCore[row][col] == 5) return -1; if(gameCore[row][col] == 2) return 4; // 判断是否是死角 if ((gameCore[row + 1][col] == 1 || gameCore[row - 1][col] == 1) && (gameCore[row][col + 1] == 1 || gameCore[row][col - 1] == 1)) return -1; return 3; } public int getRow() { return row; } public void setRow(int row) { this.row = row; } public int getCol() { return col; } public void setCol(int col) { this.col = col; } public int getBox_count() { return box_count; } public void setBox_count(int box_count) { this.box_count = box_count; } public int[][] getGameCore() { return gameCore; } public void setGameCore(int[][] gameCore) { this.gameCore = gameCore; } public void player(){ Person p = new Person(getGameCore(), 1, 1,box_count); p.printMap(); int dir = -1; System.out.println("游戏说明:"); System.out.println(" 〓:墙壁 £:is you ◎:箱子 ☆:目标 ★:成功"); System.out.println(" 上:8 下:5 or 2 左:4 右:6"); System.out.println(" 退出:7 下一关:9"); System.out.println("请输入你接下来的操作:"); do { if(isWin){ isWin=false;
init(); break; } dir = scanner.nextInt(); if(dir == 7) break; else if(dir == 9){ init(); break; } p.move(dir); } while (true); } public static void main(String[] args) { new BoxGame(); } } class Person { private int row, col;// 小人所在的位置,注意这里的row、col和BoxGame中row、col的区别,完全不是一个概念 private int[][] gameCore;// 游戏核心 二维地图 private int box_count;//目标数 private boolean flag = false;// 标记人物是否与目标重合 public Person(int[][] gameCore, int row, int col,int box_count) { this.gameCore = gameCore; this.row = row; this.col = col; this.gameCore[row][col] = 5; this.box_count = box_count; } public void move(int dir) { switch (dir) { case 8: up(); break; case 2: case 5: down(); break; case 4: left(); break; case 6: right(); break; } printMap(); } private void up() { // 往上走 if (row == 1 || gameCore[row - 1][col] == 1) return; if(startMove(-1, 0)) this.row--; } private void down() { // 往下走 if (row == gameCore.length) return; if(startMove(1, 0)) this.row++; } // 0:空地 1:墙壁 2: 目标 3:箱子 4:完成 5:小人 private boolean startMove(int row_value, int col_value) { flag = gameCore[row][col] == 6; if (gameCore[row + row_value][col + col_value] == 0) { // 空地 if (flag) { gameCore[row][col] = 2; gameCore[row + row_value][col + col_value] = 5; } else { gameCore[row][col] = 0; gameCore[row + row_value][col + col_value] = 5; } } else if (gameCore[row + row_value][col + col_value] == 2) { if (flag) { gameCore[row][col] = 2; gameCore[row + row_value][col + col_value] = 6; } else { gameCore[row][col] = 0; gameCore[row + row_value][col + col_value] = 6; } } else if (gameCore[row + row_value][col + col_value] == 3) { // 推动箱子 // 判断箱子是否可以移动 if (gameCore[row + row_value + row_value][col + col_value + col_value] == 1 || gameCore[row + row_value + row_value][col + col_value + col_value] == 3 || gameCore[row + row_value + row_value][col + col_value + col_value] == 4) { return false; } if (flag) { // 空地 if (gameCore[row + row_value + row_value][col + col_value + col_value] == 0) { gameCore[row + row_value + row_value][col + col_value + col_value] = 3; gameCore[row + row_value][col + col_value] = 5; gameCore[row][col] = 2; } else if (gameCore[row + row_value + row_value][col + col_value + col_value] == 2) { // 目标 gameCore[row + row_value + row_value][col + col_value + col_value] = 4; gameCore[row + row_value][col + col_value] = 5; gameCore[row][col] = 2; } } else { // 空地 if (gameCore[row + row_value + row_value][col + col_value + col_value] == 0) { gameCore[row + row_value + row_value][col + col_value + col_value] = 3; gameCore[row + row_value][col + col_value] = 5; gameCore[row][col] = 0; } else if (gameCore[row + row_value + row_value][col + col_value + col_value] == 2) { // 目标 gameCore[row + row_value + row_value][col + col_value + col_value] = 4; gameCore[row + row_value][col + col_value] = 5; gameCore[row][col] = 0; } } } else if (gameCore[row + row_value][col + col_value] == 4) { // 推已经完成的. // 判断箱子是否可以移动 if (gameCore[row + row_value + row_value][col + col_value + col_value] == 1 || gameCore[row + row_value + row_value][col + col_value + col_value] == 3 || gameCore[row + row_value + row_value][col + col_value + col_value] == 4) { return false; } if (flag) { // 空地 if (gameCore[row + row_value + row_value][col + col_value + col_value] == 0) { gameCore[row + row_value + row_value][col + col_value + col_value] = 3; gameCore[row + row_value][col + col_value] = 6; gameCore[row][col] = 2; } else if (gameCore[row + row_value + row_value][col + col_value + col_value] == 2) { // 目标 gameCore[row + row_value + row_value][col + col_value + col_value] = 4; gameCore[row + row_value][col + col_value] = 6; gameCore[row][col] = 2; } } else { // 空地 if (gameCore[row + row_value + row_value][col + col_value + col_value] == 0) { gameCore[row + row_value + row_value][col + col_value + col_value] = 3; gameCore[row + row_value][col + col_value] = 6; gameCore[row][col] = 0; } else if (gameCore[row + row_value + row_value][col + col_value + col_value] == 2) { // 目标 gameCore[row + row_value + row_value][col + col_value + col_value] = 4; gameCore[row + row_value][col + col_value] = 6; gameCore[row][col] = 0; } } } return true; } private void left() { // 往左 if (col == 1) return; if(startMove(0, -1)) this.col--; } private void right() { // 往右 if (col == gameCore[0].length - 2) return; if(startMove(0, 1)) this.col++; } private void isWin(){ int count=0; for (int i = 0; i < gameCore.length; i++) { for (int j = 0; j < gameCore[0].length; j++) { if(gameCore[i][j] == 4) count++; } } if(count == box_count){ System.out.println("游戏胜利."); BoxGame.isWin = true; } } // 0:空地 1:墙壁 2: 目标 3:箱子 4:完成 5:小人 6 人物与目标重合 public void printMap() { System.out.println("\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n"); for (int i = 0; i < gameCore.length; i++) { for (int j = 0; j < gameCore[0].length; j++) { switch (gameCore[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(); } isWin();
} }
推箱子小游戏--控制台