Problems with choosing the 'role' option in a program that 'plays' jokenpo with me

Asked

Viewed 50 times

0

I’m doing a program that "play" jokenpo with me.

The 'stone' and 'scissors' options are working. However, when I enter the 'paper' option and the machine chooses the 'scissors' option, the program says I won.

I read code again and can’t find the error. Follow the code:

import random
e1: str = 'pedra'
e2: str = 'papel'
e3: str = 'tesoura'
lista = [e1, e2, e3]
esc_maquina = random.choice(lista)
minha_esc = str(input('Minha escolha é: '))
if minha_esc == esc_maquina:
    print('Houve empate! Sua escolha foi {} e da máquina também foi {}.'.format(minha_esc, esc_maquina))
    print('Pressione Shift+F10 e tente novamente!')
elif minha_esc != esc_maquina:
        if minha_esc == e1 and esc_maquina == e2 or esc_maquina == e3:   # Pedra
            if esc_maquina == e2:
                print('Você perdeu! A máquina escolheu {}.'.format(e2))
                print('Para tentar novamente, pressione Shift+F10')
            elif esc_maquina == e3:
                print('Você venceu! A máquina escolheu {}.'.format(e3))
                print('Para tentar novamente, pressione Shift+F10')
        elif minha_esc == e2 and esc_maquina == e1 or esc_maquina == e3:   # Papel
            if esc_maquina == e1:
                print('Você venceu! A máquina escolheu {}.'.format(e1))
                print('Para tentar novamente, pressione Shift+F10')
            elif esc_maquina == e3:
                print('Você perdeu! A máquina escolheu {}.'.format(e3))
                print('Para tentar novamente, pressione Shift+F10')
        elif minha_esc == e3 and esc_maquina == e1 or esc_maquina == e2:   # Tesoura
            if esc_maquina == e1:
                print('Você perdeu! A máquina escolheu {}.'.format(e1))
                print('Para tentar novamente, pressione Shift+F10')
            elif esc_maquina == e2:
                print('Você venceu! A máquina escolheu {}.'.format(e2))
                print('Para tentar novamente, pressione Shift+F10')
else:
    print('Não há nada aqui. Pressione Shift+F10 e volte ao começo!')

1 answer

1

Your list stayed ['pedra', 'papel', 'tesoura']. That is, the first element loses the second, the second loses the third, and the third loses the first. Then it would be enough to take the position of each of the options and compare them. For this we can use the method index of the list.

If the options are equal, you have given a draw. If the position you have chosen is prior to the position the computer has chosen, you have lost. Otherwise, you have won. That is to say:

# verifica se eu ganhei do computador
def resultado(opcoes, eu, comp):
    if eu == comp: # se forem iguais, empatou
        return 'empate'
    # busca a posição de cada um
    indice_eu = opcoes.index(eu)
    indice_comp = opcoes.index(comp)
    if (indice_eu + 1) % len(opcoes) == indice_comp:
        return 'perdi'
    return 'ganhei'

The idea is to see if the position of the computer is immediately after mine. But I also use the operator % (rest of the division) to return to the first position if it is the third.

Testing:

opcoes = ['pedra', 'papel', 'tesoura']
for eu in opcoes:
    for comp in opcoes:
        print(f'eu={eu}, comp={comp}, resultado={resultado(opcoes, eu, comp)}')

Exit:

eu=pedra, comp=pedra, resultado=empate
eu=pedra, comp=papel, resultado=perdi
eu=pedra, comp=tesoura, resultado=ganhei
eu=papel, comp=pedra, resultado=ganhei
eu=papel, comp=papel, resultado=empate
eu=papel, comp=tesoura, resultado=perdi
eu=tesoura, comp=pedra, resultado=perdi
eu=tesoura, comp=papel, resultado=ganhei
eu=tesoura, comp=tesoura, resultado=empate

Of course, so I have to make sure my choice is on the list, so I’d have to do something like:

while True:
    minha_escolha = input('Minha escolha é: ')
    if minha_escolha in opcoes: # escolha está na lista
        break # interrompe o while
    else:
        print(f'As escolhas válidas são: {", ".join(opcoes)}')

That is, if you type a choice that is not in the list, it prompts you to type again. Also note that input already returns a string, so do str(input()) is redundant and unnecessary.

So I guarantee I only typed an element that definitely exists on the list, and so on index will always return a valid index. For the choice of the computer do not need, because you use random.choice that assuredly takes an element that exists in it. Of course, if the list were larger, the most efficient would be to work directly with the indexes (instead of fetching them all the time), but for a list with only 3 elements should not make a difference.

And of course, instead of returning "won" or "lost", you can do whatever you want (like printing a specific message, etc.). Only that, how return terminates the execution of the function, if to remove it you must change a little. Ex:

def resultado(opcoes, eu, comp):
    if eu == comp:
        print(f'Empate, ambos escolheram {eu}')
    else:
        indice_eu = opcoes.index(eu)
        indice_comp = opcoes.index(comp)
        if (indice_eu + 1) % len(opcoes) == indice_comp:
            msg = 'Você perdeu!'
        else:
            msg = 'Você venceu!'
        print(f'{msg} A máquina escolheu {comp} e você escolheu {eu}')

Browser other questions tagged

You are not signed in. Login or sign up in order to post.