Java写一个数字华容道
时间: 2024-03-10 14:47:29 浏览: 179
好的,以下是一个简单的数字华容道的 Java 实现,使用了一个 3x3 的矩阵来表示华容道,其中 0 表示空格:
```java
import java.util.*;
public class DigitalHuarongRoad {
public static void main(String[] args) {
int[][] board = {{1, 2, 3}, {4, 5, 6}, {7, 8, 0}}; // 初始状态
shuffle(board); // 打乱顺序
System.out.println("华容道开始:");
printBoard(board);
while (!isSolved(board)) {
System.out.println("请输入移动方向(上:w,下:s,左:a,右:d):");
Scanner scanner = new Scanner(System.in);
String move = scanner.nextLine();
switch (move) {
case "w":
moveUp(board);
break;
case "s":
moveDown(board);
break;
case "a":
moveLeft(board);
break;
case "d":
moveRight(board);
break;
default:
System.out.println("无效的移动方向");
break;
}
printBoard(board);
}
System.out.println("恭喜你,华容道已完成!");
}
public static boolean isSolved(int[][] board) {
int num = 1;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (board[i][j] != num % 9) {
return false;
}
num++;
}
}
return true;
}
public static void shuffle(int[][] board) {
Random random = new Random();
for (int i = 0; i < 100; i++) {
switch (random.nextInt(4)) {
case 0:
moveUp(board);
break;
case 1:
moveDown(board);
break;
case 2:
moveLeft(board);
break;
case 3:
moveRight(board);
break;
}
}
}
public static void moveUp(int[][] board) {
int i = getEmptyRow(board);
int j = getEmptyCol(board);
if (i > 0) {
int temp = board[i][j];
board[i][j] = board[i-1][j];
board[i-1][j] = temp;
}
}
public static void moveDown(int[][] board) {
int i = getEmptyRow(board);
int j = getEmptyCol(board);
if (i < 2) {
int temp = board[i][j];
board[i][j] = board[i+1][j];
board[i+1][j] = temp;
}
}
public static void moveLeft(int[][] board) {
int i = getEmptyRow(board);
int j = getEmptyCol(board);
if (j > 0) {
int temp = board[i][j];
board[i][j] = board[i][j-1];
board[i][j-1] = temp;
}
}
public static void moveRight(int[][] board) {
int i = getEmptyRow(board);
int j = getEmptyCol(board);
if (j < 2) {
int temp = board[i][j];
board[i][j] = board[i][j+1];
board[i][j+1] = temp;
}
}
public static int getEmptyRow(int[][] board) {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (board[i][j] == 0) {
return i;
}
}
}
return -1;
}
public static int getEmptyCol(int[][] board) {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (board[i][j] == 0) {
return j;
}
}
}
return -1;
}
public static void printBoard(int[][] board) {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
System.out.print(board[i][j] + " ");
}
System.out.println();
}
}
}
```
在 `main` 方法中,我们先初始化一个 3x3 的矩阵来表示华容道的初始状态,然后调用 `shuffle` 方法来随机打乱数字顺序。接下来,我们进入一个循环,每次循环中输出当前的数字华容道状态,并提示用户输入移动方向。根据用户输入的方向,我们调用相应的方法来移动数字,并再次输出当前状态。当华容道恢复到初始状态时,循环结束,华容道游戏完成。
在程序中,我们使用了 `getEmptyRow` 和 `getEmptyCol` 方法来获取空格的位置,使用 `moveUp`、`moveDown`、`moveLeft` 和 `moveRight` 方法来移动数字,使用 `printBoard` 方法来打印当前的数字华容道状态。`isSolved` 方法用于判断当前状态是否已经恢复到初始状态。
阅读全文