Войти на сайт

Авторизация, ждите ...
×

ТЕМА: Неповторимый рандом

Неповторимый рандом 3 года 1 нед. назад #125204

  • DarchanKaen
  • DarchanKaen аватар
  • Вне сайта
  • Просветлённый
  • Сообщений: 257
  • Спасибо получено: 233
  • Проект месяца 2 местоПроект месяца 1 местоРазработчик3 место в Обучающем конкурсеВетеран
Неповторимый рандом




Доброго времени суток!
Вероятно все вы знаете, что в RpgMaker есть переменные и возможность присваивать им случайное значение в некотором диапазоне.
Это бесспорно удобная функция, которую можно использовать для большого количества игровых ситуаций.

Но что делать, если нам нужно, чтобы все случайные значения были уникальными и не повторялись? Например, мы делает игру-викторину с уникальными вопросами или некий текстовой квест со случайными событиями, которые не должны повторяться. Конечно, можно стандартными средствами мейкера, переключателями и проверками условий, но это муторно в настройке и крайне неудобно, когда такого рандома должно быть больше 10 вариантов.

И тут на помощь нам приходит команда скрипт и тот факт, что в мейкере можно выполнять код на JavaScript; так как данный урок для MV (и MZ) в Ruby для Xp-Vx-Vx Ace, вероятно делается схожим подходом, но с другим синтаксисом.

Уточним условия примера. У нас игра-викторина, при которой 9 вопросов должны задаваться в любом порядке, но только по одному разу…то есть не повторяться (число вопросов может быть любым!).
Достигнуть подобного можно, храня перечень номеров вопросов в массиве, который будет хранится в определенной переменной мейкера и, после выбора случайного номера вопроса, данный номер будет удаляться из массива и отфильтровываться.

Для этого выполним несколько простых действий (номера переменных могут быть любыми):

1)В инициализирующем событии, в команде «Скрипт», напишем такой код:
let randomNumbersList = [1, 2, 3, 4, 5, 6, 7, 8, 9];
 
$gameVariables.setValue(1, randomNumbersList);

где:
«randomNumbersList» - массив с номерами вопросов;
«$gameVariables.setValue()» - сохранение массива в определенной переменной мейкера.

2)В событии, в котором мы выбираем номер, в команде «Скрипт», напишем такой код:
let randomNumbersList = $gameVariables.value(1);
 
let randomIndex = Math.floor( Math.random() * randomNumbersList.length ); 
let randomNumber = randomNumbersList[randomIndex];
$gameVariables.setValue(2, randomNumber);
 
delete randomNumbersList[randomIndex];
let uniqueRandomNumbersList = randomNumbersList.filter( elem => elem );
$gameVariables.setValue(1, uniqueRandomNumbersList);

где:
«$gameVariables.value()» - получение массива с номерами вопросов из переменной мейкера и сохранение его во временную переменную «randomNumbersList»;
«randomIndex» - получение случайного индекса массива, под которым хранится номер вопроса;
«randomNumber» - получение номера вопроса при помощи случайного индекса массива;
«$gameVariables.setValue()» - здесь это сохранение выбранного номера вопроса в определенной переменной мейкера;
«delete randomNumbersList[randomIndex]» - удаление номера вопроса, выбранного по случайному индексу, из массива с вопросами.

И вот тут важный момент! После удаления элементов, в массиве остаются пустые места. Поскольку мы не хотим для выбора вопроса вводить какие-то доп. проверки, нам нужно исключить из массива вопросов эти самые пустые места. Как? Фильтрацией, а именно:
«randomNumbersList.filter( elem => elem )»

Данный фрагмент кода возвращает массив с номерами вопросов, но уже без пустых мест. Ну и дальше мы привычным способом сохраняем его в переменную мейкера, причем в ту же, в какую писали при инициализации:
«$gameVariables.setValue»

Как видите, несколько строчек кода позволяет удобным способом сделать нам рандом неповторимым и уникальным.

Ну а сами номера вопросов в нужном событии мы используем в условии по переменной, в которой сохранили номер.

И с каждым вызовом скрипта из пункта №2 массив с вариантами ответов будет уменьшаться...пока не достигнет нуля и массив будет пустым, весь. Поэтому количество ответов / случайных событий / для чего вы это используете нужно контролировать, как минимум учитывая в отдельной переменной сколько раз этот рандом уже использовали (в нашем случае - сколько ответов уже дали).

Вот и все, спасибо за внимание!

P.S: допускаю, что такой урок уже был – но поиском я не нашел…в случае, если такое уже было – смело снимайте с конкурса.

update-1 от 10.11.2021
Спасибо Lekste, он напомнил, как важно правильно называть переменные.
Изменен код, в фильтрации "index" заменен на "elem", так как первая переменная фильтра - элемент массива.

