В моей игре в верхней части экрана есть слово, сверху идут буквы, и пользователь должен коснуться букв, чтобы завершить слово.
В настоящее время я генерирую буквы случайным образом (на самом деле случайные числа и числа являются индексом для массива букв. Например: 0 = a, 1 = b), но проблема в том, что требуется слишком много времени, чтобы получить все необходимые буквы для завершения слово.
Я хочу, чтобы генерируемые случайные числа генерировали нужные буквы чаще, чтобы игроку не приходилось тратить целый день на завершение одного слова.
Я пробовал следующие методы:
Определить все буквы в слове (слово всегда длиной 6 букв), сгенерировать массив индексов длиной 6, присвоить каждому индексу массива случайное число от буквы-2 до буквы + 2 и в конце выбрать случайным образом один индекс из массива, чтобы показать.
Имейте переменную селектора, значение которой находится в диапазоне [0..2], генерируемую случайным образом, если селектор == 0, тогда обнаруживайте буквы, которые составляют слово, и случайным образом выбирайте одну букву, иначе случайным образом получите любой алфавит из az.
Оба эти метода не оказали мне никакой помощи. Я буду очень рад, если вы сможете мне помочь.
Спасибо за прочтение, надеюсь, вы поняли вопрос, и я жду ответа.
Ответы:
Вы на самом деле не хотите случайного распределения. Я говорю об этом прямо, потому что то, что мы считаем «случайным» для дизайна, обычно не является истинной случайностью.
Теперь, имея это в виду, давайте добавим некоторые тонкие настройки - это те вещи, с которыми вы будете возиться, пока дизайн не станет «правильным».
Вероятность определяет, насколько вероятно, что данный вызов ChooseLetter даст вам слово-букву - при 0,5 вы будете получать слово-слово примерно каждый раз. В 0.25 каждый четвертый будет словом, буквой и т. Д.
Это все еще немного упрощенно - потому что случайность, ну, в общем , случайная , у вас на самом деле нет гарантии того, как долго вы будете проходить между словами. (Теоретически, вы можете обходиться без слова буква навсегда , просто очень маловероятно.) Вместо этого мы можем добавить фактор, увеличивающий вероятность слова буква каждый раз, когда мы его не получаем:
Итак, теперь мы никогда не идем больше, чем две буквы без слова буквы. (Потому что после двух промахов у нас есть 1,0 вероятность получить слово буква.)
Наконец, нам нужно принять во внимание, как работает выбор буквы в слове. Чтобы предоставить игроку те буквы, которые ему действительно нужны, нам нужно удалять буквы из набора по мере их получения.
Например, если слово «тест», а у игрока уже есть «s», мы не хотим давать им другие «s», потому что им это не нужно!
Отсюда все остальное настраивается под ваш дизайн.
источник
Вы можете взвесить вероятность всех ваших писем в соответствии с частотой, с которой они встречаются на языке, на котором написаны ваши слова. Хорошим ориентиром является набор скрабблов . Английская версия, например, имеет 12 E, но только один Z и один Q.
Простой способ реализовать это - поместить все буквы в последовательную строку, в которой каждая буква появляется так часто, как это необходимо, и затем ваш ГСЧ берет букву из случайной позиции. Пример псевдокода:
источник
Вот один из способов улучшить его, используя один параметр,
k
который вы можете настроить.Вместо того, чтобы просто выбрать случайное письмо:
A
X
X > k
иA
нет[list of remaining needed letters]
, попробуйте еще раз на 1.Чем меньше
k
, тем чащеA
будет действительно последняя буква .Чтобы настроить алгоритм, поиграйте с любым значением
k
, напримерk = 0.5
. Если вам кажется, что игра слишком сложная, попробуйте0.4
вместо этого и т. Д., Пока не найдете разумное значение. Это также напрямую дает вам настройку сложности , которую, например, вы можете увеличить по мере продвижения игрока в игре.источник
Простой способ гарантировать, что требуемые буквы появятся в течение заданного времени, состоит в том, чтобы использовать заполнение массива буквами в слове и остальной части алфавита (возможно, повторяется), затем случайным образом перемешать массив (c ++ имеет std :: random_shuffle в стандартной библиотеке, если вы используете другой язык, это не сложно реализовать).
Если вы хотите, чтобы буквы в слове появлялись быстрее, поместите в массив больше копий букв-слов.
источник
Если вы используете C ++, вы можете использовать уже существующий дистрибутив http://en.cppreference.com/w/cpp/numeric/random/piecewise_constant_distribution
Он также амортизирует сложность с постоянным временем, которая лучше, чем наивные методы. пример:
источник