-
Notifications
You must be signed in to change notification settings - Fork 0
/
markov.py
165 lines (130 loc) · 5.15 KB
/
markov.py
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
import random
import numpy as np
# Pedra = 0
# Papel = 1
# Tesoura = 20
matrizTransicaoVitoria = np.ones((3, 3), dtype=int)
matrizTransicaoDerrota = np.ones((3, 3), dtype=int)
matrizTransicaoEmpate = np.ones((3, 3), dtype=int)
def markov():
probabilidadesPPT = [1/3, 1/3, 1/3]
opcoes = ["Pedra", "Papel", "Tesoura"]
continuarJogando = True
jogadaAnterior = ""
jogada = 3
jogada = recebeJogada()
jogadaIA = random.randint(0, 2)
resultado = verificaResultado(jogada, jogadaIA)
print("Sua jogada %s" % opcoes[jogada])
print("Jogada da IA %s" % opcoes[jogadaIA])
print("Você %s \n\n" % resultado)
jogadaAnterior = jogada
while (continuarJogando):
jogada = recebeJogada()
if (jogada == -1):
finalizaJogo()
continuarJogando = False
else:
probabilidadesPPT = retornaProbabilidades(
resultado, jogadaAnterior)
jogadaIA = random.randint(1, 100)
rangeR = probabilidadesPPT[0] * 100
rangeP = probabilidadesPPT[1] * 100 + rangeR
if (jogadaIA <= rangeR):
jogadaIA = 1
elif (jogadaIA <= rangeP):
jogadaIA = 2
else:
jogadaIA = 0
atualizaMatriz(resultado, jogada, jogadaAnterior)
jogadaAnterior = jogada
resultado = verificaResultado(jogada, jogadaIA)
print("Você escolheu %s" % opcoes[jogada])
print("A IA escolheu %s" % opcoes[jogadaIA])
print("Você %s" % resultado)
def recebeJogada(primeiraJogada=False):
while (True):
try:
if (primeiraJogada):
jogada = int(input("0: Pedra, 1: Papel, 2: Tesoura \n"))
if (jogada > 2 or jogada < 0):
print("Você deve informar um número de 0 a 2\n")
else:
return jogada
else:
jogada = int(
input("0: Pedra, 1: Papel, 2: Tesoura, -1: FINALIZAR \n"))
if ((jogada > 2 or jogada < 0) and jogada != -1):
print(
"Você deve informar um número de 0 a 2 OU -1 para finalizar \n")
else:
return jogada
except ValueError:
print("Você deve informar um inteiro \n")
def finalizaJogo():
print("Você ganhou %d vezes!" % int(numeroVitorias))
print("Você perdeu %d vezes!" % int(numeroDerrotas))
print("Você empatou %d vezes!" % int(numeroEmpates))
porcentagemVitoria = "{percent:.2%}".format(
percent=(numeroVitorias / (numeroVitorias+numeroDerrotas+numeroEmpates)))
print("Sua taxa de vitória é %s em %d partidas" %
(porcentagemVitoria, int(numeroVitorias+numeroDerrotas+numeroEmpates)))
continuarJogando = False
print("Sua matriz de transição em vitórias é:\nr: %s\np: %s\ns: %s\n" %
(matrizTransicaoVitoria[0], matrizTransicaoVitoria[1], matrizTransicaoVitoria[2]))
print("Sua matriz de transição em derrotas é:\nr: %s\np: %s\ns: %s\n" %
(matrizTransicaoDerrota[0], matrizTransicaoDerrota[1], matrizTransicaoDerrota[2]))
print("Sua matriz de transição em empates é:\nr: %s\np: %s\ns: %s\n" %
(matrizTransicaoEmpate[0], matrizTransicaoEmpate[1], matrizTransicaoEmpate[2]))
def retornaProbabilidades(resultadoAnterior, jogadaAnterior):
matrizResultadoAnterior = []
if resultadoAnterior == 'Ganhou!':
matrizResultadoAnterior = matrizTransicaoVitoria
elif resultadoAnterior == 'Empatou!':
matrizResultadoAnterior = matrizTransicaoEmpate
else:
matrizResultadoAnterior = matrizTransicaoDerrota
return calculaProbabilidades(matrizResultadoAnterior, jogadaAnterior)
def calculaProbabilidades(matrizTransicao, jogadaAnterior):
probabilidadesPPT = [1/3, 1/3, 1/3]
soma = sum(matrizTransicao[jogadaAnterior])
for i in range(3):
probabilidadesPPT[i] = matrizTransicao[jogadaAnterior][i] / soma
return probabilidadesPPT
def atualizaMatriz(resultadoAnterior, jogada, jogadaAnterior):
# 'Ganhou!', 'Perdeu!', 'Empatou!'
if resultadoAnterior == 'Ganhou!':
matrizTransicaoVitoria[jogadaAnterior][jogada] += 1
elif resultadoAnterior == 'Empatou!':
matrizTransicaoEmpate[jogadaAnterior][jogada] += 1
else:
matrizTransicaoDerrota[jogadaAnterior][jogada] += 1
return
def verificaResultado(jogador, ia):
resultado = 0
if (jogador == ia):
resultado = 0
elif ((jogador == 0 and ia == 2) or (jogador == 1 and ia == 0) or (jogador == 2 and ia == 1)):
resultado = 1
else:
resultado = -1
contaResultado(resultado)
match resultado:
case 1:
return "Ganhou!"
case -1:
return "Perdeu!"
case 0:
return "Empatou!"
numeroVitorias, numeroDerrotas, numeroEmpates = 0.0, 0.0, 0.0
def contaResultado(resultado):
global numeroVitorias
global numeroDerrotas
global numeroEmpates
if (resultado == 1):
numeroVitorias += 1
elif (resultado == -1):
numeroDerrotas += 1
else:
numeroEmpates += 1
markov()