И Lekste прав, есть еще один вариант кода фильтрации, без удаления элемента из массива, а именно:
randomNumbersList.filter( (elem, index) => index != randomIndex );
где
"elem" - элемент массива, первый параметр фильтра;
"index" - собственно индекс элемента;
в условии фильтрации указываются, что возвращаются все индексы, кроме равного случайно выбранному.
При использовании такого подхода удаление при помощи:

"delete randomNumbersList[randomIndex];"

уже не нужно!
Мои игры [ Нажмите, чтобы развернуть ]
Последнее редактирование: 3 года 1 нед. назад от DarchanKaen.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Безликий, VeselyRodger, miller404, Alx_Yago, Братец Лис, SirAndriy, xrenj

Неповторимый рандом 3 года 1 нед. назад #125208

  • VeselyRodger
  • VeselyRodger аватар
  • Вне сайта
  • Светлый дракон
  • Сообщений: 932
  • Спасибо получено: 894
  • Проект месяца 1 местоТестерПроект месяца 3 местоОратор
Полезно
Мои проекты:
rpgmakerunion.ru/user/veselyrodger
Мой канал на Ютубе:
youtube.com/channel/UCyttExMfXo8ke_PhQjNPyuw
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: DarchanKaen, SirAndriy

Неповторимый рандом 3 года 1 нед. назад #125209

  • xrenj
  • xrenj аватар
  • Вне сайта
  • Бывалый
  • Сообщений: 86
  • Спасибо получено: 125
  • РазработчикПроект месяца 2 место
Интересно было, о таком использовании рандома раньше не думал.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: DarchanKaen

Неповторимый рандом 3 года 1 нед. назад #125214

  • alexgunwork
  • alexgunwork аватар
  • Вне сайта
  • Оседлый
  • Сообщений: 41
  • Спасибо получено: 57
  • КоммерсантПроект месяца 2 местоПроект месяца 1 место
Вероятно все вы знаете, что в RpgMaker есть переменные и возможность присваивать им случайное значение в некотором диапазоне.
— а вот в этом месте поподробней. А как она работает?
Администратор запретил публиковать записи гостям.

Неповторимый рандом 3 года 1 нед. назад #125215

  • DarchanKaen
  • DarchanKaen аватар
  • Вне сайта
  • Просветлённый
  • Сообщений: 257
  • Спасибо получено: 233
  • Проект месяца 2 местоПроект месяца 1 местоРазработчик3 место в Обучающем конкурсеВетеран
alexgunwork пишет:
Вероятно все вы знаете, что в RpgMaker есть переменные и возможность присваивать им случайное значение в некотором диапазоне.
— а вот в этом месте поподробней. А как она работает?


При вызове этой опции в переменную каждый раз заносится случайное значение из диапазона.
Мои игры [ Нажмите, чтобы развернуть ]
Последнее редактирование: 3 года 1 нед. назад от DarchanKaen.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: alexgunwork

Неповторимый рандом 3 года 1 нед. назад #125216

  • Lekste
  • Lekste аватар
  • Вне сайта
  • Светлый дракон
  • Сообщений: 913
  • Спасибо получено: 566
  • Даритель СтимкеяПрограммист RubyПрограммист JavaScript ВетеранОратор
А зачем удалять и фильтровать, когда можно сразу отфильтровать по условию: index != randomIndex?
Последнее редактирование: 3 года 1 нед. назад от Lekste.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: DarchanKaen, yuryol

Неповторимый рандом 3 года 1 нед. назад #125217

  • Alx_Yago
  • Alx_Yago аватар
  • Вне сайта
  • Архитектор Миров
  • Сообщений: 1151
  • Спасибо получено: 2172
  • 1 место в Обучающем конкурсеРазработчик3 местоОраторПроект года 1 местоПаладинУчительПроект года 3 местоПроект месяца 1 место3 место в Обучающем конкурсе
Lekste пишет:
А зачем удалять и фильтровать, когда можно сразу отфильтровать по условию: index != randomIndex?

Разверните мысль. Как всё будет работать в этом случае?
Администратор запретил публиковать записи гостям.

Неповторимый рандом 3 года 1 нед. назад #125218

  • DarchanKaen
  • DarchanKaen аватар
  • Вне сайта
  • Просветлённый
  • Сообщений: 257
  • Спасибо получено: 233
  • Проект месяца 2 местоПроект месяца 1 местоРазработчик3 место в Обучающем конкурсеВетеран
Lekste пишет:
А зачем удалять и фильтровать, когда можно сразу отфильтровать по условию: index != randomIndex?
Правильный вопрос.

Начнем с того, что я неверно назвал параметры в фильтре, ведь первый параметр (который по-умолчанию) не индекс - а сам элемент.
Индекс - второй параметр, опциональный. Используя его и такое условие действительно можно не удалять, а сразу фильтровать.

