Skip to content

Instantly share code, notes, and snippets.

@emersonccf
Last active May 10, 2021 04:30
Show Gist options
  • Select an option

  • Save emersonccf/79d5462c68ba6fa0edd484aa999e9257 to your computer and use it in GitHub Desktop.

Select an option

Save emersonccf/79d5462c68ba6fa0edd484aa999e9257 to your computer and use it in GitHub Desktop.
Sugestão de código para o Jogo Pedra-Papel-Tesoura
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