gpt4 book ai didi

java - 无法在列表中生成随机分散的真值和假值

转载 作者:行者123 更新时间:2023-12-01 21:45:10 27 4
gpt4 key购买 nike

我正在用 Java 设计一款扫雷游戏,但我在生成哪些方 block 是地雷/不是地雷时遇到了麻烦。这是到目前为止我的代码:

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.Random;
import java.util.Scanner;

public class MineSweeper {
private final boolean[][] mines;
public char[][] field;

public MineSweeper(int x, int y, int numMines) {
field = new char[x][y];

boolean[][] tmpMines = new boolean[x][y];

Random rand = new Random();

// Here is where I need to use rand to evenly disperse mines across
// the `tmpMines` array...

for (int i = 0; i < x; i++)
for (int j = 0; j < y; j++) {
field[i][j] = 'X';
}

mines = tmpMines;
}

public void showFor(int x, int y) {
int count = 0;

for (int[] i : new int[][]{ /* Sides */ {x + 1, y}, {x - 1, y}, {x, y - 1}, {x, y + 1}, /* Corners */ {x + 1, y + 1}, {x - 1, y -1}, {x + 1, y - 1}, {x - 1, y + 1}}) {
try {
if (mines[i[0]][i[1]] == true)
count++;
} catch (ArrayIndexOutOfBoundsException ex) {
// Easiest way to handle overflow.
}
}

field[x][y] = Integer.toString(count).charAt(0);
}

private static void printCharMatrix(char[][] matrix) {
for (char[] a : matrix) {
for (char c : a) {
System.out.print(c + " ");
}
System.out.println();
}
}

private static void printBoolMatrix(boolean[][] matrix) {
for (boolean[] a : matrix) {
for (boolean b : a) {
if (b == true)
System.out.print("X ");
else
System.out.print("O ");
}
System.out.println();
}
}

public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String input;

Pattern patt = Pattern.compile("^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*$"); // Matches any number of spaces, a digit, spaces, a comma, spaces, and a digit and extracts the 2 digits

System.out.println("*** Welcome to MineSweeper(tm)!!! ***");
System.out.println();
System.out.print("Enter the number of columns: ");
int x = scan.nextInt();
System.out.print("Enter the number of rows: ");
int y = scan.nextInt();
System.out.print("Enter the number of mines: ");
int mines = scan.nextInt();
MineSweeper ms = new MineSweeper(x, y, mines);

scan.nextLine();

while (true) {
System.out.println("Board:");
printCharMatrix(ms.field);
System.out.print("Type an array index (ex: 1,1). 'quit' to quit: ");
input = scan.nextLine().toLowerCase();

if (input.equalsIgnoreCase("quit"))
System.exit(0);

Matcher match = patt.matcher(input);

if (match.find()) {
x = Integer.parseInt(match.group(1));
y = Integer.parseInt(match.group(2));
if (ms.mines[x][y] == true) {
System.out.println("You failed!");
System.out.println("The board was: ");
System.out.println();
printBoolMatrix(ms.mines);
System.exit(0);
} else {
ms.showFor(x, y);
}
} else {
System.out.println("Invalid input: " + input);
}
}
}
}

我需要做的是将地雷均匀地分布在地雷上(如果是地雷则为true,如果不是地雷则为false)提供的地雷数量和矩阵大小 (x * y)。我尝试了几种策略,但没有一个有效。谢谢!

最佳答案

您可以使用 numMines true 和 x*y-numMines false 填充 tmpMines 数组,并对其使用shuffle 算法

有多种随机播放算法可以实现此目的,例如,您可能需要使用 this answer像这样打乱你的二维数组

// fill tmpMines array
for(int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
if (numMines > 0) {
numMines--;
tmpMines[i][j] = true;
} else {
tmpMines[i][j] = false;
}
}
}
// shuffle tmpMines array
for(int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
// int swapPos = rand.nextInt(x*y); this swapPos selection is not correct, please use the code next line.
int swapPos = x*y - rand.nextInt(x*y-i*y+j);
int swapPosY = swapPos / x;
int swapPosX = swapPos % x;

boolean tmp = tmpMines[i][j];
tmpMines[i][j] = tmpMines[swapPosX][swapPosY];
tmpMines[swapPosX][swapPosY] = tmp;
}
}

我这里直接使用并修改了numMines,因为这段代码之后就不会再使用了。如果您希望 numMines 不被修改,请使用临时变量。

附:您的列和行在代码中混合在一起(当我的输入显示 7 行时,我得到 7 列)。使用二维数组时请注意它们。

关于java - 无法在列表中生成随机分散的真值和假值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36074932/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com