Такой код корректно работает и не требует предварительного удаления элемента:
randomNumbersList.filter( (elem, index) => index != randomIndex );

Добавил секцию update с примером кода и скорректировал название параметра фильтра в основной секции.
Спасибо за толчок в правильном направлении!
Мои игры [ Нажмите, чтобы развернуть ]
Последнее редактирование: 3 года 1 нед. назад от DarchanKaen.
Администратор запретил публиковать записи гостям.

Неповторимый рандом 3 года 1 нед. назад #125255

  • nirion
  • nirion аватар
  • Вне сайта
  • Мастер
  • Сообщений: 124
  • Спасибо получено: 70
  • УчительПроект месяца 3 местоПроект месяца 2 место
Демку бы, а то у меня, много уточняющих вопросов.
Администратор запретил публиковать записи гостям.

Неповторимый рандом 3 года 1 нед. назад #125264

  • DarchanKaen
  • DarchanKaen аватар
  • Вне сайта
  • Просветлённый
  • Сообщений: 257
  • Спасибо получено: 233
  • Проект месяца 2 местоПроект месяца 1 местоРазработчик3 место в Обучающем конкурсеВетеран
Вот демо для MV, проект нужно открыть редактором.
Самое интересное - в Общих событиях.

www.mediafire.com/file/0jpqxxj2pgo8nzu/D...dom_Demo_MV.zip/file

P.S:
Можно открыть и MZ, если подбросить в папку проекта файл game.rmmzproject, взятый из любого проекта MZ.
Мои игры [ Нажмите, чтобы развернуть ]
Последнее редактирование: 3 года 1 нед. назад от DarchanKaen.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: xrenj

Неповторимый рандом 2 года 10 мес. назад #126056

  • xrenj
  • xrenj аватар
  • Вне сайта
  • Бывалый
  • Сообщений: 86
  • Спасибо получено: 125
  • РазработчикПроект месяца 2 место
Снова вернулся к этому уроку, задумавшись (возможно, тупой будет вопрос), а возможно ли создать 2 (или более) таких массива для двух или более разных событий? Просто копированием и изменением переменных явно дело не решилось, потому что рандом тут же перестаёт быть рандомом - второе событие повторяет полностью последовательность ответов за первым. А до больше, увы, пока ума не хватает.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: DarchanKaen

Неповторимый рандом 2 года 10 мес. назад #126058

  • yuryol
  • yuryol аватар
  • Вне сайта
  • Архитектор Миров
  • Сообщений: 1704
  • Спасибо получено: 2731
  • Победитель конкурсаУчитель3 место ГотвОраторКомпозиторОрганизатор конкурсов2 место 1 место в Готв
xrenj пишет:
Снова вернулся к этому уроку, задумавшись (возможно, тупой будет вопрос), а возможно ли создать 2 (или более) таких массива для двух или более разных событий? Просто копированием и изменением переменных явно дело не решилось, потому что рандом тут же перестаёт быть рандомом - второе событие повторяет полностью последовательность ответов за первым. А до больше, увы, пока ума не хватает.

скорее всего надо изменить название у переменной randomNumbersList , например на randomNumbersList_2
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: DarchanKaen, xrenj

Неповторимый рандом 2 года 10 мес. назад #126066

  • xrenj
  • xrenj аватар
  • Вне сайта
  • Бывалый
  • Сообщений: 86
  • Спасибо получено: 125
  • РазработчикПроект месяца 2 место
Спасибо, уже закрались подобные мысли, но естественно я переименовал походу неправильно, или затронул что-то лишнее, попробую снова именно так.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: DarchanKaen

Неповторимый рандом 2 года 10 мес. назад #126070

  • DarchanKaen
  • DarchanKaen аватар
  • Вне сайта
  • Просветлённый
  • Сообщений: 257
  • Спасибо получено: 233
  • Проект месяца 2 местоПроект месяца 1 местоРазработчик3 место в Обучающем конкурсеВетеран
Можно иметь несколько таких массивов и несколько случайных переменных.
Например, для 2-х (A и B) [ Нажмите, чтобы развернуть ]
Мои игры [ Нажмите, чтобы развернуть ]
Последнее редактирование: 2 года 10 мес. назад от DarchanKaen.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Alx_Yago, xrenj

Неповторимый рандом 2 года 9 мес. назад #126188

  • Sleeping Visitor
  • Sleeping Visitor аватар
  • Вне сайта
  • Бывалый
  • Сообщений: 78
  • Спасибо получено: 28
VX Ace:

Можно сделать очень простую систему.

Пишем генерацию рандома для викторины:

ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ]


Как это в теории должно работать:

ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ]
Последнее редактирование: 2 года 9 мес. назад от Sleeping Visitor.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: DarchanKaen
Время создания страницы: 0.552 секунд