Создание рандома в играх

Материал из Ren'Py Wiki
Перейти к навигации Перейти к поиску

Генератор предложений в диалоге от OokamiKasumi[править | править код]

Код для размещения целых строк в случайном порядке:

define loc1 = renpy.random.choice([
        "в доме с привидениями, чтобы стать свидетелем экзорцизма",
        "в доме с привидениями, во время операции по уничтожению призраков",
        "на вечеринке в пентхаусе",
        "на рок-концерте",
        "на спортивном мероприятии",
        "на ралли спортивных автомобилей",
        "в стрип-клубе",
        ])

define ch_f = renpy.random.choice([
        "Моника",
        "Тина",
        "Марго",
        "Сара",
        ])

define ch_m = renpy.random.choice([
        "Тома",
        "Роберта",
        "Ника",
        "Сэма",
        ])

define adj1 = renpy.random.choice([
        "веселая",
        "пьяная",
        "печальная",
        "смущённая",
        ])

define adj2 = renpy.random.choice([
        "веселого",
        "пьяного",
        "печального",
        "смущённого",
        ])


# Игра начинается здесь.

label start:

    "История...\n
    \nОднажды %(loc1)s %(adj1)s %(ch_f)s встретила %(adj2)s %(ch_m)s."

Генератор случайных имён от FamuFamu[править | править код]

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

init:

    #Сначала мы устанавливаем некоторые переменные:

    $ gen_name = "" #Имя, которое появится

    #Затем мы создаем список с возможными именами.

    $ name_list = ["Павел", "Джон", "Георг", "Ринго"]
    $ l_name_list = ["Маккартни", "Леннон", "Харрисон", "Старр"]

После этого мы переходим к созданию класса генератора.

init python:

    class GENERATOR:

        def malename(self):
            
            generatedname = renpy.random.choice(name_list) 
            #Возьмёт одно имя из списка name_list и сохранит его в generatedname
            generatedlastname = renpy.random.choice(l_name_list) 
            #То же самое

            store.gen_name = generatedname + " " + generatedlastname 
            #Покажет результат объединения и сохранит его в переменной gen_name.
            #Если бы не " ", мы могли получить RingoStarr

Теперь у этого есть много применений, но если вы хотите использовать его для неигровых персонажей и еще много чего, вы можете сделать это:

define e = DynamicCharacter("gen_name") 
#Это означает, что имя персонажа будет таким, которое хранится в gen_name

label start:

    python:

        gen = GENERATOR()
        #Это позволяет нам использовать класс GENERATOR, как просто «gen»

    $ gen.malename() 
    #На этом этапе игра будет запускать то, что вы сделали, для функции malename класса GENERATOR (теперь просто gen)
    #При этом он создаст имя из обоих списков и сохранит его в gen_name

    e "Теперь меня зовут [gen_name]"

Вы можете создать столько генераторов, сколько необходимо внутри класса (в зависимости от расы, пола, вида и т.д.). У вас может быть gen.femalename() или даже gen.dogname(), просто убедитесь, что вы создаете определенный список каждый раз (Поэтому femalename() ничего не берет из списка malename()). Он также может содержать столько частей, сколько необходимо (просто имя или три имени).

В любом случае, это всё, надеюсь, это поможет вам. Если у вас возникнут проблемы, просто дайте мне знать.

Функция случайного выбора метки от wyverngem[править | править код]

На данный код меня вдохновил "Случайные событий" за авторством helcries, который использовал базовый код для создания системы вызовов для отображения различных меток на основе операторов if. Я пошёл дальше, чтобы показать, как это можно сделать в Python с помощью renpy.call или renpy.jump.

Данный код работает с последней версией Ren'Py 7.2.0.

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

init python:
    import random
    # Переход или вызов случайной метки в вашей игре на удачу.
    def random_event(odds, choices, label_prefix, type=True):
        chance = random.randint(1,100)
        if chance <=odds:
            num = random.randint(1,choices)
            label_name = str((label_prefix+str(num)))
            if type:
                renpy.jump(label_prefix)
            else:
                renpy.call(label_prefix)
random_event(odds, choices, label_prefix, type=True)
odds
Шанс увидеть событие. Код выбирает число от 1 до 100. Затем проверяет, если шанс меньше или равен вашим шансам. Если ваши шансы равны 50, а число шансов 25, вы увидите событие. Иначе игра ничего не возвращает и переходит на следующую строку.
choices
Последовательная нумерация, которая связана с тем, как много различных версий или выборов чего-то стоят. Если есть три метки, которые могут быть показаны, он будет использовать одну из них для отображения события.
label_prefix
Префикс меток, которые вы вызываете. Это строка имени метки. Так что, если вы выбираете встречу, которую видит игрок, это может быть "eileen_date".
type
Не нужно указывать, если вы хотите, чтобы игрок перескочил на метку вместо вызова. Если вы хотите, чтобы это вызывалось, поставьте значение False.


Вот как данный код использовать в игре:

label start:
    $ variable = 0

