Last active
May 10, 2021 04:30
-
-
Save emersonccf/79d5462c68ba6fa0edd484aa999e9257 to your computer and use it in GitHub Desktop.
Sugestão de código para o Jogo Pedra-Papel-Tesoura
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| from abc import ABC, abstractmethod | |
| import os | |
| class Elemento(ABC): | |
| """ Classe base abstrata para os elementos do jogo """ | |
| def __init__(self): | |
| self._estado_confronto = 0 | |
| self._elemento_confronto = None | |
| @property | |
| def estado_confronto(self): | |
| return self._estado_confronto | |
| @abstractmethod | |
| def __str__(self): | |
| pass | |
| class Pedra(Elemento): | |
| """ A Pedra ganha para a Tesoura """ | |
| @property | |
| def elemento_confronto(self): | |
| return self._elemento_confronto | |
| @elemento_confronto.setter | |
| def elemento_confronto(self, elemento : Elemento): | |
| if not issubclass(elemento.__class__, Elemento): | |
| raise ValueError(f"Elemento informado não é válido! -> {type(elemento)}") | |
| if isinstance(elemento, Tesoura): | |
| self._estado_confronto = 1 | |
| self._elemento_confronto = elemento | |
| def __str__(self): | |
| if self._estado_confronto == 1: | |
| return "Pedra VENCE a Tesoura" | |
| else: | |
| if isinstance(self._elemento_confronto, Pedra): | |
| return "Pedra EMPATA com a Pedra" | |
| else: | |
| return "Pedra PERDE para o Papel" | |
| class Papel(Elemento): | |
| """ O Papel ganha para a Pedra """ | |
| @property | |
| def elemento_confronto(self): | |
| return self._elemento_confronto | |
| @elemento_confronto.setter | |
| def elemento_confronto(self, elemento : Elemento): | |
| if not issubclass(elemento.__class__, Elemento): | |
| raise ValueError(f"Elemento informado não é válido! -> {type(elemento)}") | |
| if isinstance(elemento, Pedra): | |
| self._estado_confronto = 1 | |
| self._elemento_confronto = elemento | |
| def __str__(self): | |
| if self._estado_confronto == 1: | |
| return "Papel VENCE a Pedra" | |
| else: | |
| if isinstance(self._elemento_confronto, Papel): | |
| return "Papel EMPATA com o Papel" | |
| else: | |
| return "Papel PERDE para a Tesoura" | |
| class Tesoura(Elemento): | |
| """ A Tesoura ganha para o Papel """ | |
| @property | |
| def elemento_confronto(self): | |
| return self._elemento_confronto | |
| @elemento_confronto.setter | |
| def elemento_confronto(self, elemento : Elemento): | |
| if not issubclass(elemento.__class__, Elemento): | |
| raise ValueError(f"Elemento informado não é válido! -> {type(elemento)}") | |
| if isinstance(elemento, Papel): | |
| self._estado_confronto = 1 | |
| self._elemento_confronto = elemento | |
| def __str__(self): | |
| if self._estado_confronto == 1: | |
| return "Tesoura VENCE o Papel" | |
| else: | |
| if isinstance(self._elemento_confronto, Tesoura): | |
| return "Tesoura EMPATA com a Tesoura" | |
| else: | |
| return "Tesoura PERDE para a Pedra" | |
| class Jogador(): | |
| """ Jogadores """ | |
| def __init__(self, nome : str): | |
| self._nome = nome | |
| self._pontuacao = 0 | |
| @property | |
| def nome(self): | |
| return self._nome | |
| @property | |
| def pontuacao(self): | |
| return self._pontuacao | |
| @pontuacao.setter | |
| def pontuacao(self, elemento : Elemento): | |
| self._pontuacao += elemento.estado_confronto | |
| def __str__(self): | |
| return f"Nome: {self._nome} -> Pontuação {self._pontuacao}" | |
| class JogoPedraPapelTesoura(): | |
| """ Desenvolvimento do Jogo Pedra-Papel-Tesoura """ | |
| def __init__(self, jogador1 : Jogador , jogador2 : Jogador, qtd_rodadas : int): | |
| self._jogador1 = jogador1 | |
| self._jogador2 = jogador2 | |
| self._qtd_rodadas = qtd_rodadas | |
| self._rodadas = list() | |
| @property | |
| def jogador1(self): | |
| return self._jogador1 | |
| @property | |
| def jogador2(self): | |
| return self._jogador2 | |
| @property | |
| def qtd_rodadas(self): | |
| return self._qtd_rodadas | |
| def jogar(self, elem_jog1 : Elemento, elem_jog2 : Elemento): | |
| elem_jog1.elemento_confronto = elem_jog2 | |
| elem_jog2.elemento_confronto = elem_jog1 | |
| self.jogador1.pontuacao = elem_jog1 | |
| self.jogador2.pontuacao = elem_jog2 | |
| # lista de tuplas com os elementos confrontados pelos jogadores e suas respectivas pontuações acumuladas por rodada | |
| self._rodadas.append((elem_jog1, self.jogador1.pontuacao, elem_jog2, self.jogador2.pontuacao)) | |
| def vencedor(self) -> str: | |
| if self.jogador1.pontuacao > self.jogador2.pontuacao: | |
| return f"{self.jogador1.nome} é o vencedor com {self.jogador1.pontuacao} ponto(s)" | |
| elif self.jogador1.pontuacao < self.jogador2.pontuacao: | |
| return f"{self.jogador2.nome} é o vencedor com {self.jogador2.pontuacao} ponto(s)" | |
| else: | |
| return f"Houve empate entre {self.jogador1.nome} e {self.jogador2.nome} com {self.jogador1.pontuacao} ponto(s)" | |
| def __str__(self): | |
| placar = "" | |
| i = 1 | |
| for el1, pt1, el2, pt2 in self._rodadas: | |
| placar += f"Rodada {i}ª ---- \n" | |
| placar += f"{self.jogador1.nome} Pontuação => [{pt1}] >> {el1} << {self.jogador2.nome} Pontuação => [{pt2}] \n" | |
| i += 1 | |
| return placar | |
| class Main(): | |
| def prepara_jogo(self) -> JogoPedraPapelTesoura: | |
| os.system("cls") # win linux -> os.system("clear") - limpa a tela | |
| print("Iniciando Jogo: Pedra - Papel - Tesoura") | |
| jogador1 = Jogador(input("Informe nome do Jogador 1: ")) | |
| jogador2 = Jogador(input("Informe nome do Jogador 2: ")) | |
| qtd_rodadas = int(input("Informe a quantidade de rodadas: ")) | |
| return JogoPedraPapelTesoura(jogador1, jogador2, qtd_rodadas) | |
| def menu_op_elenetos(self, nm_jogador : str) -> Elemento: | |
| print(f"{nm_jogador}, faça sua escolha:") | |
| print("1- Pedra") | |
| print("2- Tesoura") | |
| print("3- Papel") | |
| op = int(input(f"Informe sua opção {nm_jogador}: ")) | |
| if op == 1: | |
| return Pedra() | |
| elif op == 2: | |
| return Tesoura() | |
| elif op == 3: | |
| return Papel() | |
| def run(self): | |
| jogo = self.prepara_jogo() | |
| rodada = 0 | |
| while jogo.qtd_rodadas > rodada: | |
| elem_jog1 = self.menu_op_elenetos(jogo.jogador1.nome) | |
| elem_jog2 = self.menu_op_elenetos(jogo.jogador2.nome) | |
| jogo.jogar(elem_jog1, elem_jog2) | |
| print(jogo) | |
| rodada += 1 | |
| print(jogo.vencedor()) | |
| if __name__ == '__main__': | |
| Main().run() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment