Как создать коллекцию, содержащую разные классы, чтобы выбрать один случайным образом

#java

#java

Вопрос:

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

Комментарии:

1. Представьте тип monster в виде перечисления и выберите одно из его значений случайным образом. Я не буду приводить код.

2. Вам не нужен ни один из моих кодов, и я не хочу никаких кодов в качестве ответа, просто способ сделать это.

3. Если вы не можете просто использовать перечисление, поместите классы в сортируемую коллекцию, сгенерируйте случайное целое число в диапазоне [0,size_of_collection[ и получите класс с этим индексом. Затем создайте экземпляр этого класса.

4. Я не видел, что вы новичок, извините. Пожалуйста, знайте, что задавать вопрос, не показывая, что вы пробовали, — это способ получить много -1.

5. Меня не волнует -1 =) Я просто хочу получить ответ

Ответ №1:

Я вижу 2 способа :

1) Поместите все ваши классы-монстры в массив: MonsterType[] types = {Gnome.class, Gob.class}... , выберите индекс случайным образом, чтобы получить один из этих классов, и создайте его с помощью Class.newInstance();

2) Создайте перечисление, представляющее ваши типы монстров, затем случайным образом выберите одно из его значений и используйте switch case для построения монстра в зависимости от типа монстра.

Второй мне кажется более чистым.

Ответ №2:

Хорошо, я бы сделал это, создав класс WaveParameters с количеством монстров на волну, скоростью, hp, …

Затем просто создайте несколько экземпляров этого класса с разными данными, добавьте их, например, в ArrayList<WaveParameters> , а затем случайным образом выберите из этого.

Ответ №3:

Для этого существует множество различных способов. Создайте перечисление. Или список классов. Или список строк. Или используйте генератор случайных чисел.

Можете ли вы сгенерировать число от 1 до 10? Можете ли вы использовать оператор if для выполнения разных действий на основе значения этого числа? Можете ли вы создать тип конкретной волны? Хорошо, тогда все, что вам нужно сделать, это объединить эти идеи!

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

Комментарии:

1. Я подумал, что это было бы хорошей идеей, поскольку у некоторых монстров были бы «специальные эффекты», наличие одного класса, содержащего эти специальные классы, было бы беспорядком.

2. Я бы сказал, что наличие множества разных классов, представляющих один и тот же вид информации, является большим беспорядком, но это зависит от вас.

3. @user3801714 вы могли бы использовать композицию, т. Е. использовать параметр для выбора одного или нескольких специальных эффектов, когда это необходимо, вместо того, чтобы кодировать их в классы монстров.

Ответ №4:

В принципе, вы уже описали способ сделать это:

Я хочу поместить все типы монстров (разные классы) в какую-то коллекцию…

Используйте List<MonsterType> или аналогичный. В зависимости от ваших потребностей этот список будет либо содержать объекты с параметрами, либо, если поведение будет совсем другим, либо перечисление в качестве параметра для фабрики или самого фабричного класса.

… затем извлеките один наугад…

Сгенерируйте случайное значение int с помощью list.get( Random.nextInt(list.size()) ) , то есть сгенерируйте случайный индекс в списке и получите доступ к элементу с этим индексом.

… и создайте объект этого типа

Опять же, это зависит от ваших потребностей. Если вы используете объекты параметров, передайте их вашему генератору волн, если ваш список содержит перечисления, вызовите заводской метод wave и передайте перечисление, если список содержит заводские классы, вызовите newInstance(...) для этого класса.

Есть больше (и более элегантных) способов сделать это, но, как уже было сказано, это зависит от ваших потребностей и архитектуры приложения.