I can't figure out why this isn't working!
On my current assignment I have to create a brick wall of multi-coloured tiles in java. All using blueJ and as you can see below my code on the "drawRow" method won't work, it just draws a single row and wont actually draw 4 rows with 8 bricks by length when I ask it to. Please help me and ask if you need more info...
Code :
import java.util.ArrayList;
/**
* Write a description of class BrickWall here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class BrickWall
{
// instance variables - replace the example below with your own
private Integer bWidth;
private Integer bHeight;
private Integer numRows;
private Integer rowLength;
private ArrayList<String> colors;
private ArrayList<Rectangle> bricks;
private Boolean decrease;
private Boolean isSymmetric;
private Boolean isMultiColor;
private Integer currentColor;
private Integer startX;
private Integer startY;
private Rectangle brick;
/**
* Constructor for objects of class BrickWall.
* @param rows The number of rows in the wall
* @param rowlen The maximum number of bricks in a row
* @param isMultiColor when false all bricks are the same colour. When true the colours cycle through the 6 colours.
* @param decrease If true subtract 2 from rowLen for each row drawn
* @param isSymmetric if decrease is greater than 0 and isSymmetric is true the wall is a pyramid shape, otherwise it is a rectangle or a right angle triangle.
*/
public BrickWall(Integer rows, Integer rowLen)
{
// initialise instance variables
setUpColors();
bWidth = 54;
bHeight = 16;
startX = 10;
startY = 550;
bricks = new ArrayList<Rectangle>();
currentColor = 0;
setNumRows(rows);
setRowLength(rowLen);
this.isMultiColor = false;
this.decrease = false;
this.isSymmetric = false;
}
private void setUpColors() {
colors = new ArrayList<String>();
colors.add("red");
colors.add("yellow");
colors.add("blue");
colors.add("green");
colors.add("magenta");
colors.add("black");
}
/**
* Toggle whether the wall is multicoloured.
*/
public void toggleMultiColour() {
isMultiColor = !isMultiColor;
currentColor = 0;
}
/**
* Toggle whether the decrease in a row length is symmetric.
*/
public void toggleSymmetric() {
isSymmetric = !isSymmetric;
}
/**
* Toggle whether the length of a new row is one less than the length of the previous row.
*/
public void toggleDecrease() {
decrease = ! decrease;
}
/**
* @return the number of bricks in the current wall.
*/
public Integer getNumberOfBricks() {
return bricks.size();
}
/**
* Set the length of a row. There can be no more than 22 bricks in a row.
* @param len The number of bricks in a row. If len is less than or equal
* to zero OR len is greater than 22, the row length will be assigned the value 22.
* Otherwise the length of a row will be assigned the value of len.
*/
public void setRowLength(Integer len) {
if (len <= 0 || len > 22) {
rowLength = 22;
} else {
rowLength = len;
}
}
/**
* Set the maximum number of rows in the wall. If the length of a row decreases,
* there may not be this many rows in the wall.
* @param rows The maximum number of rows in the wall. If rows is less than
* or equal to zero OR rows is greater than 30, the number of rows will be assigned the value 30.
* Otherwise the number of rows will be assigned the value of rows.
*/
public void setNumRows(Integer rows) {
if (rows <= 0 || rows > 30) {
numRows = 30;
} else {
numRows = rows;
}
}
private void drawRow() {
Integer row = 0;
while (row <= rowLength) {
makeBrick();
startX = startX + 54;
row++;
}
}
private void makeBrick() {
brick = new Rectangle();
brick.makeVisible();
brick.changeSize(bWidth, bHeight);
brick.setPosition(startX, startY);
bricks.add(brick);
}
/**
* Draw the wall. The first brick will be positioned at the coordinates (10, 550).
* The number of bricks in a row is specified by setRowLength(). The maximum number of rows
* is specified by setNumRows(). If decrease is true, each subsequent row of bricks
* contains one brick less than the previous row. If symmetric is true AND decrease is true then
* the wall is pyramid shaped. If symmetric is false AND decrease is true then the wall is shaped
* like a right angle triangle.
*/
public void draw()
{
eraseWall();
drawRow();
boolean decrease = false;
boolean symmetric = false;
}
public void eraseWall() {
Canvas canvas = Canvas.getCanvas();
for (int i=0; !bricks.isEmpty(); i++) {
canvas.erase(bricks.remove(0));
}
}
}
Many Thanks for the help in advance,
samjoyboy.
Re: I can't figure out why this isn't working!
A few questions, because I suspect you've confused yourself:
1. Is the variable rowLength supposed to be the number of bricks in each row, or the number of rows that need to be created? I ask because you are incrementing a variable named row, while incrementing the position of the brick along the X axis only.
2. Each row needs to have a different startY value, or each row will just be drawn over the previous. Where are you adjusting the Y coordinate to move down/up? Remember, X is East and West, and Y is North and South.
3. Where are you telling each row to have 8 bricks, and for it to create 4 rows?
Re: I can't figure out why this isn't working!
Quote:
Originally Posted by
aussiemcgr
A few questions, because I suspect you've confused yourself:
1. Is the variable rowLength supposed to be the number of bricks in each row, or the number of rows that need to be created? I ask because you are incrementing a variable named row, while incrementing the position of the brick along the X axis only.
2. Each row needs to have a different startY value, or each row will just be drawn over the previous. Where are you adjusting the Y coordinate to move down/up? Remember, X is East and West, and Y is North and South.
3. Where are you telling each row to have 8 bricks, and for it to create 4 rows?
1. rowLength is how many bricks are in each row - this is declared when I create a new brickwall in BlueJ. The make brick creates a brick then the startX moves position of the next brick after the previous however I need to create 8 bricks in each row consisting of 4 rows to get a brick wall.
2. each row needs to start below the previous which is why startY needs to add 16 after each row to go south of the previous row.
3. I tell it to do this from the setRowLength and setNumRows methods.
many thanks.
Re: I can't figure out why this isn't working!
solved...
Code :
private void drawRow() {
Integer row1 = 0;
while (row1 < numRows) {
for (Integer row = 0; row <= rowLength; row++) {
makeBrick();
startX = startX + 54;
}
startY = startY + 16;
startX = 10;
row1++;
}
}
thanks anyhow guys.