JoKenPô em Python de forma diferente...

Estava aplicando uma teste para o pessoal novo na área, que era fazer um joguinho basico de JoKenPô... Em todos os casos, a solução final se resumiu a alguns if's... do tipo...

if pc.escolha == jg.escolha:
    print('empatou!!!')
elif pc.escolha == 'PEDRA':
    if jg.escolha == 'PAPEL':
        print('Você ganhou!!')
    else:
        print('PC ganhou!!!')
elif pc.escolha == 'PAPEL':
    ...

Por ai vai, vcs devem ter entendido a idéia, houveram obviamente diferença de implementação, mas todos se resumem a esses if's.

O problema disso, é que o segundo passo do desafio era implentar o Pedra-Papel-Tesoura-Lagarto-Spock wikipedia que é basicamente uma expansão do JoKenPô. Ai vieram os problemas de entender as diferenças... entender quem ganha de quem, algo que o Sheldon Cooper explica... Youtube. Mas após o entendimento, voltando para o código... atualizar os if's do texto ai vem a complicação... de estrutura do software!

Após toda essa histórinha... queria trazer resumidamente, minha sugestão de implementação, pois não achei, e eu pesquisei, uma forma fugindo de todos os if's.

from random import choice
from time import sleep
import os
import emoji

class Jokenpo():
    # Chave: [nome, sobre_oq_ganha{chave: acao_para_ganhar}, emoji_para_ficar_fofinho]
    jkp = {'j': ['pedra', {'p': 'quebra'}, ':oncoming_fist:'],
           'k': ['papel', {'j': 'cobre'}, ':raised_back_of_hand:'],
           'p': ['tesoura', {'k': 'corta'}, ':victory_hand:']
           }
    def jokenpo(self):
        # Resumo da implementação
        # O jg escolhe a chave do dict jkp - se por igual empata
        if jg == pc: 
            print('Empatou!!!!!')
            return (self.pontuacao)
        # Verifica se a chave que o pc escolheu está dentro das chaves que o jg vence
        elif pc in self.jkp[jg][1].keys(): 
            print(self.jkp[jg][0].capitalize(),   #Imprime o Nome do que o jogador jogou, 
                    self.jkp[jg][1][pc].upper(),  #Imprime o como o jogador vence o PC, 
                    self.jkp[pc][0].capitalize()  #Imprime o Nome do que o PC jogou
                 ) # Saida possivel: Pedra quebra Tesoura
            print('Você Ganhou!!!')
            self.pontuacao += 1
            return self.pontuacao
        else:
            # Caso o PC ganhe
            print(self.jkp[pc][0].capitalize(),
                   self.jkp[pc][1][jg].upper(),
                   self.jkp[jg][0].capitalize()
                  )
            print('Você Perdeu!!!')
            self.pontuacao -= 1
            return self.pontuacao
            ...

A grande diferença é que para inserir qualquer expansão é somente alterar o objeto jkp

como segue:

    jkp = {'j': ['pedra', {'p': 'quebra', 'l': 'esmaga'}, ':oncoming_fist:'],
           'k': ['papel', {'j': 'cobre', 's': 'refuta'}, ':raised_back_of_hand:'],
           'p': ['tesoura', {'k': 'corta', 'l': 'decapita'}, ':victory_hand:'],
           'l': ['lagarto', {'s': 'envenena', 'k': 'come'}, ':pinching_hand:'],
           's': ['spock', {'j': 'destroi', 'p': 'quebra'}, ':vulcan_salute:']
           }

Só adicionando dentro do dict quem ele ganhar! E todo o if posterior, continua o mesmo!

Resolvi trazer para cá, pois foi uma solução interresante, e pode ajudar a turma, principalmente quem tá começando! Aceito todos os comentários sobre como melhorar isso!

Posteriormente, deixo o link para meu GitHub com a implementação completa.

Abs,