我正在尝试开发一个单面战舰游戏,我几乎所有设置。我只需要包含一个此时保存的数组,5,Ships对象。我为每艘船创建的类称为Ships.java。早些时候我在初始化阵列时遇到了问题但已经解决了。
当我尝试从阵列中的索引拉入船的长度(2,3,4或5)时出现问题。我不确定如何在概念上放置船只。
我觉得我已经尝试过do-whiles,for循环和if语句的每个组合。甚至试过一个开关盒。
目标是让计算机为五艘船选择位置,并将每个单元格设置为网格(ROWSxCOLS)等于NC_SHIP(未点击,加船)。问题在于它检查与网格上随机位置相邻的单元的位置。还必须检查有问题的船是否适合(从船上拉[i] .getShipLength())。
这是我到目前为止的代码:
int shipsPlaced = 0;
for (int i = 0; i < ships.length; i++)
{
boolean shipPlaced = false;
do
{
int randomRow = (int)(Math.random()*ROWS);
int randomCol = (int)(Math.random()*COLS);
int p = 0;
if (randomRow - ships[p].getShipLength() >= 0 && gameBoard[(randomRow - p)][randomCol] == NC_EMPTY)
{
for (int x = 0; x < ships[x].getShipLength(); x++)
{
gameBoard[(randomRow - x)][randomCol] = NC_SHIP;
shipsPlaced = shipsPlaced + 1;
if (x == ships[x].getShipLength())
{
shipPlaced = true;
p = p + 1;
}
}
}
}while (shipPlaced == false);
}
如果在这里看不到,那么所有内容都已初始化并设置。问题在于用于将船舶置于“随机”位置的数学/逻辑。
答案 0 :(得分:2)
首先:你的所有船只都是水平的,你也应该随机化船的放置方向。
我有两种方法可以解决这个问题:
1 - 对随机初始位置(x,y)进行递归查找(应该是免费的,如果不是重新抛出一个位置)。在递归&#34; lookForPos &#34;方法,做一个 randomPlacementDirection ,然后从中得到一个标志(例如isHorizontal)。 如果它不合适(从开始到最终位置的长度溢出矩阵的大小),重新抛出。 覆盖位置(位置,位置+ 1,位置+ 2,...,位置+ n),其中&#39; n&#39;是你的船的长度和位置是x,y对,+1只影响其中一个红衣主教(取决于是否是水平)如果其中任何一个也被占用重新抛出。 最终,您将拥有所需的一切。
2 - 列出所有适合的位置(一个&#39; for&#39;结构),水平和垂直,然后随机化列表的长度。
答案 1 :(得分:0)
我会做什么:
获取随机位置以尝试将您的船放在那里。 - 正如你所做的那样
循环迭代直到这一点(遍历整个数组 - 看起来你需要2个循环 - 一个直到数组结束,下一个从开始到那个点)
调用方法freeRowsInARow()
和freeColsInARow()
,从该给定点(x,y)开始,返回可插入那里的最大船只数量
检查您的船是否有size <= returnedValue
(来自上述方法),如果是 - 调用方法将其插入(选择方式 - 垂直或水平)和中断循环(与return
);如果没有 - 继续搜索。
答案 2 :(得分:0)
所以,你的问题是随机将战列舰放在棋盘上。有趣。这就是我如何做到的。
首先,我们假设我们有一个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()
方法返回true,如果传递的ship
可以放在位于board
位置的(r,c)
上并转向传递的direction
}
place()
方法将传递的ship
放在位置board
开始的(r,c)
上,然后转向传递的direction