У меня есть случайные задачи и случайные ответы, но я хочу, чтобы случайные задачи были связаны с правильным ответом

1

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

Я спросил своих учителей и искал, но ничего не смог найти.

from tkinter import *
import random

theWindow = Tk()
theWindow.geometry('500x500')
theWindow.title('Challenges')
Label(theWindow, text='Press the button below to generate random challenges', bg= 'grey', fg='white').pack()

challenges = ['You are going through Russia. Do you have the item winterjacket?\n \n Option 1: Yes \n Option 2: No',
          'A thief grabs your bag with items: What are you going to do?\n\n 
Option 1: Not chasing the thief \n Option 2: Chasing the thief',
          'You dont have money for food anymore:\n You found a job for a week. \n Are you going to take the job?:\n\n Option 1: Yes, take the job \n 
Option 2: No, you don"t take the job',
          'You walk along a grave and hear a sound: \n What are you going to do?: \n \n Option 1: You run away \n Option 2: You take a look',
          'You won an helicopter flight and youre in an helicopter right now. \n The helicopter starts to fall down. \n What are you going to do?: \n \n Option 1: Grab a parachute and jump out of the helicopter \n Option 2: Stay in the helicopter',
          'You see an old lady carrying an heavy bag. \n What are you going to do?: \n \n Option 1: Walk away \n Option 2: Help the old lady']

Outcome = ['+10 HP','+10 HP','+10 HP','+10 HP','+10 HP','+10 HP','+10 HP','+10 HP and skip 1 turn', '+20 HP','+20 HP',
           '+20 HP','+20 HP', '+30 HP','+30 HP','+30 HP', '+40 HP', '+10 HP + 1 item','+10 HP + 1 item','+10 HP + 1 item',
           '+20 HP + 1 item','+20 HP + 1 item', '+20 HP + 2 item', 'Back to 100 HP', 'Nothing happens',
          '-10 HP','-10 HP','-10 HP','-10 HP', '-20 HP','-20 HP','-20 HP','-20 HP','-20 HP',
          '-20 HP', '-30 HP', 'Lose all HP', '-40 HP', '-50 HP', 'Lose all items', 'Lose all items', 'Skip 1 turn', '-20 HP and skip 1 turn',
          'You have to throw the dice: if you get 1, 3 or 5 you can get an item. If you throw 2, 4 or 6 you will get -10 HP damage.',
          'Nothing happens']

def challenges_button():
    challenge = Label(theWindow, text=random.choice(challenges))
    challenge.place(relx=0.5, rely=0.3, anchor=CENTER)

def answers():
    answer = Label(theWindow, text= random.choice(Outcome))
    answer.place(relx=0.5, rely=0.7, anchor=CENTER)

def answers1():
    answer1 = Label(theWindow, text= random.choice(Outcome))
    answer1.place(relx=0.5, rely=0.7, anchor=CENTER)    

#The buttons
generate_button = Button(theWindow, text='Generate Challenge', height=3, 
width=20, command=challenges_button, bg='black', fg='white')
generate_button.place(relx=0.5, rely=0.1, anchor=CENTER)

button_1_Button = Button(theWindow, text='Option 1', height=1, width=20, 
command=answers, bg='black', fg='white')
button_1_Button.place(relx=0.5, rely=0.55, anchor=CENTER)

button_2_Button = Button(theWindow, text='Option 2', height=1, width=20, 
command=answers1, bg='black', fg='white')
button_2_Button.place(relx=0.5, rely=0.6, anchor=CENTER)

Ожидаемое: вы нажимаете кнопку "Создать вызов" и получаете правильный ответ. Фактический результат теперь таков, что вы получаете вызов, но случайный ответ, поэтому ответ не верен.

  • 0
    Где правильные ответы определены в коде? Только Бог знает правильный ответ, если нет способа узнать, что правильный ответ по коду.
  • 0
    Да, это то, что я хочу знать. Как я могу подключить ответ на вызов. Результаты - это «ответы», но это не очень хорошо. У меня 30/40 испытаний, а также 30/40 ответов, поэтому так много результатов, и я хочу связать 2 результата с 1 вызовом.
Показать ещё 6 комментариев
Теги:
tkinter

2 ответа

1
Лучший ответ

Это небольшой обходной путь, начиная с той точки, где вы сейчас находитесь. Поскольку для каждого вопроса есть ровно 2 результата, я хотел бы прежде всего сгруппировать все "правильные ответы" для каждого вызова в подсписки, как показано ниже (составьте эти ответы, но вы получите точку):

new_outcome = [['+10 HP', '-10 HP'], ['+20 HP', '+10 HP'], ...]

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


Быстрое редактирование: если я правильно понял ваш комментарий к исходному вопросу, ваши ответы уже в правильном порядке. Так что просто создайте понимание списка следующим образом:

