2016-09-28 61 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