Java случайный цвет в блоки
Так что я программирую игровой прорыв на Java, и у меня уже есть массив с кубиками, но я хочу придать кирпичу (или рядам кирпичей) случайные цвета. У меня есть возможность 4 разных цветов; красный, зеленый, синий, желтый. Но с моим кодом, показанным ниже, я получаю разные цвета только при повторном открытии окна и игры. Может ли кто-нибудь помочь мне придать блокам случайные цвета?
public void prepareBlocks() {
int spacing = Breakout.BLOCKSPACING_Y;
Random rand = new Random();
int n = rand.nextInt(4) + 1;
Color colour = new Color(n);
if (n==1){
colour = Color.red;
} if (n==2){
colour = Color.yellow;
} if (n==3){
colour = Color.green;
} if (n==4){
colour = Color.blue;
}
lines[0] = new Line(0, colour);
lines[1] = new Line(BLOCKHEIGHT+spacing, colour);
lines[2] = new Line(BLOCKHEIGHT*2+2*spacing, colour);
lines[3] = new Line(BLOCKHEIGHT*3+3*spacing, colour);
lines[4] = new Line(BLOCKHEIGHT*4+4*spacing, colour);
lines[5] = new Line(BLOCKHEIGHT*5+5*spacing, colour);
for(int i = 0; i<lines.length; i++) {
blockCount += lines[i].numberblocks;
lines[i].fill();
}
}
2 ответа
Random rand = new Random();
int n = rand.nextInt(4) + 1;
Color colour = new Color(n);
if (n==1){
colour = Color.red;
} if (n==2){
colour = Color.yellow;
} if (n==3){
colour = Color.green;
} if (n==4){
colour = Color.blue;
}
lines[0] = new Line(0, colour);
lines[1] = new Line(BLOCKHEIGHT+spacing, colour);
lines[2] = new Line(BLOCKHEIGHT*2+2*spacing, colour);
lines[3] = new Line(BLOCKHEIGHT*3+3*spacing, colour);
lines[4] = new Line(BLOCKHEIGHT*4+4*spacing, colour);
lines[5] = new Line(BLOCKHEIGHT*5+5*spacing, colour);
независимо от того, что вы здесь делаете, все ваши блоки получат одинаковый цвет.
Несколько возможных рефакторингов:
Не работайте с жестко закодированными значениями для i,... будьте более динамичны в своем коде:
private int getRandomIndex(){
Random rand = new Random();
return rand.nextInt(colors.length); // no need for +
}
private Color[] colors = {Color.red, Color.yellow, Color.green, Color.blue};
Таким образом, вам не нужно добавлять if... каждый раз, когда вы хотите добавить цвет, просто добавьте его в массив. Не говоря уже о том, что он сокращает код. Вы должны будете выяснить, как правильно добавить Blockheight и тому подобное.
// ....
for ( int i = 0; i < lines.length; i++ ){
lines[i] = new Line(BLOCKHEIGHT + " everything else you need here", colors[getRandomIndex()];
}
Теперь у вас проблема в том, что вы используете один и тот же экземпляр Color для всех ваших линий.
Предполагая, что вы хотите, чтобы каждая строка имела одинаковый цвет, вы просто вставляете случайное число перед применением к новой строке. После некоторой очистки кода это будет выглядеть так:
public void prepareBlocks() {
int spacing = Breakout.BLOCKSPACING_Y;
Random rand = new Random();
Color colour;
for(int i=0; i<lines.length; i++){
switch(rand.nextInt(4) + 1){
case 1: colour = Color.red; break;
case 2: colour = Color.yellow; break;
case 3: colour = Color.green; break;
case 4: colour = Color.blue; break;
default: colour = new Color(n);
}
lines[i] = new Line(BLOCKHEIGHT*i+i*spacing, colour);
blockCount += lines[i].numberblocks;
lines[i].fill();
}
}
РЕДАКТИРОВАТЬ Хотя для еще более красивого кода вы должны сохранить цвета в массиве (даже безопаснее, чем мой переключатель), как предложил Стултуске в своем ответе.