Нужна помощь с алгоритмом броска костей - PullRequest
1 голос
/ 12 января 2011

Как бы я пошел о псевдокодировании алгоритма для метода, который:

  • Рулоны типа Die - 4, 6, 8, 10 или 12 сторон

  • Можно свернуть до десяти кубиков этого типа

  • Если более половины кубиков равны 1, напечатайте им сообщение о том, что они разоряются и завершают программу

  • Если какой-либо из кристаллов соответствует типу брошенного кубика, возьмите наибольшее значение из группы. А также повторно бросьте кубик, который равнялся значению типа броска кубика.

    ^^^^ т.е.. - Допустим, у вас есть 3 шестигранных кубика, вы бросаете их, и вы получаете 4, 2 и 6. Вы берете значение 6, так как оно самое высокое. Затем вы переворачиваете кубик, который был шестью. Если вы получаете шестерку, вы добавляете эту шестерку к предыдущей шестерке и перебрасываете. Если нет, просто добавьте самый высокий кубик к предыдущему значению.

Ответы [ 2 ]

6 голосов
/ 12 января 2011

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

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

Требование 1: бросает кубик - 4, 6, 8, 10 или 12-гранный

Хорошо - нам нужен метод, подобный следующему:

int Roll (int сторон);

В основном Roll просто возвращает случайное значение между 1 и сторонами (включительно).

Требование 2: Можно свернуть до десяти кубиков этого типа

Вероятно, это цикл for.

Требование 3: Еслиболее половины кубиков равны единице, напечатайте им сообщение о том, что они разоряются и завершают программу

Это требование подразумевает, что вы сохраняете результаты каждого вызова Roll в коллекции - например,List или int [] (массив целых чисел).

Далее говорится, что вы выполняете итерацию по этой коллекции и подсчитываете число бросков, равное «1».Если количество больше половины общего количества бросков, чем вы заканчиваете программу.Подсчет прост (для вас лучше всего подойдет цикл или foreach), и вы знаете, сколько было сделано бросков (как по количеству предметов в коллекции, так и потому, что у вас был счетчик для цикла for, когда были сделаны броски).так что разделите и сравните.

Требование 4: Если какой-либо из кубиков соответствует типу броска кубика, возьмите самое высокое значение из группы. Также перебросьте кубик, равныйзначение типа броска кубика.

Опять же - вам нужно перебрать набор результатов и выполнить запрос операции. Я бы не стал пытаться «оптимизировать» ваше решение, объединив это правило спредыдущее правило - оно просто свернет решение без реальной выгоды.

0 голосов
/ 12 января 2011

Ваш алгоритм должен был бы:

  1. Бросить кости
  2. Проверить результаты, чтобы увидеть, равны ли половина 1 с
  3. Проверить и, возможно, перебросить старшие числа
  4. Следите за принятыми числами и текущими суммами по бросанным кубикам

Ничего особенного в этом нет, кроме того, чтобы фактически сделать это для вас.

...