Как я нацеливаюсь на мою случайную переменную цвета в моем утверждении IF? - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть вопрос, который следует из выбранного лучшего ответа из моего предыдущего поста: Как я могу использовать рандомизацию, чтобы указать разные параметры объекта для одной итерации в al oop? Я новичок в стек, и я не был уверен, что лучше всего сослаться на этот пост.

У меня есть код, написанный в соответствии с рекомендациями из поста выше, однако, сейчас я пытаюсь заставить метод запускать разные строки кода основываясь на цвете «кирпича», с которым взаимодействует мой объект «шар»:

public Color brickColour;


public GameObj( int x, int y, int w, int h, Color c ){
        topX   = x;       
        topY = y;
        width  = w; 
        height = h; 
        colour = c;
}

public void initialiseGame(){
    Random random = new Random();
    int yellowBrick = random.nextInt(5);
    for (int i = 0; i < 5; i++) {
        brickColour = i == yellowBrick ? Color.YELLOWGREEN : Color.BLUE;
        GameObj brick = new GameObj(i*100, 100, BRICK_WIDTH, BRICK_HEIGHT, brickColour);
        brick.moveX(75);
        brick.visible = true;
        bricks.add(brick);
        System.out.println("Model:: Create Brick =" + brick);
    }
}

public synchronized void updateGame(){
           for(GameObj brick: bricks){
                if (ball.hitBy(brick)){
                    if(brickColour.equals(Color.YELLOWGREEN)){
                        ball.changeDirectionY();
                        addToScore(HIT_BRICK);
                        brick.visible = false;
                        Debug.trace("Model::Brick Hit YELLOWGREEN = " + brick);
                        startGame();
                    }else {
                        ball.changeDirectionY();
                        addToScore(HIT_BRICK);
                        brick.visible = false;
                        Debug.trace("Model::Brick Hit = " + brick);
                    }
                }
            }
}

Я проверил программу, и когда ЖЕЛТЫЙ ЗЕЛЕНЫЙ «кирпич» нажал, он все еще выполняет оператор else , Затем я напечатал переменную brickColour и получил «0x0000ffff», хотя, даже используя это в качестве строки в параметрах color.equals (), он не работал. Как именно можно нацелиться на желто-зеленый кирпичный объект?

1 Ответ

3 голосов
/ 19 февраля 2020

Ваша проблема заключается в следующем:

brickColour = i == yellowBrick ? Color.YELLOWGREEN : Color.BLUE;

Вы определили здесь глобальную переменную и используете любой из последних наборов. Вы должны сделать это локальной переменной и не использовать ее повторно между методами.

for (int i = 0; i < 5; i++) {
    Color brickColour = i == yellowBrick ? Color.YELLOWGREEN : Color.BLUE;
    GameObj brick = new GameObj(i*100, 100, BRICK_WIDTH, BRICK_HEIGHT, brickColour);
    // omitted for answer
}

Тогда при выполнении проверки:

for(GameObj brick: bricks){
    if (ball.hitBy(brick)){
        if(brick.brickColour == Color.YELLOWGREEN) {
             // yellow logic
        } else {
             // blue logic
        }
    }
}

Конечно, использование самого цвета довольно плохое дизайнерское решение для начала. Вместо этого вы хотели бы иметь свойство GameObj, которое объявляет его тип кирпича, и иметь цвет, определяемый типом кирпича. Но это имеет отношение к этой дискуссии.

Урок здесь заключается в том, чтобы сделать ваши переменные доступными только для того, что необходимо. Не используйте глобальные, если вам не нужно, используйте местных жителей, где вы можете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...