Apesar de não ser pedido no enunciado, resolvi implementar a estratégio de um equilibrio de Nash (a partir de agora chamado "jogador Nash") e para ficar completo a de uma jogadora chamada Trinity, que dá preferência pelo 3 (como o John tem pelo 1 e a Mary pela 4)
Dessa maneira, se estiver correto, o grande vencedor é o Nash, conforme tabela abaixo:
1o jogador/2o jogador Nash John Mary Trinity
Nash 71/28 98/1 97/2 98/2
John 3/96 50/49 60/39 50/49
Mary 5/94 41/58 50/49 43/56
Trinity 4/95 50/49 57/42 50/49
def Mary(n, verbose=1):
if n==1:
if verbose:
print ('Mary pega 1')
return 1
elif n==2:
if verbose:
print ('Mary pega 1')
return 1
elif n==3:
if verbose:
print ('Mary pega 3')
return 3
if verbose:
print ('Mary pega 4')
return 4
def John(n, verbose=1):
if n==3:
if verbose:
print ('John pega 3')
return 3
elif n==2:
if verbose:
print ('John pega 1')
return 1
elif n==4:
if verbose:
print ('John pega 4')
return 4
if verbose:
print ('John pega 4')
return 1
def Trinity(n, verbose=1):
if n==1:
if verbose:
print ('Trinity pega 1')
return 1
elif n==2:
if verbose:
print ('Trinity pega 1')
return 1
elif n==4:
if verbose:
print ('Trinity pega 4')
return 4
if verbose:
print ('Trinity pega 3')
return 3
def Nash(n, verbose=1):
if (n<6):
if n==1:
if verbose:
print('Nash pega 1')
return 1
elif n==2:
if verbose:
print('Nash (perde) e pega 1')
return 1
elif n==3:
if verbose:
print ('Nash pega 3')
return 3
elif n==4:
if verbose:
print ('Nash pega 4')
return 4
elif n==5:
if verbose:
print ('Nash pega 3')
return 3
k=(n+1)%7
if k==0:
if verbose:
print('Nash pega 4')
return 4
elif k==1:
if verbose:
print('Nash (perde) e pega 1')
return 1
elif k==2:
if verbose:
print('Nash pega 1')
return 1
elif k==3:
if verbose:
print('Nash (perde) pega 1')
return 1
elif k==4:
if verbose:
print('Nash pega 1')
return 1
elif k==5:
if verbose:
print ('Nash pega 4')
return 4
elif k==6:
if verbose:
print ('Nash pega 3')
return 3
def Simular_jogo(n,jogador1, jogador2, verbose=1):
quem = 0
while n>0:
quem = 1 - quem
if quem:
pegou = jogador1(n, verbose)
else:
pegou = jogador2(n, verbose)
n = n-pegou
if verbose:
print (n)
if quem:
if verbose:
print (jogador1.__name__, 'venceu!')
return jogador1.__name__ , 1
else:
if verbose:
print (jogador2.__name__, 'venceu')
return jogador2.__name__ , 2
if __name__ == '__main__':
#para simular um jogo entre dois jogadores, por exemplo Mary e Nash (e Nash começando) com n=15:
Simular_jogo(15, Mary,Nash, 1)
#para simular um jogo entre dois jogadores do mesmo tipo, usar o segundo retorno da função
a,b = Simular_jogo(15, Nash, Nash, 1)
if b==1:
print('O primeiro jogador venceu')
elif b==2:
print ('O segundo jogador venceu')
#Calcular qual a melhor estratégia
jogador1_wins =0
jogador2_wins = 0
for i in range(1,100):
a, b = Simular_jogo(i, Nash, Nash, 0)
if b==1:
jogador1_wins = jogador1_wins + 1
elif b==2:
jogador2_wins = jogador2_wins + 1
print ('Jogador 1 ganhou', jogador1_wins, 'vezes, enquanto jogador 2 ganhou', jogador2_wins, 'vezes')