所以,你的问题是随机将战列舰放在板上。有趣的。这就是我将如何做到的。
首先,假设我们有一个Ship
类:
public class Ship {
int size;
public Ship(int size) {
this.size = size;
}
public int getSize() {
return size;
}
}
然后,我会有一个BattleshipBoard
如下的课程:
public class BattleshipBoard {
private final int rows;
private final int cols;
private char[][] board;
public BattleshipBoard(int rows, int cols) {
this.rows = rows;
this.cols = cols;
board = new char[rows][cols];
}
public void place(Ship[] ships) {
Arrays.sort(ships, new Comparator<Ship>() {
@Override
public int compare(Ship s1, Ship s2) {
return Integer.valueOf(s1.size).compareTo(Integer.valueOf(s2.size));
}
});
for (int j = 0; j < rows; j++)
for (int k = 0; k < cols; k++)
board[j][k] = '-'; // Empty position
char[][] checked = new char[rows][cols];
Random random = new Random();
for (int i = ships.length - 1; i >=0; i--) {
for (int j = 0; j < rows; j++)
for (int k = 0; k < cols; k++)
checked[j][k] = 'U'; // Unchecked position
boolean placed = false;
while (! placed) {
int r = random.nextInt(rows);
int c = random.nextInt(cols);
if (checked[r][c] == 'U') {
checked[r][c] = 'C'; // Checked position
if (board[r][c] == '-') {
int direction = random.nextInt(4);
// 0 = North; 1 = East; 2 = South; 3 = West;
if (canPlace(ships[i], r, c, direction)) {
place(ships[i], r, c, direction);
placed = true;
}
}
}
}
}
}
private void place(Ship ship, int row, int col, int direction) {
int size = ship.getSize();
switch (direction) {
case 0: // North
for (int i = row; i >= row - (size - 1); i--)
board[i][col] = 'S';
break;
case 1: // East
for (int i = col; i <= col + (size - 1); i++)
board[row][i] = 'S';
break;
case 2: // South
for (int i = row; i <= row + (size - 1); i++)
board[i][col] = 'S';
break;
default: // West
for (int i = col; i >= col - (size - 1); i--)
board[row][i] = 'S';
break;
}
}
private boolean canPlace(Ship ship, int row, int col, int direction) {
int size = ship.getSize();
boolean thereIsRoom = true;
switch (direction) {
case 0: // North
if (row - (size - 1) < 0)
thereIsRoom = false;
else
for (int i = row; i >= row - (size - 1) && thereIsRoom; i--)
thereIsRoom = thereIsRoom & (board[i][col] == '-');
break;
case 1: // East
if (col + (size - 1) >= cols)
thereIsRoom = false;
else
for (int i = col; i <= col + (size - 1) && thereIsRoom; i++)
thereIsRoom = thereIsRoom & (board[row][i] == '-');
break;
case 2: // South
if (row + (size - 1) >= rows)
thereIsRoom = false;
else
for (int i = row; i <= row + (size - 1) && thereIsRoom; i++)
thereIsRoom = thereIsRoom & (board[i][col] == '-');
break;
default: // West
if (col - (size - 1) < 0)
thereIsRoom = false;
else
for (int i = col; i >= col - (size - 1) && thereIsRoom; i--)
thereIsRoom = thereIsRoom & (board[row][i] == '-');
break;
}
return thereIsRoom;
}
public void printBoard() {
for (int i = 0; i < rows; i++)
System.out.println(Arrays.toString(board[i]));
}
}
然后,如果你有这样的事情:
public static void main(String[] args) {
Ship[] ships = new Ship[] {
new Ship(1),
new Ship(3),
new Ship(2),
new Ship(3)
};
BattleshipBoard battleshipBoard = new BattleshipBoard(7, 7);
battleshipBoard.place(ships);
battleshipBoard.printBoard();
}
您可能会得到以下输出(取决于您的Random
生成器):
[-, -, -, -, -, -, -]
[-, -, -, -, -, -, -]
[-, -, S, -, -, -, -]
[-, -, -, -, -, -, -]
[-, S, -, S, S, -, -]
[-, S, -, -, -, -, -]
[-, S, -, -, S, S, S]
这是四艘大小为 1、2、3 和 3 的船的随机放置。
几点评论:
该place()
方法尝试通过选择随机起始位置(r,c)
和随机direction
数组已排序,因此我们首先从ships
最大的船开始(当我们的棋盘占用位置较少时,放置它们更容易)
该checked
矩阵用于避免(r,c)
在尝试放置船只时多次检查相同的随机位置
如果传递的可以放在起始位置并朝向传递的位置,则该canPlace()
方法返回trueship
board
(r,c)
direction
该place()
方法将传递ship
的位置放在board
起始位置(r,c)
并朝向传递direction