Как я могу показать одну функцию за раз и получить ввод возвращаемого значения в Python? - PullRequest
0 голосов
/ 01 июля 2018

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

Ниже кода, который я разместил, только основная часть, где у меня возникают проблемы, я тестирую с 2 вопросами, поэтому в коде есть только 2 вопроса на случайный выбор. Я использую версию Python 3.6, любая помощь будет оценена. Спасибо.

ЭКРАН ИГРЫ

def game_screen():

    player_score = 25
    actual_score = 0
    wrong_answer = 0
    timer = pygame.time.get_ticks()
    seconds = 0
    start = True

    question_list = [question1, question2]

    while start :
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

        seconds = (pygame.time.get_ticks()- timer)/1000

        main_font = pygame.font.Font("ArialRounded.TTF", 22)
        sub_font = pygame.font.Font("ArialRounded.TTF", 22)
        timer_font = sub_font.render(str(seconds), True, SEABLUE)
        question_font = main_font.render("Question:", True, SEABLUE)

        star_img = pygame.image.load("starscore.png")
        menu_screen_img = pygame.image.load("quizzappbackgroundscreen.png")
        blureffect_img = pygame.image.load("blureffect.png")
        onoff_button_img = pygame.image.load("onoffbutton.png")
        knobone_img = pygame.image.load("knob_a.png")
        knobtwo_img = pygame.image.load("knob_a.png")

        knobrect_a = knobone_img.get_rect(center=(97.5,647.5))
        knobrect_b = knobtwo_img.get_rect(center=(514.5,647.5))
        mpos = pygame.mouse.get_pos()
        click = pygame.mouse.get_pressed()

        if knobrect_a.collidepoint(mpos):
            knobone_img = pygame.image.load("knob_b.png")
            if click[0] == 1:
                knobone_img = pygame.image.load("rotatedknob_a.png")
                click_sound.set_volume(0.3)
                click_sound.play()

        if knobrect_b.collidepoint(mpos):
            knobtwo_img = pygame.image.load("knob_b.png")
            if click[0] == 1:
                knobtwo_img = pygame.image.load("rotatedknob_a.png")
                click_sound.set_volume(0.3)
                click_sound.play()

        screen.blit(menu_screen_img, [0,0])
        screen.blit(star_img, [50,47])
        screen.blit(timer_font, [485,55])
        screen.blit(question_font, [50,95])


        actual_score = random.choice(question_list)(player_score)
        #actual_score = question1(player_score)
        #player_score += actual_score

        if player_score > 25:
            player_score = 25

        draw_score(player_score)
        screen.blit(blureffect_img, [0,0])
        screen.blit(onoff_button_img, [25,726])
        screen.blit(knobone_img, [50,599])
        screen.blit(knobtwo_img, [465,599])

        pygame.display.update()

1 Ответ

0 голосов
/ 03 июля 2018

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

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

Для его выполнения не требуется никаких дополнительных ресурсов, и, если вы закомментируете указанную строку, возникнет та же проблема, которую вы описываете: зацикливание вопроса с каждым кадром (без ожидания ответа).

import pygame
import random

pygame.init()
pygame.font.init()

clock = pygame.time.Clock()
screen = pygame.display.set_mode([320,240])
sys_font = pygame.font.SysFont(pygame.font.get_default_font(), 18)

pygame.display.set_caption("Quiz")
nums_left = 0  # initialise the  counters
nums_right = 0  
done = False

questions = ["Who?", "What?", "Where?", "When?", "Why?"]

# states: 0: init, 10: select a question, 20: wait for answer, 30: Answered
state = 0
while not done:
    # Events
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
        elif event.type == pygame.KEYDOWN:
            if state == 0:
                state = 10
        elif event.type == pygame.MOUSEBUTTONUP:
            if state == 20:
                if event.button == 1:  # left
                    nums_left += 1
                    state = 30
                elif event.button == 2: # middle
                    pass
                elif event.button == 3: # right
                    nums_right += 1
                    state = 30
            elif state == 30:
                state = 10 # ask a new question

    # Clear Background
    screen.fill(pygame.color.Color("white"))
    #  Manage state
    if state == 0:
        question_txt = sys_font.render("Press any key to start!", True, pygame.color.Color("violet"))
    elif state == 10:
        # choose a random question
        question = random.choice(questions)
        question_txt = sys_font.render(question, True, pygame.color.Color("seagreen"))
        # comment out the line below to replicate buggy behaviour
        state = 20  
    elif state == 20:
        # we're just waiting here, perhaps indicate the mouse should be clicked
        pass
    elif state == 30:
        question_txt = sys_font.render("Click for a new question", True, pygame.color.Color("turquoise"))
    else:
        raise NotImplementedError  # shouldn't get here

    # always draw the score
    score_txt = sys_font.render(f"Left: {nums_left} Right: {nums_right}", True, pygame.color.Color("olivedrab"))
    # update the screen
    screen.blit(question_txt, (20, 20))
    screen.blit(score_txt, (20, 220))
    # Frame Change
    pygame.display.update()
    clock.tick(60)
pygame.quit()

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

...