Есть ли способ включить приглашение ввода пользователя или функцию time.sleep () в пару значений ключа словаря? - PullRequest
1 голос
/ 19 октября 2019

Я работаю над текстовой RPG на Python и использую словари, чтобы дать начальную информацию игроку об области, которую он посещает. (см. код для примера). Когда игрок печатает «смотреть» или «исследовать», я хочу, чтобы консоль распечатала то, что у меня есть в значении клавиши EXAMINATION. То, что я хотел бы сделать, это напечатать часть текста за раз и либо подождать, пока игрок нажмет ввод, прежде чем продолжить, либо хотя бы подождать пару секунд, прежде чем печатать следующий блок. Есть ли способ добиться этого? Возможно, я поступаю с неправильной стороны?

import time
import sys

def prompt():
    print("\n" + "=========================")
    print("What would you like to do?")
    player_action = input("> ")
    acceptable_actions = ['move', 'go', 'travel', 'walk', 'quit', 'examine', 'inspect', 'interact', 'look']
    while player_action.lower() not in acceptable_actions:
        print("Unknown action, try again.\n")
        player_action = input("> ")
    if player_action.lower() == 'quit':
        sys.exit()
    elif player_action.lower() in ['move', 'go', 'travel', 'walk']:
        player_move(player_action.lower())
    elif player_action.lower() in ['examine', 'inspect', 'interact', 'look']:
        player_examine(player_action.lower())

def player_examine(player_action):
    if zonemap[myPlayer.location][SOLVED]:
        print("There's nothing more here to examine.")
    elif zonemap[myPlayer.location][EXAMINATION]:
        slowprint(zonemap[myPlayer.location][EXAMINATION])

ZONENAME = ''
DESCRIPTION = 'description'
EXAMINATION = 'examine'
SOLVED = False
UP = 'up', 'north'
DOWN = 'down', 'south'
LEFT = 'left', 'west'
RIGHT = 'right', 'east'

zonemap = {
    'Fields': {
        ZONENAME: "Western Fields",
        DESCRIPTION: "A grassy field to the west of town.",
        EXAMINATION: "The grass in this field is extremely soft." + input("> ") + "The wind feels cool on your face." + time.sleep(2) + "The sun is beginning to set.",
        SOLVED: False,
        UP: "The Mountains",
        DOWN: "The Town",
        LEFT: "", 
        RIGHT: "The Ocean",
    },

При попытке использовать метод time.sleep () я получаю следующую ошибку:

TypeError: can only concatenate str (not "NoneType") to str

При попыткечтобы использовать функцию ввода (">"), текст просто печатается без ожидания.

1 Ответ

2 голосов
/ 19 октября 2019

Ваш подход не работает, потому что вы немедленно вызываете функции input() или time.sleep() при создании словаря. time.sleep(), например, возвращает None, и именно поэтому вы получаете ошибку.

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

Вы можете сделать это разными способами. Вы можете

  • использовать последовательность (например, список или кортеж) строк вместо одной строки, и ваша функция slowprint() может принять последовательность и сделать паузу после печати каждого элемента.

  • использовать последовательность строк и смешивать специальные значения, которые slowprint() ищет для выполнения различных задач, например, для сна или запроса ввода.

  • Сохраните функцию в словаре, которую вы затем вызываете. Функции тоже объекты, как строки. Функция будет обрабатывать все операции печати и паузы.

Например, для хранения кортежа строк:

EXAMINATION: (
    "The grass in this field is extremely soft.",
    "The wind feels cool on your face.",
    "The sun is beginning to set.",
)

, тогда ваш дескриптор функции slowprint() будет:

def slowprint(lines):
    """Print each line with a pause in between"""
    for line in lines:
        print(line)
        input("> ")   # or use time.sleep(2), or some other technique

Второй вариант, для вставки специальных значений, дает вам больше возможностей делегировать все виды дополнительной функциональности другому коду. Вам нужно будет проверить тип объекта в последовательности, но это позволит вам вставить произвольные действия в описание экзамена. Как разница между сном и запросом пользователя о нажатии клавиши:

class ExaminationAction:
    def do_action(self):
        # the default is to do nothing
        return

class Sleep(ExaminationAction):
    def __init__(self, duration):
        self.duration = duration

    def do_action(self):
        time.sleep(self.duration)

class Prompt(ExaminationAction):
    def __init__(self, prompt):
        self.prompt = prompt

    def do_action(self):
        return input(self.prompt)

и функция slowprint() ищет следующие случаи:

def slowprint(examine_lines):
    for action_or_line in examine_lines:
        if isinstance(action_or_line, ExamineAction):
            # special action, execute it
            action_or_line.do_action()
        else:
            # string, print it
            print(action_or_line)

Вы можете сделать любое числотакие действия;Дело в том, что все они подкласс ExamineAction, поэтому их можно отличить от простых строк. Поместите их в свою последовательность для клавиши EXAMINATION:

EXAMINATION: (
    "The grass in this field is extremely soft.",
    Prompt("> "),
    "The wind feels cool on your face.",
    Sleep(2),
    "The sun is beginning to set.",
)

Возможности бесконечны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...