给我一份用JAVA编写的扫雷游戏代码
时间: 2023-12-04 09:04:44 浏览: 71
好的,以下是使用Java编写的扫雷游戏代码。这个游戏是在控制台中实现的,具有基础的游戏功能。代码中注释会详细解释游戏逻辑和实现方法。
```java
import java.util.Random;
import java.util.Scanner;
public class Minesweeper {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Random rand = new Random();
int[][] board = new int[10][10]; // 初始化10*10的游戏面板
int[][] showBoard = new int[10][10]; // 初始化10*10的显示面板
int mineNum = 10; // 雷的数量
int count = 0; // 已经找到的雷的数量
boolean gameOver = false; // 游戏是否结束
boolean firstMove = true; // 是否是第一次移动
// 随机生成雷所在的位置
while (mineNum > 0) {
int x = rand.nextInt(10);
int y = rand.nextInt(10);
if (board[x][y] == 0) {
board[x][y] = 9; // 雷的标记为9
mineNum--;
}
}
// 游戏开始
while (!gameOver) {
// 打印游戏面板
System.out.println(" 0 1 2 3 4 5 6 7 8 9");
for (int i = 0; i < 10; i++) {
System.out.print(i + " ");
for (int j = 0; j < 10; j++) {
if (showBoard[i][j] == 0) {
System.out.print("- ");
} else if (showBoard[i][j] == 1) {
System.out.print(board[i][j] + " ");
} else if (showBoard[i][j] == 2) {
System.out.print("F ");
}
}
System.out.println("");
}
// 获取玩家输入
System.out.print("Enter row and column: ");
int row = sc.nextInt();
int col = sc.nextInt();
// 判断玩家输的坐标是否越界
if (row < 0 || row > 9 || col < 0 || col > 9) {
System.out.println("Invalid input!");
continue;
}
// 判断是否是第一次移动
if (firstMove) {
// 第一次移动不能踩到雷
while (board[row][col] == 9) {
// 随机生成新的位置
row = rand.nextInt(10);
col = rand.nextInt(10);
}
firstMove = false; // 第一次移动结束
}
// 判断玩家是否标记了该位置
System.out.print("Enter (1) to reveal or (2) to flag: ");
int action = sc.nextInt();
if (action == 1) { // 玩家选择揭开该位置
if (board[row][col] == 9) { // 玩家踩到雷了
System.out.println("Game Over!");
gameOver = true;
} else { // 没有踩到雷
int countMines = countMines(board, row, col); // 计算周围雷的数量
showBoard[row][col] = 1; // 显示该位置的数字
if (countMines > 0) { // 周围有雷
board[row][col] = countMines; // 把数字写进游戏面板中
} else { // 周围没有雷
reveal(board, showBoard, row, col); // 递归地揭开周围的位置
}
count++; // 已经找到的雷的数量加1
}
} else if (action == 2) { // 玩家选择标记该位置
showBoard[row][col] = 2; // 在显示面板中标记该位置
if (board[row][col] == 9) { // 如果该位置是雷,已经找到的雷的数量加1
count++;
}
}
// 判断游戏是否结束
if (count == 10) { // 已经找到了所有的雷
System.out.println("You Win!");
gameOver = true;
}
}
sc.close();
}
// 计算周围雷的数量
public static int countMines(int[][] board, int row, int col) {
int count = 0;
for (int i = row - 1; i <= row + 1; i++) {
for (int j = col - 1; j <= col + 1; j++) {
if (i >= 0 && i < 10 && j >= 0 && j < 10 && board[i][j] == 9) {
count++;
}
}
}
return count;
}
// 递归地揭开周围的位置
public static void reveal(int[][] board, int[][] showBoard, int row, int col) {
if (row < 0 || row > 9 || col < 0 || col > 9 || showBoard[row][col] == 1) {
// 如果坐标越界或者已经揭开了,就返回
return;
}
int countMines = countMines(board, row, col); // 计算周围雷的数量
showBoard[row][col] = 1; // 显示该位置的数字
if (countMines > 0) { // 周围有雷
board[row][col] = countMines; // 把数字写进游戏面板中
} else { // 周围没有雷
reveal(board, showBoard, row - 1, col);
reveal(board, showBoard, row + 1, col);
reveal(board, showBoard, row, col - 1);
reveal(board, showBoard, row, col + 1);
}
}
}
```
希望这份代码能够帮到你!
阅读全文