用华容道 java代码
时间: 2023-11-24 11:40:51 浏览: 94
java 华容道 代码
4星 · 用户满意度95%
以下是一个简单的华容道Java代码示例:
```java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
public class HuarongDao {
private int[][] board; // 游戏棋盘
private int emptyX, emptyY; // 空格子的位置
private int targetX, targetY; // 目标格子的位置
public HuarongDao() {
board = new int[4][5];
reset();
}
// 重新开始游戏
public void reset() {
// 初始化棋盘
board[0] = new int[]{1, 1, 1, 1, 1};
board[1] = new int[]{1, 1, 1, 1, 1};
board[2] = new int[]{0, 2, 2, 2, 0};
board[3] = new int[]{0, 3, 3, 3, 0};
// 随机生成空格子的位置
Random random = new Random();
emptyX = random.nextInt(4);
emptyY = random.nextInt(5);
// 随机生成目标格子的位置
do {
targetX = random.nextInt(4);
targetY = random.nextInt(5);
} while (targetX == emptyX && targetY == emptyY);
}
// 判断游戏是否结束
public boolean isGameOver() {
return targetX == 2 && targetY == 0;
}
// 判断某个位置是否合法
private boolean isValidPosition(int x, int y) {
return x >= 0 && x < 4 && y >= 0 && y < 5 && (x != emptyX || y != emptyY);
}
// 移动棋子
public boolean move(int x, int y) {
if (!isValidPosition(x, y)) {
return false;
}
// 判断是否可以移动到指定位置
if (x == emptyX) {
int min = Math.min(emptyY, y);
int max = Math.max(emptyY, y);
for (int i = min + 1; i < max; i++) {
if (board[x][i] != 0) {
return false;
}
}
} else if (y == emptyY) {
int min = Math.min(emptyX, x);
int max = Math.max(emptyX, x);
for (int i = min + 1; i < max; i++) {
if (board[i][y] != 0) {
return false;
}
}
} else {
return false;
}
// 移动棋子并更新空格子位置
board[emptyX][emptyY] = board[x][y];
board[x][y] = 0;
emptyX = x;
emptyY = y;
return true;
}
// 获取当前棋盘状态
public int[][] getBoard() {
int[][] copy = new int[4][5];
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 5; j++) {
copy[i][j] = board[i][j];
}
}
return copy;
}
// 获取可移动的棋子位置列表
public List<int[]> getValidMoves() {
List<int[]> moves = new ArrayList<>();
if (isValidPosition(emptyX - 1, emptyY)) {
moves.add(new int[]{emptyX - 1, emptyY});
}
if (isValidPosition(emptyX + 1, emptyY)) {
moves.add(new int[]{emptyX + 1, emptyY});
}
if (isValidPosition(emptyX, emptyY - 1)) {
moves.add(new int[]{emptyX, emptyY - 1});
}
if (isValidPosition(emptyX, emptyY + 1)) {
moves.add(new int[]{emptyX, emptyY + 1});
}
return moves;
}
// 获取目标格子位置
public int[] getTargetPosition() {
return new int[]{targetX, targetY};
}
// 打印当前棋盘状态
public void printBoard() {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 5; j++) {
System.out.print(board[i][j]);
}
System.out.println();
}
}
public static void main(String[] args) {
HuarongDao game = new HuarongDao();
game.printBoard();
while (!game.isGameOver()) {
List<int[]> moves = game.getValidMoves();
int[] move = moves.get(new Random().nextInt(moves.size()));
game.move(move[0], move[1]);
game.printBoard();
}
System.out.println("游戏结束!");
}
}
```
这个示例中,我们使用一个二维数组来表示华容道的棋盘状态。其中,数字1表示占用一个格子的棋子(曹操、关羽、张飞、赵云),数字2表示占用两个格子的棋子(马超、黄忠),数字3表示占用四个格子的棋子(曹操的小兵)。空格子用数字0表示。通过move方法可以移动棋子,通过getValidMoves方法可以获取当前可移动的棋子位置列表。可以通过printBoard方法打印当前棋盘状态。在main方法中,我们随机移动棋子直到游戏结束。
阅读全文