2014-02-04 2 views
5

Вот ожидаемый результат моего кода:кафе Wall Иллюзия

Intended result

И вот мой код:

import java.awt.*; 

public class CafeWall 
{ 
    final static int MORTAR = 2; 
    final static int WIDTH = 650; 
    final static int HEIGHT = 400; 

    public static void main(String[] args) 
    { 
     StdDraw.setCanvasSize(WIDTH, HEIGHT); 
     StdDraw.setXscale(0, WIDTH); 
     StdDraw.setYscale(0, HEIGHT); 

// Change from Color.GRAY to change background color. 
     StdDraw.setPenColor(Color.GRAY); 
     StdDraw.filledRectangle(WIDTH/2, HEIGHT/2, WIDTH/2, HEIGHT/2); 

drawRow( 0, 378, 4, 20); 
drawRow( 50, 300, 5, 30); 

drawGrid( 10, 36, 4, 25, 0); 

drawGrid(250, 40, 3, 25, 10); 

drawGrid(425, 2, 5, 20, 10); 

drawGrid(400, 234, 2, 35, 35); 
    } 

    // Draw a row of squares, the total number of squares is pairs * 2 
    // (x, y) is the lower left corner of the first box 
    public static void drawRow(int x, int y, int pairs, int size) 
    { 
     StdDraw.setPenColor(Color.BLACK); 
     StdDraw.filledRectangle(x, y, size, size); 
     StdDraw.setPenColor(Color.BLUE); 
     StdDraw.line(x, y, x+size, y+size); 
     StdDraw.line(x, y+size, x+size, y); 
     StdDraw.setPenColor(Color.WHITE); 
     StdDraw.filledRectangle(x+size, y, size, size); 
    } 

    // Draw a grid of 2 * pairs rows 
    public static void drawGrid(int x, int y, int pairs, int size, 
    int offset) 
    { 
     int startingX = x; 
     for(int line = 1; line <= pairs; line++) { 
     if(line % 2 ==1) { //if line is odd 
      x = startingX; 
     } else { //else line is even and must be shifted by offset specified 
      x = startingX + offset; 
     } 
     for(int i = 1; i <= pairs; i++) { 
      drawRow(x, y, pairs, size); 
      x = x + 2*size; 
     } 

     y = y + size + MORTAR; 
     } 
    } 


} 

Проблемы:

  • Мои ряды не соответствует должным образом
  • Мои синие «х» не отображаются.

Я смотрел на это часами. Я не могу понять, где я ошибся. Может ли кто-нибудь предложить какое-то руководство?


(Дополнительное примечание) Это реальный выход из этого кода для тех, кто задается вопросом: Actual Output Screenshot

+0

Ну ... как выглядит ваша программа? Кроме того, всем остальным следует отметить, что рисунки с нижним и нижним правыми не имеют разной высоты для строк - это оптическая иллюзия. Измерьте значком мыши, если вам нужно подтверждение. – ajp15243

+0

Мы отвечаем на вопросы. Вы должны удалить свой пост и рассказать его как вопрос. – Mikhail

+0

Как насчет того, чтобы опубликовать свой результат? – futureelite7

ответ

8

Есть два важных проблем, которые вы с drawRow():

  1. Вы не правильно центрируете прямоугольники в drawRow
  2. вы не повторяя пары правильно в drawRow

Это то, что этот метод должен выглядеть следующим образом:

public static void drawRow(int x, int y, int pairs, int size) { 
    // loop for each pair. 
    for (int i = 0; i < pairs; i++) { 
     StdDraw.setPenColor(Color.BLACK); 
     // Note the correct centering of the rectangles 
     StdDraw.filledRectangle(x + size/2, y + size/2, size/2, size/2); 
     StdDraw.setPenColor(Color.BLUE); 
     StdDraw.line(x, y, x+size, y+size); 
     StdDraw.line(x, y+size, x+size, y); 
     StdDraw.setPenColor(Color.WHITE); 
     // Note the correct centering of the rectangles 
     StdDraw.filledRectangle(x+size+size/2, y + size/2, size/2, size/2); 
     // advance to the next pair. 
     x += size * 2; 
    } 
} 

в методе drawGrid() вы должны иметь дополнительный rows параметр, который указывает, сколько строк рисовать. Я модифицировал этот метод, чтобы выглядеть следующим образом:

public static void drawGrid(int x, int y, int rows, int pairs, int size, 
     int offset) 
{ 
    int startingX = x; 
    for(int line = 0; line < rows; line++) { 
     x = startingX + (line % 2) * offset; 
     drawRow(x, y, pairs, size); 

     y = y + size + MORTAR; 
    } 
} 

Обратите внимание на «умные» использование в (line % 2) * offset. Постройте это.

Собираем вместе, и изменение размера некоторых строк, у меня есть основной метод вызывает:

drawRow( 0, 378, 4, 20); 
    drawRow( 50, 300, 5, 30); 

    // Bottom left 
    drawGrid( 10, 36, 4, 4, 20, 0); 

    // bottom mid 
    drawGrid(250, 40, 6, 3, 25, 10); 

    // bottom right 
    drawGrid(425, 2, 10, 5, 16, 8); 

    // top right 
    drawGrid(400, 234, 4, 2, 35, 35); 

и мой результат выглядит следующим образом:

CafeWall

Это не огромные изменения от того, что у вас было ... немного логики здесь и там.

Смежные вопросы