2016-09-28 1 views
1

Ich bin ein Student, der gerade begann, Java in der Schule zu lernen. So gab mir mein Lehrer in der heutigen Lektion einige Aufgaben, einschließlich eines, mit dem ich ein Programm schreiben musste, indem ich die StdIn.Draw-Bibliothek benutzte, die beim Eintippen einer Zahl N ein NxN-Schachbrett mit Höhe und Breite N ausgibt. Ich entschied mich, ein NxN-Array zu verwenden und bestimmte Elemente in einen Wert (z. B. wahr) und andere in einen anderen Wert zu setzen. Danach habe ich die Bibliothek benutzt, um das Schachbrett mit dem jeweiligen Array zu zeichnen, das ich gerade erstellt habe. Es sieht wie folgt aus:ich versuche, ein NxN Schachbrett in Java zu zeichnen, aber in druckt einen weißen leeren Bildschirm

class chessboard { 
public static void main(String[] args) { 
    int N = StdIn.readInt(); 
    boolean[][] hi = new boolean[N][N]; 
    double r = 1/N; 
    int x = 0; 
    for (int i = 0; i < N; i++){ 
     for (int j = 0; j < N; j++){ 

      if ((int)(i+j)%2 == 0) 
       hi[i][j] = true; 
      else { 
       hi[i][j] = false; 
      } 
     } 
    } 
    StdDraw.setXscale(0.0, 5.0); 
    StdDraw.setYscale(0.0, 5.0); 
    int i = 0; 
    int j = 0; 
    double a = 1.0; 
    double b = 1.0; 
    while ((a < N) && (i < N)){ 
     while ((b < N) && (j < N)){ 
      if (hi[i][j] != true){ 
       StdDraw.setPenColor(StdDraw.BLACK); 
       StdDraw.filledSquare(a ,b, r); 
      } 
      else { 
       StdDraw.setPenColor(StdDraw.RED); 
       StdDraw.filledSquare(a ,b, r); 
      } 
      b = b + r; 
      j++; 
     } 
     b = 1.0;//reset b after the inner while loop 
     a = a + r; 
     i++; 
    } 
} 
} 

Wenn ich es testen, ausführen, druckt es nur einen weißen leeren Bildschirm aus, sonst nichts. Ich konnte mit meinem Algorithmus nichts falsch finden, und ich habe versucht, die Größe der ursprünglichen a und b-Koordinate und der X- und Y-Skala viele Male anzupassen, aber es funktioniert einfach nicht. Ich habe versucht, meine Freunde danach zu fragen, aber sie wissen es auch nicht.

Das ist mein Screenshot des Problems:

enter image description here

Sorry, wenn mein Englisch ist schlecht, denn ich kein Muttersprachler bin. Und bitte, wenn Sie antworten könnten, dann halten Sie es einfach für mich, weil ich gerade angefangen habe, zu programmieren. Vielen Dank.

Oh eine andere Sache. Ich studiere basierend auf diesem Buch: http://introcs.cs.princeton.edu/java/home/

+0

Prüfung der Wert von 'r' - sieht aus wie es wäre Null. –

Antwort

2

Dies verwendet Integer-Division, da beide Operanden int sind.

double r = 1/N; // = 0; !! 

So einen Operanden werfen, oder sie ändern:

double r = 1.0/N; 

Auch für die innere while-Schleife initialisiert den Zähler gibt, haben Sie einen Reset von b, aber nicht von j nach dem while-Schleife. Mit einer for-Schleife könnte man schreiben:

double a = 1.0; 
for (int i = 0; i < N; ++i) { 
    double b = 1.0; 
    for (int j = 0; j < N; ++j) { 
     StdDraw.setPenColor(hi[i][j] ? StdDraw.RED: StdDraw.BLACK); 
     StdDraw.filledSquare(a ,b, r); 
     b += r; 
    } 
    a += r; 
} 

über die Positionierung nicht sicher.

BTW

 if ((int)(i+j)%2 == 0) 
      hi[i][j] = true; 
     else { 
      hi[i][j] = false; 
     } 

wird

 hi[i][j] = (i + j) % 2 == 0; 

Und

 if (hi[i][j] != true){ 
     // Better: 
     //if (!hi[i][j]) { 
      StdDraw.setPenColor(StdDraw.BLACK); 
      StdDraw.filledSquare(a ,b, r); 
     } 
     else { 
      StdDraw.setPenColor(StdDraw.RED); 
      StdDraw.filledSquare(a ,b, r); 
     } 

wird

 StdDraw.setPenColor(hi[i][j] ? StdDraw.RED : StdDraw.BLACK); 
     StdDraw.filledSquare(a ,b, r); 
+0

Vielen Dank! Das Programm hat etwas ausgedruckt, aber es ist nicht, was ich erwartet habe: http://i.imgur.com/AG0Fo9Z.png Warum die oberen letzten 2 Blöcke immer die gleiche Farbe haben? – marcofleuranza

+0

Ich habe festgestellt, dass j nach der Schleife nicht zurückgesetzt wurde; änderte die Antwort mit einer for-Schleife. –

0

Es gibt ein Problem mit der Linie

double r = 1/N; 

Wegen 1 und N beiden ganzen Zahlen sind, Java-Integer-Division durchzuführen, was bedeutet, dass es den ganzzahligen Teil des Divisionsergebnisses halten und jegliche Rest verwerfen.

können Sie haben Java perform Teilungspunkt Floating anstelle der Zähler ein Doppel indem sie:

double r = 1.0d/N; 

Referenz: Integer division: How do you produce a double?

+0

'1.0' ist bereits ein' double', keine Notwendigkeit für das 'd'. Es wird stattdessen benötigt, wenn Sie keine Dezimalstellen haben (sonst wird es als Integer behandelt). Also, entweder '1.0' oder' 1d' funktioniert, '1.0d' ist redundant – BackSlash

Verwandte Themen