扫雷 Java 代码详解214


扫雷是一款经典且令人着迷的逻辑游戏,它自诞生以来就吸引了无数玩家。作为一名 Java 程序员,您可以利用 Java 的强大功能创建您自己的扫雷实现。

要构建一个扫雷游戏,我们需要一个表示游戏状态的 网格(grid)。网格是一个二维数组,其中每个元素代表网格上的一个单元格。一个单元格可以是未打开的、打开的、标记为雷或包含数字。

以下是网格的 Java 代码:```java
private int[][] grid;
```

接下来,我们需要一种方法来 生成雷。我们可以通过随机选择网格中的单元格并将其标记为雷来实现这一点。以下是生成雷的代码:```java
private void generateMines(int numMines) {
for (int i = 0; i < numMines; i++) {
int x = (int) (() * );
int y = (int) (() * grid[0].length);
grid[x][y] = MINE;
}
}
```

一旦我们生成了雷,我们需要一种方法来 计算每个单元格周围的雷数。为此,我们可以使用循环来遍历网格中的每个单元格,并检查其周围八个单元格中的雷数。以下是计算雷数的代码:```java
private void calculateNums() {
for (int i = 0; i < ; i++) {
for (int j = 0; j < grid[0].length; j++) {
if (grid[i][j] == MINE) {
continue;
}
int numMines = 0;
for (int x = i - 1; x = 0 && y < grid[0].length && grid[x][y] == MINE) {
numMines++;
}
}
}
grid[i][j] = numMines;
}
}
}
```

有了这些基本功能,我们就可以 玩扫雷 了。玩家可以单击单元格来打开它们,如果单元格周围没有雷,则会显示雷数。如果单元格包含雷,玩家就输了。以下是玩游戏所需代码:```java
public void play() {
while (!isGameOver()) {
// 获取玩家输入
int x = getInputX();
int y = getInputY();
// 打开单元格
openCell(x, y);
// 检查游戏是否结束
if (isGameOver()) {
// 显示游戏结束消息
}
}
}
```

完整的 Java 扫雷代码:

您可以将以下所有代码复制粘贴到一个 Java 文件中,并创建一个 `Main` 类来运行游戏。```java
import ;
public class Minesweeper {
private static final int MINE = 9;
private int[][] grid;
private boolean gameOver;
public Minesweeper(int rows, int cols, int numMines) {
grid = new int[rows][cols];
generateMines(numMines);
calculateNums();
}
private void generateMines(int numMines) {
for (int i = 0; i < numMines; i++) {
int x = (int) (() * );
int y = (int) (() * grid[0].length);
grid[x][y] = MINE;
}
}
private void calculateNums() {
for (int i = 0; i < ; i++) {
for (int j = 0; j < grid[0].length; j++) {
if (grid[i][j] == MINE) {
continue;
}
int numMines = 0;
for (int x = i - 1; x = 0 && y < grid[0].length && grid[x][y] == MINE) {
numMines++;
}
}
}
grid[i][j] = numMines;
}
}
}
private boolean isGameOver() {
// 检查是否所有单元格都已打开或是否触雷
for (int[] row : grid) {
for (int cell : row) {
if (cell == MINE || cell == 0) {
return false;
}
}
}
return true;
}
private void openCell(int x, int y) {
if (grid[x][y] == MINE) {
gameOver = true;
} else if (grid[x][y] > 0) {
grid[x][y] = -grid[x][y];
} else {
openAdjacentCells(x, y);
}
}
private void openAdjacentCells(int x, int y) {
for (int i = x - 1; i = 0 && j < grid[0].length && grid[i][j] == 0) {
openCell(i, j);
}
}
}
}
private int getInputX() {
Scanner scanner = new Scanner();
("Enter row (0-based): ");
return ();
}
private int getInputY() {
Scanner scanner = new Scanner();
("Enter column (0-based): ");
return ();
}
public static void main(String[] args) {
Minesweeper game = new Minesweeper(10, 10, 10);
();
}
}
```

模拟运行效果:```
Enter row (0-based): 0
Enter column (0-based): 0
1 0 0 0 0 0 0 0 0 0
0 2 1 0 0 0 0 0 0 0
0 1 1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
Enter row (0-based): 1
Enter column (0-based): 1
1 0 0 0 0 0 0 0 0 0
2 2 1 0 0 0 0 0 0 0
0 1 1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
Enter row (0-based): 2
Enter column (0-based): 2
1 0 0 0 0 0 0 0 0 0
2 2 1 0 0 0 0 0 0 0
0 1 1 0 0 0 0 0 0 0
0

2024-10-22


上一篇:Java 数组随机取值:全面指南

下一篇:Java 中字符串包含字符串的多种方法