Squeak.ru - шаблоны программирования

Как случайным образом назначать переменные в python?

Здравствуйте, я пытаюсь сделать простую викторину с несколькими вариантами ответов в pygame. Это код, который я написал, и он работает так, как задумано.

from random import choice
qUsed=[]
qEasy = [
    {
        "question": "What year is it",
        "choices": {"a": "2009", "b": "2016", "c": "2010"},
        "answer": "b"
    },
    {
        "question": "Another Question",
        "choices": {"a": "choice 1", "b": "choice 2", "c": "choice 3"},
        "answer": "a"
    },
    {
        "question": "Another Question",
        "choices": {"a": "choice 1", "b": "choice 2", "c": "choice 3"},
        "answer": "a"
    },
    {
        "question": "Another Question",
        "choices": {"a": "choice 1", "b": "choice 2", "c": "choice 3"},
        "answer": "a"
    },
    {
        "question": "Another Question",
        "choices": {"a": "choice 1", "b": "choice 2", "c": "choice 3"},
        "answer": "a"
    }
]

def Quiz(qLevel):
    global qUsed
    if qLevel == []: # if qLevel becomes empty
        qLevel = qUsed # dump everything from qUsed to qLevel
        qUsed = [] # reset qUsed to an empty list
    x = choice(qLevel) # assign x to a random question in qLevel
    print(x.get('question')) # print the question
    answer = input(x.get('choices')).lower() # print the choices

    if answer == x.get('answer'): # if answer is correct
        print("You got it")
    else:
        print("Wrong")
    qLevel.remove(x) # remove used question from list
    qUsed.append(x) # add it to an empty unused list (qUsed)

Quiz(qEasy)
Quiz(qEasy)

Проблема возникает здесь, когда я написал скрипт pygame, чтобы открыть окно с вопросом в качестве заголовка и тремя возможными ответами, случайным образом размеченными на трех черных прямоугольниках. Что я хочу сделать, так это случайным образом выбрать вопрос из списка, вывести его на экран, где написано «Вставьте вопрос сюда», и случайным образом назначить ответы трем прямоугольникам. Если вы нажмете на правый прямоугольник, то прямоугольник изменит цвет на зеленый, в противном случае он станет красным. Но я не могу понять, как это сделать.

def Screen():
mouse.set_visible(1)
clock = time.Clock()
# The button is just a rect.
A1 = Rect(30, 100, 175, 250)
A2 = Rect(230, 100, 175, 250)
A3 = Rect(430, 100, 175, 250)

while True:

    screen.fill(WHITE)
    draw.rect(screen, BLACK, A1)
    draw.rect(screen, BLACK, A2)
    draw.rect(screen, BLACK, A3)

    Question_surf = FONT.render(("Insert Question Here"), True, BLACK)
    A1_surf = FONT.render(("Answer 1"), True, WHITE)
    A2_surf = FONT.render(("Answer 2"), True, WHITE)
    A3_surf = FONT.render(("Answer 3"), True, WHITE)

    A1_rect = A1_surf.get_rect(center=(120, 225))
    A2_rect = A2_surf.get_rect(center=(320,225))
    A3_rect = A3_surf.get_rect(center=(520,225))
    Question_rect = Question_surf.get_rect(center=(320, 50))

    screen.blit(A1_surf, A1_rect)
    screen.blit(A2_surf, A2_rect)
    screen.blit(A3_surf, A3_rect)
    screen.blit(Question_surf, Question_rect)

    for e in event.get():
        if e.type == QUIT:
            exit("Exit")
        # This block is executed once for each MOUSEBUTTONDOWN event.
        elif e.type == MOUSEBUTTONDOWN:
            # 1 is the left mouse button, 2 is middle, 3 is right.
            if e.button == 1:
                # `event.pos` is the mouse position.
                if A1.collidepoint(e.pos):
                    pass
                elif A2.collidepoint(e.pos):
                    pass
                elif A3.collidepoint(e.pos):
                    pass

    display.update()

    clock.tick(60)

if __name__ == "__main__":
   Screen()
05.04.2018

  • Так? В чем проблема? 05.04.2018
  • @Psytho проблема в том, что я не могу понять, как это сделать 05.04.2018
  • Если вы предоставите минимально воспроизводимый пример вашей проблемы, люди с большей вероятностью помогут вам. Никто не хочет просматривать страницы кода только для того, чтобы понять, что вас на самом деле беспокоит... 05.04.2018
  • @zwer Я сократил это, спасибо. 05.04.2018

Ответы:


1

Чтобы просмотреть вопросы, я бы определил переменную index и присвоил ей текущий словарь вопросов-выборов-ответов (здесь я просто называю его question).

questions = qEasy
random.shuffle(questions)
index = 0
question = questions[index]

Увеличивайте индекс, когда пользователь переключается на следующий question (я бы сделал это в цикле событий).

index += 1
if index >= len(questions):
    # Reset everything or show a game over screen.
    index = 0
question = questions[index]

Передайте текст вопроса и варианты ответов font.render (тексты можно отображать только один раз, когда их нужно обновить).

Question_surf = FONT.render(question["question"], True, BLACK)
A1_surf = FONT.render(question["choices"]["a"], True, WHITE)
# etc.

Когда пользователь нажимает кнопку, проверьте правильность соответствующего ответа, а затем измените цвет кнопки/прямоугольника.

if A1.collidepoint(e.pos):
    if question["answer"] == "a":
        A1_color = GREEN
    else:
        A1_color = RED

Передайте текущий цвет прямоугольника в pygame.draw.rect.

pygame.draw.rect(screen, A1_color, A1)

Когда пользователь переключается на следующий вопрос, сбрасывайте цвета кнопок.

05.04.2018

2

Списки — очень хороший способ получить случайные ответы.

Сначала вы должны войти в диапазонный цикл for:

for i in range(3):
    myList.append(answers['Your question'][random.randint(0, 3)])

Затем вы можете индексировать новый список, когда вам нужно рисовать

text = myFont.render(myList[0], True, (255, 255, 255))

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

05.04.2018
  • Циклы с ранжированием for — это последняя вещь, которую вы делаете в Python, только если нет другого способа выразить что-то без ненужных значений индекса. Похоже, это работа для random.shuffle(). 05.04.2018
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...