label game_loop:
    "Моя функция использует вероятности и шанс определить, является ли игрок свидетелем случайной сцены. Если вы упустите шанс, игра также будет случайным образом определять, какую метку показать игроку."
    "Давайте включим random_event(), чтобы вызывать метки, а не переходить к ним."
    $ random_event(50,3,'choice', False)
    if variable == 1:
        "Я вижу, ты пришёл с первой метки."
    elif variable == 2:
        "Ты видел вторую метку, верно?"
    elif variable == 3:
        "Ты видел третью трогательную сцену."
    else:
        "О, я думаю, тебе не повезло, и ты не увидел ни одну из вызванных меток."
    "Забавно, но давайте предположим, что вы хотите использовать прыжок вместо этого. Который иногда лучше для предотвращения случайного возвращение в стартовое меню игры."
label jump_loop:
    $ random_event(50,3,'choice')
    "Вы видите это, потому что не получили случайное событие после прыжка. Все мои метки перехода возвращаются в jump_loop."
    "Конец игры."
    "Перед уходом, если игрок откатится, это будет совершенно другой вариант."
    return

Это не сложный код для использования. Нужно иметь в виду только две вещи. Если игрок откатится назад, это изменит результат выбора. Также вам нужно настроить label_prefix определенным образом. Создаваемый вами label_prefix должен начинаться с 1 и идти в последовательном порядке. Если игра выбирает недоступную опцию, она выдаст ошибку, что метка не найдена.

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

# Это пример метки, которая вызывается. Внизу она использует Return, чтобы вернуться туда, откуда она была вызвана.
label choice1:
    $ variable = 1
    "Я выбрал 1 вариант."
    "Это пример метки, которая была вызвана."
    return

label choice2:
    $ variable = 2
    "Я выбрал 2 вариант."
    "Это пример метки, которая была вызвана."
    return

label eileen_choice1:
    "Я перешёл в eileen_choice 1."
    jump jump_loop

label eileen_choice2:
    "Я перешёл в eileen_choice 2."
    jump jump_loop

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


Вот полный образец кода для тех, кто заинтересован в этом:

# Случайное событие by Chance credit wyverngem 2019 Ren'py Version 7.2.0
init python:
    import random
    # Переходит на случайную метку в вашей игре.
    def random_event(odds, choices, label_name, type=True):
        chance = random.randint(1,100)
        if chance <=odds:
            num = random.randint(1,choices)
            label_name = str((label_name+str(num)))
            if type:
                renpy.jump(label_name)
            else:
                renpy.call(label_name)

label start:
    $ variable = 0
    "Привет"

label game_loop:
    "Моя функция использует вероятности и шанс определить, является ли игрок свидетелем случайной сцены. Если вы упустите шанс, игра также будет случайным образом определять, какую метку показать игроку."
    "Поскольку я добавил False в конец своей строки, я вызываю метки вместо того, чтобы переходить к ним. Это означает, что вы каждый раз будете видеть, что за этой строкой. Я добавил проверку переменных, чтобы увидеть, какую сцену вы действительно видели, но в игре вам это не нужно."
    $ random_event(50,3,'choice', False)
    "Игра всегда будет возвращаться к этой строке при использовании call вместо jump."
    if variable == 1:
        "Я вижу, ты пришёл с первой метки."
    elif variable == 2:
        "Ты видел вторую метку, верно?"
    elif variable == 3:
        "Ты видел третью трогательную сцену."
    else:
        "О, я думаю, тебе не повезло, и ты не увидел ни одну из вызванных меток."
    "Забавно, но давайте предположим, что вы хотите использовать прыжок вместо этого. Который иногда лучше для предотвращения случайного возвращение в стартовое меню игры."
label jump_loop:
    $ random_event(50,3,'eileen_choice')
    "Вы видите это, потому что не получили случайное событие после использования random_event() с jump... Извините."
    "Конец игры."
    "О, прежде чем я иду, откат выберет что-то другое."
    return

# Это метки, на которые влияет выбор. Не стесняйтесь называть их любым префиксом, которым хотите, но держите их пронумерованными последовательно, начиная с единицы, чтобы работать с кодом.
label choice1:
    $ variable = 1
    "Я выбрал 1 вариант."
    "Это пример метки, которая была вызвана."
    return

label choice2:
    $ variable = 2
    "Я выбрал 2 вариант."
    "Это пример метки, которая была вызвана."
    return

label choice3:
    $ variable = 3
    "Я выбрал 3 вариант."
    "Это пример метки, которая была вызвана."
    return

# Другое название для переходной метки.
label eileen_choice1:
    "Я перешёл к eileen_choice 1."
    "Я собираюсь вернуться к jump_loop и выбрать другое случайное событие."
    jump jump_loop

label eileen_choice2:
    "Я перешёл к eileen_choice 2."
    "Я собираюсь вернуться к jump_loop и выбрать другое случайное событие."
    jump jump_loop

label eileen_choice3:
    "Я перешёл к eileen_choice 3, но хочу продолжить игру."

label end_game:
    "Предыдущий выбор был eileen_choice3."
    "Это значит, что я заканчиваю игру, потому что иногда хочется разорвать цикл прыжков."
    "О, прежде чем я иду, откат выберет что-то другое."
    return

Источник[править | править код]


На главную страницу Книга рецептов Энциклопедии Ren'Py Форумы Lemma Soft Вернуться к началу статьи