推箱子小游戏--控制台

来源:互联网 发布:琅琊榜收视数据 编辑:程序博客网 时间:2024/05/02 06:44
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();
}}

推箱子小游戏--控制台
原创粉丝点击