new_outcome = [[Outcome[2*i], Outcome[2*i + 1]] for i in range(int(len(Outcome) / 2))]

создать желаемый список пар ответов.


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

c_and_a = dict()

for item in challenges:
    c_and_a[item] = new_outcome[challenges.index(item)]

>> c_and_a = {'challenge_1':['+10 HP', '-10 HP'], 'challenge_2':['+20 HP', '+10 HP'], ...}

Теперь определите команды кнопки следующим образом. Обратите внимание, что метод, который я предлагаю здесь, требует от вас определения метки challenge вне функции, потому что все функции должны иметь к ней доступ. Вы можете сделать это внизу вместе со всеми вашими другими виджетами, ваши функции по-прежнему имеют к нему доступ, даже если они определены над ним.

def challenges_button():
    challenge.config(text=random.choice(list(c_and_a.keys())))

c_and_a это словарь. В python 3.x, который, как я полагаю, вы используете на tkinter импорта из d.keys(), d.keys() возвращает итератор по всем ключам словаря d. Так как random.choice работает только со списками, мы должны сначала преобразовать этот итератор в список с помощью команды list().

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

def answers():
    chall = challenge.cget('text')  # this will read the challenge label
    answer.config(text=c_and_a[chall][0])  # for option 1

def answers1():
    chall = challenge.cget('text')
    answer.config(text=c_and_a[chall][1])  # for option 2

answer = Label(theWindow)
answer.place(relx=0.5, rely=0.7, anchor=CENTER) 

Теперь тебе должно быть хорошо идти!

1

Что вы можете сделать, это создать случайный индекс в списке challenges. И используя этот индекс, вы можете настроить text метки, используя вызов, представленный для этого индекса в списке challenges. В соответствии с этим вы также знаете, что два ответа на него - это 2i -й и 2i+1 -й элементы в списке Outcome.

Есть также несколько проблем с вашим кодом. Если вы нажмете кнопку " Generate несколько раз, они начнут перекрываться. Так что я удалил это из функции.

import tkinter as tk
import random

theWindow = tk.Tk()
theWindow.title('Challenges')
tk.Label(theWindow, text='Press the button below to generate random challenges', bg= 'grey', fg='white').grid(row=0)

index = None

challenges = ['Q1) You are going through Russia. Do you have the item winterjacket?\n \n Option 1: Yes \n Option 2: No',
          'Q2) A thief grabs your bag with items: What are you going to do?\n\n Option 1: Not chasing the thief \n Option 2: Chasing the thief',
          'Q3) You dont have money for food anymore:\n You found a job for a week. \n Are you going to take the job?:\n\n Option 1: Yes, take the job \n Option 2: No, you don"t take the job',
          'Q4) You walk along a grave and hear a sound: \n What are you going to do?: \n \n Option 1: You run away \n Option 2: You take a look',
          'Q5) You won an helicopter flight and youre in an helicopter right now. \n The helicopter starts to fall down. \n What are you going to do?: \n \n Option 1: Grab a parachute and jump out of the helicopter \n Option 2: Stay in the helicopter',
          'Q6) You see an old lady carrying an heavy bag. \n What are you going to do?: \n \n Option 1: Walk away \n Option 2: Help the old lady']

Outcome = ['q1 a1', 'q1 a2', 'q2 a1', 'q2 a2', 'q3 a1', 'q3 a2', 'q4 a1', 'q4 a2', 'q5 a1', 'q5 a2', 'q6 a1', 'q6 a2']

challenge = tk.Label(theWindow)
challenge.grid(row=2)

answer = tk.Label(theWindow)
answer.grid(row=5)

def challenges_button():
    global index
    index = random.choice(range(len(challenges)))
    answer.configure(text="")
    challenge.configure(text=challenges[index])

def answers():
    global index
    answer.configure(text=Outcome[2*index])

def answers1():
    global index
    answer.configure(text=Outcome[2*index+1])

#The buttons
generate_button = tk.Button(theWindow, text='Generate Challenge', height=3, width=20, command=challenges_button, bg='black', fg='white')
generate_button.grid(row=1)

button_1_Button = tk.Button(theWindow, text='Option 1', height=1, width=20, command=answers, bg='black', fg='white')
button_1_Button.grid(row=3)

button_2_Button = tk.Button(theWindow, text='Option 2', height=1, width=20, command=answers1, bg='black', fg='white')
button_2_Button.grid(row=4)

theWindow.mainloop()

Результат:

Изображение 174551

  • 0
    Большое спасибо, сэр, этот работал и для меня. Я рад, что вы помогли мне также

Ещё вопросы

Сообщество Overcoder
Наверх
Меню