RU 📌 Pinned

Как сделать?

Dark[Ol(U23)leneri] #34 18.04.2010 22:57 6408 comments 2423911 views

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

я ваще балдею от этого вашего ксп #2721 06.02.2024 12:11 (2 years ago)

Всем привет!
Только вчера познакомился с QSP, ранее программировал что-то на уровне Hello World! и давным-давно паскаль в школе.
Есть вопрос:
Пишу рогалик(точнее портирую свой же Randomall), и появился запрос на более менее удобный код для рандомных значений с заданными процентными вероятностями. Понятно, что истинного рандома тут не будет, но в верном ли направлении я иду, когда для получения случайного “лута” обозначаю все доступные предметы в нужном месте и определяю нужное значение для каждого из предметов, отталкиваясь от итоговой суммы этих значений, условно: Общая сумма значений - 100, значение на выпадение Простого Пистолета - 5, Хлама - 85, Пулемета - 1, Продуктов - 9. Условно на выходе получаются “шансы” 5%, 85%, 1% и 9%?
А если вдруг я захочу сделать шансы менее 1%? Очевидно, что мне придется увеличивать общую сумму до 1000, чтобы я мог работать с чем-то в промежутке между 0.01 и 0.99, но можно ли как-то адаптировать эту математику именно под %?

я ваще балдею от этого вашего ксп,
Все правильно расписал.
Я не понял, что под проценты адаптировать?
Кидаешь rand 100 и смотришь, что выпало. Если тебе нужен один предмет из списка, то проверяешь диапазон. Если от до 4, то пистолет, если от 5 до 85 - хлам.
Если нужно больше предметов, то делай проверку для каждого, если меньше 5, то пистолет, если меньше 85, то еще + хлам и т.д.

я ваще балдею от этого вашего ксп #2721 06.02.2024 13:15 (2 years ago)

Сейчас пытался воспроизвести все то, что расписал и столкнулся с проблемой

У меня предметов штук 200 на данный момент, и есть предметы, которые имеют одинаковый шанс выпадения, но сами они друг от друга отличаются. Пока в голову приходит только идея создания отдельных категорий для таких предметов, например:

Снайперская винтовка - 1
Пулемет - 1
Хлам - 98

Если я тут буду делать if loot(моя переменная, которая считается через rand) = 1 то … и тут как раз проблема, по-идее я мог бы поместить все предметы с одинаковыми значениями в отдельную категорию, типа items_1, и у меня было бы if loot = 1, то мы крутим rand для items_1, а там у всех предметов будет свой условный ID, в данном случае 1 и 2, для винтовки и пулемета соответственно, то есть в теории мы и вероятность не ломаем и ошибок вроде как не допускаем?

Еще что-то почитал про массивы и прочие штуки, выглядит интересно, я могу их как-то тут использовать для облегчения кода и удобства или мои решения рабочие и особо можно в это пока не углубляться?

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

Массивы - очень полезная вещь. Скорее всего ты осознаешь это, когда будет поздно код переписывать. Так что лучше поплотнее продумай игру и посмотри, где ты будешь массивы использовать.

я ваще балдею от этого вашего ксп:

Снайперская винтовка - 1
Пулемет - 1
Хлам - 98

Понял, что ты не понял). И я не понял, что ты не понял).
В этом случае, если rand = 1, то Снайперская винтовка, если 2 - Пулемет, если от 2 до 100, то хлам.
Т.е. ты можешь накидать хоть 10 лута с шансом 10%, но диапазоны у них будут разные. У первого 1-10, второго - 11-20 и т.д.

я ваще балдею от этого вашего ксп #2721 06.02.2024 14:08 (2 years ago)

dmvikar:

Т.е. ты можешь накидать хоть 10 лута с шансом 10%, но диапазоны у них будут разные. У первого 1-10, второго - 11-20 и т.д.

Да, спс, я теперь понял - у меня с логикой и математикой иногда тупняки происходят))
Разобрался, немного расширил общий диапазон rand чтобы все вмещалось - посчитал в эксельке.

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

Еще такой вопрос, чисто в теории, могу ли я в QSP сделать процедурную генерацию предметов, локаций? Видел штуку в справке - Кортежи, где можно одной переменной присваивать несколько значений, по-логике предметы генерировать через эту опцию проще простого, но что насчет локаций? Могу ли я рандомно создавать локации в игре или вложенные локации, которые изначально не предусмотрены в архетектуре проекта?

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

Про кортежи не поясню. Но точно скажу, что генерировать предметы можно и без них.

я ваще балдею от этого вашего ксп #2721 06.02.2024 15:09 (2 years ago)

dmvikar:

Та можешь сгенерировать все, что будет происходить в конкретном месте при конкретных условиях.

