-
Notifications
You must be signed in to change notification settings - Fork 0
/
Jogo
190 lines (139 loc) · 7.94 KB
/
Jogo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
import tkinter as tk
import random
from tkinter import messagebox
# O jogo começa apresentando ao jogado três portas
# quando o jogado escolhe uma delas, inicia sua primeira escolha
class PortasDaEsperanca:
def __init__(self):
self.window = tk.Tk()
self.window.title("Porta da Esperança")
self.prize_door = None
self.player_choice = None
self.silvio_door = None
self.switch_count = 0
self.stick_count = 0
self.win_count = 0
self.loss_count = 0
self.round_count = 0
self.dialog = None # para que a janelinha de mudar escolha se oculte
self.create_widgets()
def create_widgets(self):
self.title_label = tk.Label(self.window, text="Porta da Esperança", font=("Arial", 18, "bold"))
self.title_label.pack(pady=10)
self.instructions_label = tk.Label(self.window, text="Escolha uma porta e veja se acertou!", font=("Arial", 14))
self.instructions_label.pack(pady=5)
self.door_frame = tk.Frame(self.window)
self.door_frame.pack(pady=10)
self.door_buttons = []
for i in range(3):
door_button = tk.Button(self.door_frame, text="Porta " + str(i+1), width=12, command=lambda door=i: self.open_door(door))
door_button.grid(row=0, column=i, padx=5)
self.door_buttons.append(door_button)
self.result_label = tk.Label(self.window, text="", font=("Arial", 14, "bold"))
self.result_label.pack(pady=10)
self.score_label = tk.Label(self.window, text="", font=("Arial", 14))
self.score_label.pack(pady=5)
self.play_again_button = tk.Button(self.window, text="Jogar Novamente", command=self.reset_game)
self.play_again_button.pack(pady=5)
self.learn_more_button = tk.Button(self.window, text="Aprenda mais", command=self.show_learn_more)
self.learn_more_button.pack(pady=5)
def reset_game(self):
self.prize_door = None
self.player_choice = None
self.silvio_door = None
self.result_label.config(text="")
for door_button in self.door_buttons:
door_button.config(state=tk.NORMAL)
# a seguir o jogador escolhe a porta de preferencia e o jogo simula o Silvio abrindo a porta não escolhida (escolhida ao acaso)
# o índice da pporta escolhida pelo silvio está em self.silvio_door
# o botão representando a porta desativada é representada nop código como door_button.config(state=tk.DISABLED)
# por trás das cortinas o jogo escolhe ao acaso uma das tres portas (self.prize_door)
def open_door(self, door):
self.player_choice = door
self.prize_door = random.randint(0, 2)
remaining_doors = [0, 1, 2]
remaining_doors.remove(self.prize_door)
if self.player_choice in remaining_doors:
remaining_doors.remove(self.player_choice)
self.silvio_door = random.choice(remaining_doors)
remaining_doors.remove(self.silvio_door)
self.door_buttons[self.silvio_door].config(state=tk.DISABLED)
tk.messagebox.showinfo("Porta da Esperança", f"Silvio abriu a Porta {self.silvio_door + 1}.")
self.show_dialog()
# depois que a porta foi aberta uma caixa de dialogo aparece: "mudar sua escolha?"
# se ele disse sim o método switch_choice() é chamado e atualiza a porta remanescente
# se ele escolher não mudar, o método stick_choice() é chamado e nada muda
def show_dialog(self):
self.dialog = tk.Toplevel(self.window)
self.dialog.title("Mudar Escolha")
message_label = tk.Label(self.dialog, text="Você quer mudar sua escolha?")
message_label.pack(pady=10)
yes_button = tk.Button(self.dialog, text="Sim", command=self.switch_choice)
yes_button.pack(side=tk.LEFT, padx=10)
no_button = tk.Button(self.dialog, text="Não", command=self.stick_choice)
no_button.pack(side=tk.LEFT, padx=10)
def switch_choice(self):
self.switch_count += 1
remaining_door = 3 - self.player_choice - self.silvio_door
self.player_choice = remaining_door
self.window.after(200, self.show_final_result)
self.dialog.withdraw()
def stick_choice(self):
self.stick_count += 1
self.window.after(200, self.show_final_result)
self.dialog.withdraw()
# aqui são os resultados - após o jogador fazer sua escolha final
# mostra a escolha do jogador, a porta escolhida por Silvio e se ele ganhou ou não
# o jogo atualiza o placarincluindo numeros de rodadas jogadas, vitorias, derrotas, trocas e não trocas
def show_final_result(self):
self.round_count += 1
won = self.player_choice == self.prize_door
if won:
self.win_count += 1
else:
self.loss_count += 1
self.result_label.config(text="Jogador escolheu Porta " + str(self.player_choice+1) +
"\n\nEsperança abriu a Porta " + str(self.silvio_door+1) +
"\n\nO prêmio estava atrás da Porta " + str(self.prize_door+1))
if won:
tk.messagebox.showinfo("Portas da Esperança", "Parabéns! Você ganhou o prêmio!")
else:
tk.messagebox.showinfo("Portas da Esperança", "Desculpe, você não ganhou o prêmio.")
self.update_score()
# Aqui pretende-se apresentar uma estatística para o usário, mas apenas após N rodadas (idealmente seriam 1000) - a ideia é mostrar a diferença entre mudar de escolha e não mudar.
if self.round_count == 10:
self.show_statistics()
for door_button in self.door_buttons:
door_button.config(state=tk.NORMAL)
def update_score(self):
score_text = f"Rodadas: {self.round_count}\nVitórias: {self.win_count}\nDerrotas:{self.loss_count}\nTrocas: {self.switch_count}\nManter: {self.stick_count}"
self.score_label.config(text=score_text)
def show_statistics(self):
switch_win_percentage = (self.win_count / self.switch_count) * 100
if self.stick_count != 0:
stick_win_percentage = ((self.win_count - self.switch_count) / self.stick_count) * 100
else:
stick_win_percentage = 0
statistics_text = f"Estatísticas após 10 rodadas:\n\nVitórias com troca: {switch_win_percentage:.2f}%\nVitórias sem troca: {stick_win_percentage:.2f}%"
tk.messagebox.showinfo("Estatísticas", statistics_text)
def show_learn_more(self):
learn_more_window = tk.Toplevel(self.window)
learn_more_window.title("Aprenda mais")
learn_more_window.geometry("720x720")
explanation = (
"O problema de Monty Hall é um problema de probabilidade que demonstra a importância "
"de atualizar as probabilidades ao receber novas informações. A situação envolve três portas, "
"atrás de uma das quais está um prêmio e atrás das outras duas, não há nada.\n\n"
"Depois de escolher uma porta, Monty Hall (Esperança), que sabe o que está atrás de cada porta, abre uma "
"das outras duas portas que não têm o prêmio. Em seguida, você tem a opção de manter sua escolha original "
"ou mudar para a outra porta fechada restante.\n\n"
"A ideia contraintuitiva é que trocar de porta aumenta suas chances de ganhar. "
"Inicialmente, sua chance de escolher a porta correta é de 1/3, e há uma chance de 2/3 de estar atrás das outras duas portas. "
"Quando Monty abre uma porta sem o prêmio, a probabilidade de 2/3 ainda se aplica às outras portas. "
"Então, trocar sua escolha aumenta suas chances de ganhar para 2/3, enquanto manter sua escolha original tem apenas 1/3 de chance."
)
explanation_label = tk.Label(learn_more_window, text=explanation, font=("Arial", 14), justify=tk.LEFT, wraplength=450)
explanation_label.pack(padx=15, pady=15)
if __name__ == "__main__":
game = PortasDaEsperanca()
game.window.mainloop()