class Carta(object):
def __init__(self, numero, naipe):
self._numero = numero
self._naipe = naipe
@property
def numero(self):
return self._numero
def __repr__(self):
return '{}{}'.format(self._numero, self._naipe)
class Baralho(object):
numeros = '2 3 4 5 6 7 8 9 10 J Q K A'.split()
naipes = '♥ ♦ ♣ ♠'.split()
def __init__(self):
self._baralho = [Carta(numero, naipe) for numero in Baralho.numeros for naipe in Baralho.naipes]
self.embaralha()
def embaralha(self):
shuffle(self._baralho)
def pega_carta(self):
return self._baralho.pop()
class Observador(object):
def __init__(self):
self._observadores = set()
def adiciona(self, observador):
self._observadores.add(observador)
def remove(self, observador):
self._observadores.remove(observador)
def notifica(self):
for observador in self._observadores:
observador.atualiza()
class Pontos(object):
def __init__(self):
self._pontos = 0
def __add__(self, carta):
if carta.numero == 'A':
self._pontos += 1
elif carta.numero in 'JQK':
self._pontos += 10
else:
self._pontos += int(carta.numero)
@property
def pontos(self):
return self._pontos
def __repr__(self):
return str(self._pontos)
class Tela(object):
def __init__(self):
self.baralho = Baralho()
self.pontos = Pontos()
self.fonte = ('Comic Sans MS', 12, 'bold')
self.root = tk.Tk()
self.root.title('Blackjack')
self.root.geometry('300x300+100+100')
self.frame1 = tk.Frame(self.root)
self.frame2 = tk.Frame(self.root)
tk.Label(self.root, text = 'Blackjack', fg = 'red', font = self.fonte).pack()
self.iniciar = tk.Button(self.frame1, text = 'Iniciar', font = self.fonte, width = 8)
self.iniciar['command'] = self.func_iniciar
self.iniciar.pack(side = tk.LEFT)
self.sair = tk.Button(self.frame1, text = 'Sair', font = self.fonte, width = 8)
self.sair['command'] = self.func_sair
self.sair.pack(side = tk.LEFT)
self.mostra_pontos = tk.Label(self.frame2, text = '--', font = self.fonte)
self.mostra_pontos.pack(side = tk.TOP)
self.mostra_cartas = tk.Label(self.frame2, text = '--', font = self.fonte)
self.mostra_cartas.pack(side = tk.TOP)
self.mais_uma = tk.Button(self.frame2, text = 'Mais uma', font = self.fonte, fg = 'green', width = 8)
self.mais_uma.pack(side = tk.BOTTOM)
self.tela_inicial()
def pede_carta(self):
return self.baralho.pega_carta()
def atualiza(self):
self.atualizaCartasPontos(self.pede_carta())
def atualizaCartasPontos(self, carta):
self.pontos += carta
self.mostra_cartas['text'] = carta
self.atualiza_pontos()
def atualiza_pontos(self):
self.mostra_pontos['text'] = self.pontos
def func_iniciar(self):
self.tela_jogo()
def func_sair(self):
self.root.destroy()
def tela_jogo(self):
self.frame1.pack_forget()
self.frame2.pack()
def tela_inicial(self):
self.frame2.pack_forget()
self.frame1.pack(side = tk.BOTTOM)
class Blackjack(Observador):
def __init__(self):
self.baralho = Baralho()
self.pontos = Pontos()
self.tela = Tela()
self.adiciona(self.tela)