Да, я как-то зациклился на локациях, но что мне в теории мешает просто генерить текстом то, что персонаж находится там-то и происходит то-то, без привязки к локациям, ты прав, спасибо

Щас потыкался в игрушку Zone - примерно то, что я хотел бы сам сделать, но чуть более иммерсивно, в принципе выглядит не супер сложно, наверное смогу повторить через 3-4 месяца, только карта и перемещение по ней смущает - с перемещением все понятно, но как это привязать к карте.. круто сделано, короче

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

$map['title', 0, 0] = 'Таверна'
$map['desc', 0, 0] = 'Здесь полно людей. Все они пьют, жрут, матерятся, поют, курят, плачут... в общем, весело тут, аж выть охота.'

$map['action_title', 0, 0, 0] = 'Подойти к Василию'
$map['action_title', 0, 0, 1] = 'Выпить стаканчик местного пойла'
$map['action_title', 0, 0, 2] = 'Грозно окинуть всех взглядом очей своих'

$map['action_code', 0, 0, 0] = {
	msg 'Допустим к Василию вы подошли, а дальше история умалчивает.'
}
$map['action_code', 0, 0, 1] = {
	msg 'Вкус отвратительный, так ещё и не в то горло пошло, как итог вы фатально захлебнулись.'
}
$map['action_code', 0, 0, 2] = {
	msg 'Никто не поежился, более того, все дружно отпинали вас ногами. Посмертно.'
}
$map['action_count', 0, 0] = 3

let player_x = 0
let player_y = 0

*PL $map['title', player_x, player_y]
*PL $map['desc', player_x, player_y]
loop i=0 while i<$map['action_count', player_x, player_y] step i+=1:
    *PL '<a href="exec: dynamic $map[''action_code'', <<player_x>>, <<player_y>>, <<i>>]"><<$map["action_title", player_x, player_y, i]>></a>'
end
я ваще балдею от этого вашего ксп #2721 06.02.2024 18:05 (2 years ago)

Dominus:

Вот тут без массива как раз никуда)
Без понятия как иначе делать, чтобы не превращать код в простыню влетвлений.

Я пока от этого отказался, решил реализовать систему регулируемой сложности - либо ходи по периметру локации и вычищай его за пару минут, таская всякий мусор, в итоге очень медленно развиваясь, или углубляйся когда душе угодно, но вместе с качеством лута будет расти и риск столкновений с врагами и прочих негативных событий + если далеко зайти, то труднее вернуться))

У меня уже код - это выполнение 5-10 задач на одной локации, но вроде пока что все работает так, как мне надо))

я ваще балдею от этого вашего ксп #2721 06.02.2024 20:15 (2 years ago)

А как выбрать рандомный элемент из массива? Что-то не понимаю..
Пробую что-то типа chosen_artifact = $мусорные_артефакты[rand(0, 13)] В массиве всего 14 значений, но выдает ошибку на этих попытках как раз

я ваще балдею от этого вашего ксп,
Ошибка какая? Несоответствие типов? Если код один в один скопировал, то ты числовой переменной задаешь строковое значение.

я ваще балдею от этого вашего ксп #2721 07.02.2024 07:42 (2 years ago)

Блин, мб если я возвращаю в текстовый массив числовые данные, то он поэтому ломается? Ошибка 101 - несоответствие типа данных, но где-то читал, что плеер сам преобразует данные в нужный формат, если может..

я ваще балдею от этого вашего ксп #2721 07.02.2024 07:46 (2 years ago)

я ваще балдею от этого вашего ксп:

Несоответствие типов?

Не увидел твоего ответа, вот только об этом написал)
А как правильно сделать? Вот кусок кода одного из массивов

! Мусорные артефакты
$мусорные_артефакты[0] = “Игла”
$мусорные_артефакты[1] = “Жмых”
$мусорные_артефакты[2] = “Хурма”
$мусорные_артефакты[3] = “Болванка”
$мусорные_артефакты[4] = “Черняжка”
$мусорные_артефакты[5] = “Пластилин”
$мусорные_артефакты[6] = “Спайка”
$мусорные_артефакты[7] = “Головастик”
$мусорные_артефакты[8] = “Перстень”
$мусорные_артефакты[9] = “Очко”
$мусорные_артефакты[10] = “Вилка”
$мусорные_артефакты[11] = “Песчанник”
$мусорные_артефакты[12] = “Клетка”
$мусорные_артефакты[13] = “Пискун”
arti_number = rand(0,13)
chosen_artifact = $мусорные_артефакты[arti_number]
p “Вы нашли мусорный артефакт!”
pl
! Добавляем артефакт в инвентарь игрока
AddObj chosen_artifact

Log in or Register to post comments.