2016-09-04 4 views
1

Я пытаюсь закончить свой код для задания, которое у меня есть, но я застрял на последнем компоненте. Мне нужно создать «звезды» (маленькие желтые квадратные объекты) в «небе» ... сетку из 5 рядов по 10 звезд. Я нахожусь в классе java для начинающих, и я должен использовать такие методы, как star.moveHorizontal() или star.moveVertical(). Все соответствующие должности, которые я искал, были слишком сложными или из моего понимания.Создание нескольких объектов «x» расстояние друг от друга

Я думаю, что мне нужно создать массив? Мы даже не рассматривали это в классе ... И тогда каждая «звезда» будет х-расстоянием (первая звезда) + 30 единиц вправо. Затем продолжайте эту тенденцию, пока не появится 10 звезд подряд. А затем получите еще четыре ряда из 10 звезд.

Вот код, я создать только для одной звезды (в левом верхнем углу моего окна):

Square s1 = new Square(); 
s1.makeVisible(); 
s1.changeColor("yellow"); 
s1.changeSize(5); 
s1.moveVertical(-100); 
s1.moveHorizontal(-270); 

Затем я попытался создать массив для квадратного класса ... Я честно не знаю, если это даже законно.

Square[] starArray = new Square[10]; 
for (int i=0; i<starArray.length; i++) { 
starArray[i] = new Square(); 

Но тогда я не понимаю, как я могу позвонить каждой звезде и заставить их появиться ... Пожалуйста, помогите. Я так чувствую свою глубину. Я попытался исследовать это и попробовать новые вещи в течение более 2,5 часов. Я отвечу на любые ваши вопросы, насколько это возможно. Спасибо

+0

Где вы можете начать поиск? в простой консоли или Swing – 11thdimension

+0

Нет необходимости создавать массив, если вам не нужно ссылаться на квадраты на более позднем этапе. – c0der

ответ

1

Если вы можете сделать одиночную звезду и еще не узнать о массивах, я не думаю, что это тот ответ, который ищет ваш учитель. Точка массива должна быть контейнером, чтобы вы могли ссылаться на объекты снова. Если вам не нужно возвращаться к звездам в будущем, просто создайте их и установите их значения в цикле.

// Set defaults for spacing and start positions 
int horizontalStartPosition = 10; 
int horizontalSpacing = 30; 
int verticalStartPosition = 10; 
int verticalSpacing = 30; 
// Outer loop creates the 4 rows 
for (int i = 0; i < 4; i++) { 
    // Inner loop creates each row 
    for (int j = 0; j < 10; j++) { 
     // Create the next star in the row 
     Square s = new Square(); 
     s.makeVisible(); 
     s.changeColor("yellow"); 
     s.changeSize(5); 
     // Move the star to the correct vertical position for the current row 
     s.moveVertical(verticalStartPosition + i * verticalSpacing); 
     // Move the star to the correct horizontal spacing for the next star 
     s.moveHorizontal(horizontalStartPosition + j * horizontalSpacing); 
    } 
} 
+0

Я думаю, что лучше положить 's.makeVisible();' в конце. Также вам нужно добавить 's' в свой контейнер. – c0der

+0

@ c0der Я тоже думал об этом, но поскольку OP не делился никаким другим кодом, я думал, что лучше не менять свой код для отображения звезды. Я не добавлял '' 'в контейнер, так как это не было в рамках проблемы, когда я ее читал. –

0

Основываясь на том, что я понимаю, вы бы хотели вызвать метод, который в основном помещал бы звезду в сетку для вас. Я не совсем уверен, что вы имеете в виду, но вот что я могу вам предложить:

Вы хотите создать метод размещения звезды.

private static int X_SPACING = 30; 
private static int Y_SPACING = 20; 

public Square placeStar(int x, int y){ 
    // This is the same code that you had before. 
    Square sq = new Square(); 
    sq.changeColor("yellow"); 
    sq.changeSize(5); 
    sq.moveVertical(-y); // Where Y is the distance from the TOP LEFT. 
    sq.moveHorizontal(-x); 

    return sq; 
} 

public ArrayList<Square> makeRow(int columnsAmount, int y, int startX){ 
    ArrayList<Square> squares = new ArrayList<>(); 

    for(int i = 0; i < columnsAmount; i++) 
     squares.add(placeStar(startX + (X_SPACING * i), y)); 

    return squares; 
} 

public ArrayList<Square> makeGrid(int rowsAmount, int columnsAmount){ 
    ArrayList<Square> rslt = new ArrayList<>(); 

    for(int i = 0; i < rowsAmount; i++) 
     rslt.addAll(makeRow(columnsAmount, (i * Y_SPACING), 0); 

    return rslt; 
} 

В основном, вызов "makeRow" должны создать ряд [rowsAmount] звезд, которые все разделены [X_SPACING] пикселей. Затем makeGrid вызовет makeRow несколько раз, отрегулировав [y], и это сделает вас сеткой. Не стесняйтесь настраивать любое значение в коде.

EDIT: Я добавил функцию makeGrid и изменил несколько переменных в makeRow, поскольку я их обманул. Я заставил функции возвращать ArrayList, но они вам не нужны, только если ваши учителя позже попросят изменить их позже или что-то в этом роде.

Надеюсь, что это поможет, не стесняйтесь задавать больше вопросов. Sneling.

0

Вы на правильном пути. Вы можете использовать 2D-массив с 5 строками и 10 столбцами. Попробуйте что-то вроде этого:

int numColumns = 10; //the number of columns in the array 
int numRows = 5; // the number of rows in the array 
Square[][] starArray = new Square[numRows][numColumns]; // the array itself 
final int DIST_X = 10; //the distance between columns (use final because this value should not change) 
final int DIST_Y = 10; // the distance between rows (use final because this value should not change) 
int y = 0; // the initial row's vertical displacement 

for (int i=0; i<numRows; i++) { 
    int x = 0; // the initial columns horizontal displacement 
    for (int j=0; j<numColumns; j++) { 
     starArray[i][j] = new Square(); //define the square 
     starArray[i][j].moveHorizontal(x); // move it x units horizontally 
     starArray[i][j].moveVertical(y); // move it y units vertically 
     starArray[i][j].makeVisible(); //show the square 
     x += DIST_X; //update your horizontal displacement so the next column shows up in the correct position 
    } 
    y += DIST_Y; //update your vertical displacement so the next row shows up in the correct position 
} 
Смежные вопросы