2014-01-03 5 views
1

Я пытаюсь создать игру памяти с Java. Игра в основном будет представлять собой несколько квадратов в сетке, которая на данный момент составляет 4x4 только для целей тестирования. Я создал свой квадратный класс и запрограммировал, что я хочу, чтобы они сделали в этом классе, а затем создал квадратный объект в другом классе, который обрабатывает «Обычный режим» игры. Теперь, когда у меня есть квадрат квадратов 4x4, мне нужно сделать 16 разных квадратов (или, по крайней мере, это то, о чем я сейчас думаю). Мне также нужно нарисовать квадраты в соответствующем месте.Более эффективный способ создания нескольких объектов

Мой вопрос: Каков наиболее эффективный способ создания 16 из этих квадратных объектов, хотя они все еще могут манипулировать ими индивидуально? (Похоже, что у каждого есть свое имя, Square, Square1, Square2 и т. Д.).

Я также пользуюсь библиотекой Slick2D.

ответ

2

Как уже упоминалось выше, площадь [] [] squareGrid = новый площади [4] [4] является хорошим способом идти об этом; , то вы можете инициализировать все 16 из них с помощью:

for (int i = 0; i < squareGrid.length; i++) 
     for(int j = 0; j < squareGrid[i].length; j++) 
      squareGrid[i][j] = new Square(); 

теперь каждый квадратный автоматически имеет свой собственный уникальный (строка, столбец) идентификатор. , например,

squareGrid[1][2].callSomeFunctionInSquareClass(); 

может быть использован для манипулирования квадрата на 2-е, 3-й строки столбца. Таким образом, вы избегаете сканирования по всем квадратам, чтобы получить его в определенной ячейке сетки, что делает его намного более эффективным.

happy coding :)

+0

Большое спасибо! У меня есть только два вопроса. Зачем использовать цикл for для инициализации и как это сделать что вы определяете i и j в цикле. Имеет ли первый f или цикл делают строки, а второй - столбцом или наоборот? – MrPork

+0

1) вы можете думать о массиве как о контейнере, который содержит только ссылки на фактические объекты и до тех пор, пока вы не установите эти ссылки на какой-либо объект, это будет null.поэтому, делая squareGrid [i] [j] = new Square(), вы буквально создаете новый объект Square и устанавливаете его в ссылку в index [i] [j]. если вы этого не сделаете, это будет null в [i] [j] и бросить печально известное исключение NullPointerException при попытке получить доступ к любому методу объектов Square и тому, что не используется, например, squareGrid [1] [3] .callSomeFunc(). – doomsdaymachine

+0

2) вы можете думать об этом как о том, что имеет для вас больше смысла. для меня, например, в нотации array [i] [j], я думаю о первом массиве или «i» в виде строки и массива внутри этого или «j» в качестве столбца. вы можете думать о них наоборот, но убедитесь, что он согласен с остальной частью программы, чтобы избежать какой-либо потенциальной путаницы. – doomsdaymachine

1

Вы можете попробовать Square[][] grid = new Square[4][4]

1

Я хотел бы использовать квадрат [] [] массив, например, Square[][] squares = new Square[4][4], а затем инициализирует его со всеми 16 квадратов в двух вложенных циклов:

for (int x = 0; x < squares.length) x++) 
    for (int y = 0; y < squares[x].length; y++) 
     squares[x][y] = new Square(x, y); 
+0

Это создаст 16 разных квадратов с разными именами? Извините, я читал об этих 2D-массивах, но никогда их не понимал. – MrPork

+0

Кроме того, откуда вы взяли .length? Более того, почему это вызывает «i <квадраты [i] .length;» когда цикл for проверяет int y? – MrPork

+0

@MrPork создаст 16 разных объектов, но у этих объектов не будет никаких «имен» (я думаю, вы имеете в виду переменные, ссылающиеся на объекты), но вместо этого все они упоминаются только в массиве. Вы можете определить столько переменных, которые ссылаются на один и тот же квадрат, например. квадрат = квадраты [0] [0]; square2 = square; ', но это не создаст новых квадратов и не скопирует ничего. – Njol

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