我正在尝试从本书中学习Java The Art and Science of Java
练习书The Art and Science of Java第129页
我的问题是金字塔应该在窗口中居中
import acm.program.*;
import acm.graphics.*;
public class pyramid extends GraphicsProgram {
public void run() {
for (int i = 0; i < BRICK_IN_BASE; i++) {
for (int j = 0; j < i; j++) {
int x = BRICK_WIDTH * j ;
int y = BRICK_HEIGHT * i;
GRect brick = new GRect(x, y, BRICK_WIDTH, BRICK_HEIGHT);
add(brick);
}
}
}
private static final int BRICK_WIDTH =30 ;
private static final int BRICK_HEIGHT =20 ;
private static final int BRICK_IN_BASE = 12;
}
答案 0 :(得分:2)
我的问题是金字塔应该在窗口中居中
如果你的意思是你有一个固定的区域可以画入,金字塔应该在那个区域居中:
BRICK_IN_BASE * BRICK_WIDTH
x = (area.width-pyramid_width)/2
BRICK_IN_BASE * BRICK_HEIGHT
y = (area.height-pyramid_height)/2
除此之外,请注意,对于基数以上的每个级别,您必须将BRICK_WIDTH/2
添加到x偏移量。
编辑(澄清):
以上几点适用于让x和y坐标开始绘制。注意
x_offset + BRICK_WIDTH * j
BRICK_WIDTH/2
(您从顶部开始,因此该级别必须计算为(BRICK_IN_BASE - i - 1)in为了获得最高行的11和最低行的0)。答案 1 :(得分:1)
所以你需要找到x和y的偏移量。 金字塔的宽度为BRICK_WIDTH * BRICK_IN_BASE,因此您占据窗口宽度的一半并减去(BRICK_WIDTH * BRICK_IN_BASE)/ 2。 您使用相同的逻辑来查找y偏移量。
int x = xOffset + BRICK_WIDTH * j;
int y = yOffset + BRICK_HEIGHT * i;
我不熟悉acm包,取决于它如何实现GRect,这可能仍然是半块砖。但你可以轻松解决这个问题。
答案 2 :(得分:0)
import acm.graphics。; import acm.program。;
公共类BrickInTheWall扩展了GraphicsProgram {
private static final int BRICK_WIDTH = 20;
private static final int BRICK_HEIGHT = 10;
private static final int BRICK_IN_BASE = 10;
public void run(){
int w = BRICK_WIDTH * BRICK_IN_BASE + 200,h = BRICK_HEIGHT * BRICK_IN_BASE + 200;
for(int a = 1; a&lt; = BRICK_IN_BASE; a ++){ for(int i = 0; i&lt; a; i ++){ GRect rect = new GRect((w * 2) - BRICK_WIDTH / 2 * a + BRICK_WIDTH * i,40 + BRICK_HEIGHT * a,BRICK_WIDTH,BRICK_HEIGHT); 添加(RECT);
}
}
}
}