2016-09-28 18 views
1

我是一個剛開始在大學學習java的學生。所以在今天的課程中,我的老師給了我一些任務,包括我必須使用StdIn.Draw庫編寫程序的一個任務,當你輸入一個數字N時,它打印出一個高N寬的NxN棋盤。我決定使用一個NxN數組,並將某些元素設置爲一個值(例如true),將其他元素設置爲另一個值。之後,我使用該庫來繪製與我剛剛創建的陣列相對應的棋盤。它看起來像這樣:我想在java中繪製一個NxN棋盤,但是在打印出白色的空白屏幕

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++; 
    } 
} 
} 

當我測試運行它,它只是打印出一個白色的空白屏幕,沒有別的。我找不到任何算法錯誤,並且我試圖調整初始a和b座標的大小以及X和Y的縮放倍數,但它不起作用。我試圖問我的朋友,但他們也不知道。

這是我的問題的截圖:

enter image description here

很抱歉,如果我的英語不好,因爲我不是一個母語。如果你能回答,請儘量簡單,因爲我剛開始學習編碼。謝謝。

哦另一回事。我正在學習基於這本書:http://introcs.cs.princeton.edu/java/home/

+0

檢查r'的'值了 - 看起來這將是零。 –

回答

2

這使用整數除法作爲兩個操作數是int。

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

投下一個操作數,或將其更改爲:

double r = 1.0/N; 

也爲內部while循環初始化櫃檯那裏, 你做B的復位,而不是j的後while循環。 有了一個for循環一個可以寫:

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; 
} 

不能確定的定位。

BTW

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

成爲

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

而且

 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); 
     } 

成爲

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

謝謝!該程序打印出來的東西,但它不是我所期望的: http://i.imgur.com/AG0Fo9Z.png 爲什麼上面的最後2塊總是相同的顏色? – marcofleuranza

+0

我發現循環後j沒有被重置;用for循環改變了答案。 –

0

沒有與線

double r = 1/N; 

由於1和N均爲整數一個問題,Java將執行整數除法,這意味着它將保持除法結果的整數部分和丟棄任何剩餘部分。

您可以執行Java的通過使分子雙浮點除法來代替:

double r = 1.0d/N; 

參考:Integer division: How do you produce a double?

+0

'1.0'已經是'double'了,不需要'd'。當你沒有小數時需要它(因爲否則它將被視爲整數)。所以,無論是'1.0'還是'1d'都可以工作,'1.0d'是多餘的 – BackSlash