需要帮助编程战列舰位置选择器/检查器

时间:2011-04-11 13:36:17

标签: java loops while-loop placement

我正在尝试开发一个单面战舰游戏,我几乎所有设置。我只需要包含一个此时保存的数组,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);

    }

如果在这里看不到,那么所有内容都已初始化并设置。问题在于用于将船舶置于“随机”位置的数学/逻辑。

3 个答案:

答案 0 :(得分:2)

首先:你的所有船只都是水平的,你也应该随机化船的放置方向。

我有两种方法可以解决这个问题:

  1. 首先调整初始位置然后查看船是否合适。
  2. 首先列出所有可用的位置,然后随机化一个等于列表长度的数字
  3. 1 - 对随机初始位置(x,y)进行递归查找(应该是免费的,如果不是重新抛出一个位置)。在递归&#34; lookForPos &#34;方法,做一个 randomPlacementDirection ,然后从中得到一个标志(例如isHorizo​​ntal)。 如果它不合适(从开始到最终位置的长度溢出矩阵的大小),重新抛出。 覆盖位置(位置,位置+ 1,位置+ 2,...,位置+ n),其中&#39; n&#39;是你的船的长度和位置是x,y对,+1只影响其中一个红衣主教(取决于是否是水平)如果其中任何一个也被占用重新抛出。 最终,您将拥有所需的一切。

    2 - 列出所有适合的位置(一个&#39; for&#39;结构),水平和垂直,然后随机化列表的长度。

答案 1 :(得分:0)

我会做什么:

  1. 获取随机位置以尝试将您的船放在那里。 - 正如你所做的那样

  2. 循环迭代直到这一点(遍历整个数组 - 看起来你需要2个循环 - 一个直到数组结束,下一个从开始到那个点)

  3. 调用方法freeRowsInARow()freeColsInARow(),从该给定点(x,y)开始,返回可插入那里的最大船只数量

  4. 检查您的船是否有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