Расстановка точек случайным образом на двухмерной доске - PullRequest
0 голосов
/ 06 февраля 2019

Как я могу генерировать случайные очки (жетоны, камни ...) в игре на основе 2D?

Жетоны - это двумерный массив точек: Token[][] gameBoard;

Игроки просто рисуют объекты.Он содержит цвета токена, который будет: Paint bluePaint, redPaint;

При инициализации я могу вручную произвольно разместить токены на плате, как показано ниже (из метода onCreate MainActivity):

bluePlayer = new Token(1,bluePaint, bgrBluePaint);
redPlayer = new Token(2, redPaint, bgrRedPaint);
gameBoard = new Token[100][100];

gameBoard[47][47]= redPlayer;
gameBoard[46][47]= bluePlayer;
gameBoard[44][48] = redPlayer; 
gameBoard[44][49]= redPlayer;
gameBoard[45][47]= redPlayer;
gameBoard[45][48]= bluePlayer;
gameBoard[45][49]= bluePlayer;
gameBoard[45][50]= redPlayer;
gameBoard[46][50]= bluePlayer;
gameBoard[46][49]= redPlayer;
gameBoard[46][48]= redPlayer;
gameBoard[47][50]= bluePlayer;
gameBoard[47][48]= bluePlayer;
gameBoard[47][49]= redPlayer;
gameBoard[48][50]= redPlayer;
gameBoard[48][49]= redPlayer;
gameBoard[48][48]= redPlayer;
gameBoard[49][50]= bluePlayer;
gameBoard[48][51]= redPlayer;

Так что мой вопрос, как случайным образом разместить redPlayer и bluePlayer в заданном диапазоне координат?Я имею в виду, что я хотел бы, чтобы они были случайно размещены, скажем, в ячейке, окружающей центр доски

class Token {

    private int _player;
    private Paint _paint, _bgrPaint;

    Token(int player, Paint paint, Paint bgrPaint) {
        _player = player;
        _paint = paint;
        _bgrPaint = bgrPaint;
    }

    Paint getPaint() {
        return _paint;
    }

    Paint get_bgrPaint() {
        return _bgrPaint;
    }

    int setPlayer(int _player, int _paint) {

        this._player = _paint;

        return _player;
    }

    int getPlayer() {
        return _player;
    }
}

Над классом токенов

1 Ответ

0 голосов
/ 06 февраля 2019

Вы можете использовать класс Random:

import java.util.Random;

// ...

void generateTokens(int count) {
    Random random = new Random();
    boolean isRed = false;

    for (int i = 0; i < count; i++) {
        int x = random.nextInt(100);
        int y = random.nextInt(100);

        gameBoard[x][y] = isRed ? redPlayer : bluePlayer;
        isRed = !isRed;
    }
}

Если вы хотите ограничить размещение токенов по центру доски, самый простой способ - просто ограничитьквадраты вышеупомянутая функция присваивает.Проблема с этим подходом заключается в том, что с уменьшением размера центра вероятность того, что вы напишете в ячейку, для которой уже была записана, возрастает.

Вместо этого вы можете предварительно сгенерировать списоквсе плитки, которые будут содержать жетоны.После этого рандомизируйте список, а затем итерируйте по нему, присваивая каждой плитке либо красный, либо синий цвет:

class Point { 
    public int X; 
    public int Y; 

    public Point(int x, int y) { 
        this.X = x; 
        this.Y = y;
    } 
}

// ...

void generateTokens(int centerRadius) {
    Random random = new Random();
    ArrayList<Point> positions = new ArrayList<>();

    for (int x = 49 - centerRadius; x <= 50 + centerRadius; x++) {
        for (int y = 49 - centerRadius; y <= 50 + centerRadius; y++) {
            postions.add(new Point(x, y));
        }
    }

    Collections.shuffle(positions);

    boolean isRed = true;

    for (int i = 0; i < positions.GetLength(); i++) {
      Point p = positions.get(i);
        gameBoard[p.X][p.Y] = isRed ? redPlayer : bluePlayer;
        isRed = !isRed;
    }
}

(я не в том месте, где я могу протестировать этот код, поэтому может потребоваться некоторыйнастройка, чтобы заставить его работать.)

...