Java Вложенный для цикла (с оператором if во внутреннем цикле for)
Я пытаюсь создать шахматную доску с JavaFX. Строки и столбцы определяются входными данными. Последняя коробка должна быть белой. Мой код работает, если я начинаю с нечетного числа, но нет, если я начинаю с четного числа. Я не уверен, что не так с утверждением if-else if. Я смотрел на это часами. Пожалуйста помоги!
package application;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
/**
Java FX Hello World using a Label.
*/
public class VG_CheckerBoard0 extends Application
{
int columnIndex, rowIndex;
boolean nOdd;
@Override
public void start(Stage stage)
{
//get n from user
int n= Integer.parseInt(JOptionPane.showInputDialog("Please input a number to make checkerboard: "));
//create gridpane
GridPane gridpane = new GridPane();
gridpane.setGridLinesVisible(true);
// Create array of boxes
TextField[][] box = new TextField[n][n];
//set initial value of nOdd
if ( n%2 == 0 ){
nOdd = false;
System.out.println(nOdd);
}
else {
nOdd = true ;
System.out.println(nOdd);
}
//populate array of boxes, set color and position for each
for(int c= 0; c<box.length;c++){
for(int r= 0; r<box.length;r++){
box[c][r] = new TextField("x");
//System.out.println(box[c][r]);
if (nOdd == true){
box[c][r].setStyle("-fx-background-color: white;" + "-fx-border-color: black;");
//switch for next iteration
System.out.println(nOdd + " - inside if true before ");
nOdd = false;
System.out.println(nOdd + " - inside if true after");
}else if (nOdd == false){
box[c][r].setStyle("-fx-background-color: black;" + "-fx-border-color: black;");
//switch for next iteration
System.out.println(nOdd + " + inside if false before");
nOdd = true;
System.out.println(nOdd + " + inside if false after");
}
gridpane.add(box[c][r], c, r);
}//inner
}//outer
// Set label as the root of scene graph.
Scene scene = new Scene(gridpane);
stage.setScene(scene);
// Set stage title and show the stage.
stage.setTitle("Checkerboard");
stage.show();
}
public static void main(String[] args){
launch(args);
}
}
ВЫБОР ОБРАЗЦА НИЖЕ (РАБОТАЕТ ЧЕТКОЕ ЧИСЛО, ШАБЛОН ПРОВЕРКИ).
1 ответ
Что происходит, так как внешний цикл для столбцов, а число идентифицируется как even
он будет чередовать черный и белый для всех строк в этом столбце, но будет сброшен для последующих столбцов. Так например
initial value for nOdd = false
c = 0 c = 1 .. the process repeats again
|column 0|column 1|column 2|column3
it's alternating ------> |black |black nOdd = true
row-wise |--> |white |white nOdd = false
|black |black nOdd = true
|white |white nOdd = false
nOdd came full circle so it starts back in black again
Это работает на нечетное, потому что все выравнивается правильно
initial value for nOdd = true
c = 0 c = 1 .. the process repeats again
|column 0|column 1|column 2
it's alternating ------> |white |black nOdd = false
row-wise |--> |black |white nOdd = true
|white |black nOdd = false
nOdd started as true and ended as false so for the next column we get alternating colors
Одним из быстрых решений является проверка, если n
действительно даже после того, как вы прошли все итерации внутреннего цикла, а затем xor
переменная nOdd
с true
(причудливый способ сказать, "переключить" значение)
for(int c= 0; c<box.length;c++){
for(int r= 0; r<box.length;r++){
box[c][r] = new TextField("x");
//System.out.println(box[c][r]);
if (nOdd == true){
box[c][r].setStyle("-fx-background-color: white;" + "-fx-border-color: black;");
//switch for next iteration
System.out.println(nOdd + " - inside if true before ");
nOdd = false;
System.out.println(nOdd + " - inside if true after");
}else if (nOdd == false){
box[c][r].setStyle("-fx-background-color: black;" + "-fx-border-color: black;");
//switch for next iteration
System.out.println(nOdd + " + inside if false before");
nOdd = true;
System.out.println(nOdd + " + inside if false after");
}
gridpane.add(box[c][r], c, r);
}//inner
if(n % 2 == 0) {
nOdd = nOdd ^ true;
}
}//outer
Вы также можете использовать индексы r
а также c
решить цвет клеток. Незначительные детали, так как Java является мажорной строкой, возможно, лучше иметь r
как внешняя переменная для больших n
но я предполагаю, что вы не ожидаете иметь огромные значения для n
так что не беспокойся об этом слишком сильно.