2012-11-25 36 views
0

我正在处理一个问题,我遇到了很多麻烦。问题的概念是用砖块建造一座金字塔。整个金字塔的砖块都集中在窗户中央。我可以绘制一块砖,然后是两块砖,然后是三块砖,直到构成金字塔底部的12块砖,但所有的砖块都排列在窗口左侧的左边缘上,而不是在窗口中央。
如何使用嵌套for循环构建砖头棱锥形

使用getWidth()和getHeight()我可以做(getWidth() - BRICK_WIDTH)/ 2;获取砖的x坐标的中心。然后(getHeight()-BRICK_HEIGHT)/ 2;为一个砖的y坐标的中心。唯一的问题是我不明白在哪里输入代码,所以它适用于所有砖块,因此每行砖块都在窗口中居中。

import acm.program.*; 
import acm.graphics.*; 

public class Pyramid extends GraphicsProgram { 
    public void run() { 
    double xCoordinate = (getWidth() - BRICKWIDTH)/2; 
    double yCoordinate = (getHeight() - BRICK_HEIGHT/2); 
    for (int i = 0; i < BRICKS_IN_BASE; i++) { 
     for (int j = 0; j < i; j++) { 
     double x = j * BRICK_WIDTH; 
     double y = i * BRICK_HEIGHT; 
     GRect square = new GRect(x, y, BRICK_WIDTH, BRICK_HEIGHT); 
     add(square); 
     } 
    } 
    } 
    private static final int BRICK_WIDTH = 50; 
    private static final int BRICK_HEIGHT = 25; 
    private static final int BRICKS_IN_BASE = 12; 
} 

回答

0

你应该尝试这样的事:

import acm.program.*; 
import acm.graphics.*; 

public class Pyramid extends GraphicsProgram 
{ 
    public void run() 
    { 
     // We calculate some values in order to center the pyramid vertically 
     int pyramidHeight = BRICKS_IN_BASE * BRICK_HEIGHT; 
     double pyramidY = (getHeight() - pyramidHeight)/2; 

     // For each brick layer... 
     for (int i=BRICKS_IN_BASE ; i >= 1; i--) 
     { 
      // We calculate some values in order to center the layer horizontally 
      int layerWidth = BRICKWIDTH * i; 
      double layerX = (getWidth() - layerWidth)/2; 
      double layerY = pyramidY + (i-1) * BRICK_HEIGHT; 

      // For each brick in the layer... 
      for(int j=0 ; j<i ; j++) 
      { 
       GRect square = new GRect(layerX + j*BRICK_WIDTH, layerY, BRICK_WIDTH, BRICK_HEIGHT); 
       add(square); 
      } 
     } 
    } 

    private static final int BRICK_WIDTH = 50; 
    private static final int BRICK_HEIGHT = 25; 
    private static final int BRICKS_IN_BASE = 12; 
} 

在此实现,我们首先计算层的总体宽度(因为我们已经知道有多少砖都会有它),我们用它找到图层的全局“开始点”,从中找到所有矩形的所有坐标。

+0

我只是试过你的代码,它的工作原理。它画出了我应该画的完全相同的图片。唯一的问题是它应该集中在窗户中,而不是坐在地上。 –

+0

我会编辑它来解决这个问题,我没有读它应该是垂直居中。 – Dinopony

+0

它是固定的,它现在应该垂直工作。 – Dinopony

0

你是指那样的事情?

double x = xCoordinate + j * BRICK_WIDTH; 
    double y = yCoordinate + i * BRICK_HEIGHT;