Викторина в Python - оригинальная программа была запущена, но рефакторинг - PullRequest
0 голосов
/ 09 февраля 2019

Простой тест в Python, который читает файл CSV в формате «ответ, вопрос».Программа была запущена до того, как я решил попробовать изменить исходный код.Я ссылался на разные источники, чтобы определить, правильно ли были закодированы csv, random, классы и цикл, но код не работает с этой обновленной версией с измененным кодом.

Оригинальный код

player_name = input("What is your name? ")
print(f"Welcome, {player_name}, to Quiz!")
play_quiz = str(input("Are you ready to play?\n"))
if play_quiz != "y":
    exit()

class Question:
    def __init__(self, prompt, answer):
        self.prompt = prompt
        self.answer = answer

# sample quiz questions go here where ["Question", "Answer choices from a-c"]
question_prompts = []

questions = [
        Question(question_prompts[0], "b"),
        Question(question_prompts[1], "a"),
    ]

def run_test(questions):
    score = 0
    for question in questions:
        answer = input(question.prompt)
        if answer == question.answer:
            score += 1
        print("You answered " + str(score) + "/" + str(len(questions)) + " correct.")

    return input("Want to play again? (y/n): ") == "y".lower()

play_again = True
while play_again:
    play_again = run_test(questions)

Рефакторированный код

import csv
import random 

player_name = input("What is your name? ")
print(f"Welcome, {player_name}, to the Quiz!")
play_quiz = str(input("Are you ready to play? "))
if play_quiz != "y":
    exit()

class Question:
    def __init__(self, prompt, answer):
        self.prompt = prompt
        self.answer = answer

def quiz():
    score = 0
    questions_right = 0
    quiz_file = open(characters_file, "r")
    quiz_data = quiz_file.readlines()
    random.shuffle(quiz_data)
    question_number = 1 
    for question in range(65):
         x = quiz_data[question].strip()
         data = x.split(",")
         Question = data.prompt[1]
         correct_answer = data.answer[1]

def run_test(quiz_data):
    answer = input("What is your answer? ")
    if answer == correct_answer:
         score += 1
         question_right = question_number + 1
    else:
         print("Incorrect.")
         print(f"Correct answer should be: {CorrectAnswer}")

    total_score = (score / 65) * 100 
    print("You answered " + str(score) + "/" + str(total_score) + " question correct.")
    print("You have a score of " + str(total_score) + "%")

    return input("Want to play again? (y/n): ") == "y".lower()

 quiz()
 quiz_file.close()
 play_again = True
 while play_again:
     play_again = run_test()

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

1 Ответ

0 голосов
/ 09 февраля 2019

Я думаю, что вы неправильно используете класс Question, который вы создали.Вы пытаетесь сделать Question = data.prompt[1], что на самом деле не имеет смысла.Вопрос - это класс, и поэтому вы бы использовали его для создания экземпляров объекта.Кроме того, ваш класс ожидает, что ему будут переданы значения prompt и answer.Теперь, как вы настроили его, вы будете делать что-то вроде new_question = Question("What color is the sky?", "blue").Тем не менее, я не вижу особой пользы для создания класса в этом коде, потому что к нему не прикреплены методы ...

Вот пример идеи класса викторины, которая может помочь вам понять концепцию ООПпрограммирование:

import random

questions = [
    "What color is the sky?",
    "What year is it?"
]

answers = [
    "blue",
    "2019"
]

class Question:
    def __init__(self):
        index = random.randint(0, len(questions) - 1)
        self.answer = answers[index]
        self.question = questions[index]

    def check_valid(self, guess):
        if guess == self.answer:
            return True
        else:
            return False

if __name__ == "__main__":
    name = str(input("What's your name?\n"))
    print('Welcome then {} welcome to the quiz!'.format(name))
    while True:
        new_question = Question()
        check = False
        while check is not True:
            print(new_question.question)
            user_guess = str(input('What do you think the answer is?\n'))
            check = new_question.check_valid(user_guess)  

Вы можете видеть, что во время раздела __init__(self): код на самом деле не выполняет каких-либо серьезных вычислений, а просто настраивает вещи, которые впоследствии могут быть вызваны как new_question.question.Однако вы можете присоединить методы к классу, например check_valid (присоединяется к классу с помощью отступа def), а затем позже использовать эти методы в экземплярах классаВы создаете.В моем коде нет многих функций (например, возможность выхода из цикла), но, надеюсь, это поможет вам понять ООП на более глубоком уровне!

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