kadoshmt_br

Tip Tap Toe (Jogo da Velha)

Aug 11th, 2019
313
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 15.95 KB | None | 0 0
  1. """
  2. JOGO TIP-TAP-TOE (JOGO DA VELHA) UTILIZANDO A GUI TKINTER
  3. Author: Janes Roberto
  4. Version: 1.1.1
  5. """
  6. from tkinter import *
  7. from tkinter import messagebox
  8.  
  9. # Inicio da Classe
  10. class TipTapToe( Frame ):
  11.     """
  12.    Metodo construtor da Classe.
  13.    Define os elementos da janela principal e inicia o programa
  14.    """
  15.     def __init__(self):
  16.         # Cria nossa janela principal
  17.         self.__janela = Tk()
  18.         self.__janela.title('TIP TAP TOE - TABAJARA')
  19.  
  20.         # Inicializa algumas variaveis de controle
  21.         self.__rodada_jogador = 1                       # controla de quem e a rodada
  22.         self.__label_clicada = ""                       # guada o valor da label clicada
  23.         self.__possibilidades = list(range(1, 10))      # gera uma lista para controlar a marcacao do jogo
  24.         self.__ganhou = False                   # guarda o status da jogada
  25.  
  26.  
  27.         # cria os frames do jogo
  28.         self.__frame_placar = Frame(self.__janela, bg="white", height=100, width=400)
  29.         self.__frame_tabuleiro = Frame(self.__janela, bg="yellow", height=250, width=400)
  30.         self.__frame_info = Frame(self.__janela, bg="black", height=100, width=400)
  31.  
  32.         # monta o frame 1 - Placar
  33.         self.__label_p1 = Label(self.__frame_placar, text='P1 ', font=('Helvetica', 32), fg='red')
  34.         self.__pontos_p1 = StringVar()
  35.         self.__pontos_p1.set("0")
  36.         self.__placar_p1 = Label(self.__frame_placar, width=2, font=('Terminal', 32), fg='yellow', bg='black', textvariable=self.__pontos_p1, justify='center')
  37.  
  38.         self.__label_versus = Label(self.__frame_placar, text='x', font=('Helvetica', 32), fg='black', width=6)
  39.  
  40.         self.__label_p2 = Label(self.__frame_placar, text=' P2', font=('Helvetica', 32), fg='blue')
  41.         self.__pontos_p2 = StringVar()
  42.         self.__pontos_p2.set("0")
  43.         self.__placar_p2 = Label(self.__frame_placar, width=2, font=('Terminal', 32), fg='yellow', bg='black', textvariable=self.__pontos_p2, justify='center')
  44.  
  45.         # organiza widgets do placar na grid
  46.         self.__label_p1.grid(row=0, column=0, sticky=W)
  47.         self.__placar_p1.grid(row=0, column=1, sticky=W)
  48.         self.__label_versus.grid(row=0, column=2, sticky=W)
  49.         self.__placar_p2.grid(row=0, column=3, sticky=W)
  50.         self.__label_p2.grid(row=0, column=4, sticky=W)
  51.  
  52.         # monta o frame 2 - tabuleiro do jogo
  53.         # variaveis das labels que sao alteradas dinamicamente ao se clicar na label
  54.         self.__char_pos_1 = StringVar()
  55.         self.__char_pos_2 = StringVar()
  56.         self.__char_pos_3 = StringVar()
  57.         self.__char_pos_4 = StringVar()
  58.         self.__char_pos_5 = StringVar()
  59.         self.__char_pos_6 = StringVar()
  60.         self.__char_pos_7 = StringVar()
  61.         self.__char_pos_8 = StringVar()
  62.         self.__char_pos_9 = StringVar()
  63.  
  64.         # labels que formam o tabuleiro do jogo
  65.         self.__label_pos_1 = Label(self.__frame_tabuleiro, font=('Helvetica', 32), text=' ', width=6, justify='center', relief='groove', height='2', textvariable=self.__char_pos_1)
  66.         self.__label_pos_2 = Label(self.__frame_tabuleiro, font=('Helvetica', 32), text=' ', width=6, justify='center', relief='groove', height='2', textvariable=self.__char_pos_2)
  67.         self.__label_pos_3 = Label(self.__frame_tabuleiro, font=('Helvetica', 32), text=' ', width=6, justify='center', relief='groove', height='2', textvariable=self.__char_pos_3)
  68.         self.__label_pos_4 = Label(self.__frame_tabuleiro, font=('Helvetica', 32), text=' ', width=6, justify='center', relief='groove', height='2', textvariable=self.__char_pos_4)
  69.         self.__label_pos_5 = Label(self.__frame_tabuleiro, font=('Helvetica', 32), text=' ', width=6, justify='center', relief='groove', height='2', textvariable=self.__char_pos_5)
  70.         self.__label_pos_6 = Label(self.__frame_tabuleiro, font=('Helvetica', 32), text=' ', width=6, justify='center', relief='groove', height='2', textvariable=self.__char_pos_6)
  71.         self.__label_pos_7 = Label(self.__frame_tabuleiro, font=('Helvetica', 32), text=' ', width=6, justify='center', relief='groove', height='2', textvariable=self.__char_pos_7)
  72.         self.__label_pos_8 = Label(self.__frame_tabuleiro, font=('Helvetica', 32), text=' ', width=6, justify='center', relief='groove', height='2', textvariable=self.__char_pos_8)
  73.         self.__label_pos_9 = Label(self.__frame_tabuleiro, font=('Helvetica', 32), text=' ', width=6, justify='center', relief='groove', height='2', textvariable=self.__char_pos_9)
  74.  
  75.         # Cria o vinculo das labels a uma funcao com o evento "clique do 1o botao do mouse"
  76.         self.__label_pos_1.bind("<Button-1>", self.__marcar_opcao)
  77.         self.__label_pos_2.bind("<Button-1>", self.__marcar_opcao)
  78.         self.__label_pos_3.bind("<Button-1>", self.__marcar_opcao)
  79.         self.__label_pos_4.bind("<Button-1>", self.__marcar_opcao)
  80.         self.__label_pos_5.bind("<Button-1>", self.__marcar_opcao)
  81.         self.__label_pos_6.bind("<Button-1>", self.__marcar_opcao)
  82.         self.__label_pos_7.bind("<Button-1>", self.__marcar_opcao)
  83.         self.__label_pos_8.bind("<Button-1>", self.__marcar_opcao)
  84.         self.__label_pos_9.bind("<Button-1>", self.__marcar_opcao)
  85.  
  86.         # organiza widgets do tabuleiro na grid
  87.         self.__label_pos_1.grid(row=0, column=0, sticky=W)
  88.         self.__label_pos_2.grid(row=0, column=1, sticky=W)
  89.         self.__label_pos_3.grid(row=0, column=2, sticky=W)
  90.         self.__label_pos_4.grid(row=1, column=0, sticky=W)
  91.         self.__label_pos_5.grid(row=1, column=1, sticky=W)
  92.         self.__label_pos_6.grid(row=1, column=2, sticky=W)
  93.         self.__label_pos_7.grid(row=2, column=0, sticky=W)
  94.         self.__label_pos_8.grid(row=2, column=1, sticky=W)
  95.         self.__label_pos_9.grid(row=2, column=2, sticky=W)
  96.  
  97.         # monta o frame 3 - rodape
  98.         # variavel dinamica para guardar as mensagens da jogada no rodape
  99.         self.__var_info = StringVar()
  100.         self.__var_info.set('Rodada do Jogador 1')
  101.  
  102.         # Label do rodape
  103.         self.__label_info = Label(self.__frame_info, font=('Terminal', 12), textvariable=self.__var_info, justify='center', bg='black', fg='yellow', width='38', pady='4')
  104.         self.__label_info.pack(fill=X, expand=1)
  105.  
  106.         # Empacota os frames na janela principal
  107.         self.__frame_placar.pack()
  108.         self.__frame_tabuleiro.pack()
  109.         self.__frame_info.pack()
  110.  
  111.         # Criando um loop eterno (basicamente um "while True" por debaixo dos panos pra abrir nossa janela)
  112.         self.__janela.mainloop()
  113.  
  114.     """
  115.    Metodo responsavel por mostrar a marcacao do jogador no tabuleiro ao clicar nele.    
  116.    """
  117.     def __marcar_opcao(self, event):
  118.         # pega o label clicado pelo jogador
  119.         self.__label_clicada = event.widget.winfo_name()
  120.  
  121.         # Estes blocos verificam qual label foi clicada pelo jogador, marcando "x" ou "o" de aordo com o jogador da rodada
  122.         # tambem guarda a opcao na lista de jogadas que e usada para ver se ha uma jogada vencedora
  123.         # Por fim, altera a cor do texto de acordo com o jogador da rodada ("x" sempre vermelho e "o" sempre azul)
  124.         if self.__label_clicada == '!label' and self.__char_pos_1.get() == '':
  125.             self.__char_pos_1.set('X') if self.__rodada_jogador == 1 else self.__char_pos_1.set('O')
  126.             self.__possibilidades[0] = 'X' if self.__rodada_jogador == 1 else 'O'
  127.             self.__label_pos_1.config(fg='red') if self.__rodada_jogador == 1 else self.__label_pos_1.config(fg='blue')
  128.             self.__verifica_se_ganhou()
  129.         elif self.__label_clicada == '!label2' and self.__char_pos_2.get() == '':
  130.             self.__char_pos_2.set('X') if self.__rodada_jogador == 1 else self.__char_pos_2.set('O')
  131.             self.__possibilidades[1] = 'X' if self.__rodada_jogador == 1 else 'O'
  132.             self.__label_pos_2.config(fg='red') if self.__rodada_jogador == 1 else self.__label_pos_2.config(fg='blue')
  133.             self.__verifica_se_ganhou()
  134.         elif self.__label_clicada == '!label3' and self.__char_pos_3.get() == '':
  135.             self.__char_pos_3.set('X') if self.__rodada_jogador == 1 else self.__char_pos_3.set('O')
  136.             self.__possibilidades[2] = 'X' if self.__rodada_jogador == 1 else 'O'
  137.             self.__label_pos_3.config(fg='red') if self.__rodada_jogador == 1 else self.__label_pos_3.config(fg='blue')
  138.             self.__verifica_se_ganhou()
  139.         elif self.__label_clicada == '!label4' and self.__char_pos_4.get() == '':
  140.             self.__char_pos_4.set('X') if self.__rodada_jogador == 1 else self.__char_pos_4.set('O')
  141.             self.__possibilidades[3] = 'X' if self.__rodada_jogador == 1 else 'O'
  142.             self.__label_pos_4.config(fg='red') if self.__rodada_jogador == 1 else self.__label_pos_4.config(fg='blue')
  143.             self.__verifica_se_ganhou()
  144.         elif self.__label_clicada == '!label5' and self.__char_pos_5.get() == '':
  145.             self.__char_pos_5.set('X') if self.__rodada_jogador == 1 else self.__char_pos_5.set('O')
  146.             self.__possibilidades[4] = 'X' if self.__rodada_jogador == 1 else 'O'
  147.             self.__label_pos_5.config(fg='red') if self.__rodada_jogador == 1 else self.__label_pos_5.config(fg='blue')
  148.             self.__verifica_se_ganhou()
  149.         elif self.__label_clicada == '!label6' and self.__char_pos_6.get() == '':
  150.             self.__char_pos_6.set('X') if self.__rodada_jogador == 1 else self.__char_pos_6.set('O')
  151.             self.__possibilidades[5] = 'X' if self.__rodada_jogador == 1 else 'O'
  152.             self.__label_pos_6.config(fg='red') if self.__rodada_jogador == 1 else self.__label_pos_6.config(fg='blue')
  153.             self.__verifica_se_ganhou()
  154.         elif self.__label_clicada == '!label7' and self.__char_pos_7.get() == '':
  155.             self.__char_pos_7.set('X') if self.__rodada_jogador == 1 else self.__char_pos_7.set('O')
  156.             self.__possibilidades[6] = 'X' if self.__rodada_jogador == 1 else 'O'
  157.             self.__label_pos_7.config(fg='red') if self.__rodada_jogador == 1 else self.__label_pos_7.config(fg='blue')
  158.             self.__verifica_se_ganhou()
  159.         elif self.__label_clicada == '!label8' and self.__char_pos_8.get() == '':
  160.             self.__char_pos_8.set('X') if self.__rodada_jogador == 1 else self.__char_pos_8.set('O')
  161.             self.__possibilidades[7] = 'X' if self.__rodada_jogador == 1 else 'O'
  162.             self.__label_pos_8.config(fg='red') if self.__rodada_jogador == 1 else self.__label_pos_8.config(fg='blue')
  163.             self.__verifica_se_ganhou()
  164.         elif self.__label_clicada == '!label9' and self.__char_pos_9.get() == '':
  165.             self.__char_pos_9.set('X') if self.__rodada_jogador == 1 else self.__char_pos_9.set('O')
  166.             self.__possibilidades[8] = 'X' if self.__rodada_jogador == 1 else 'O'
  167.             self.__label_pos_9.config(fg='red') if self.__rodada_jogador == 1 else self.__label_pos_9.config(fg='blue')
  168.             self.__verifica_se_ganhou()
  169.  
  170.     """
  171.    Metodo responsavel por verificar se ja ha uma jogada vencedora    
  172.    """
  173.     def __verifica_se_ganhou(self):
  174.  
  175.         # define as possibilidades para vencer uma rodada. Inicialmente todas as possibilidades sao falsas
  176.         # Quando temos uma jogada vencedora, a variavel desta sequencia recebe True
  177.         game1 = self.__possibilidades[0] == self.__possibilidades[1] == self.__possibilidades[2] # primeira linha
  178.         game2 = self.__possibilidades[3] == self.__possibilidades[4] == self.__possibilidades[5] # segunda linha
  179.         game3 = self.__possibilidades[6] == self.__possibilidades[7] == self.__possibilidades[8] # terceira linha
  180.         game4 = self.__possibilidades[0] == self.__possibilidades[3] == self.__possibilidades[6] # primeira coluna
  181.         game5 = self.__possibilidades[1] == self.__possibilidades[4] == self.__possibilidades[7] # segunda coluna
  182.         game6 = self.__possibilidades[2] == self.__possibilidades[5] == self.__possibilidades[8] # terceira coluna
  183.         game7 = self.__possibilidades[0] == self.__possibilidades[4] == self.__possibilidades[8] # primeira diagonal
  184.         game8 = self.__possibilidades[2] == self.__possibilidades[4] == self.__possibilidades[6] # segunda diagonal
  185.  
  186.         # Verifica se ainda ha jogadas disponiveis
  187.         continua_jogo = False
  188.         for valor in self.__possibilidades:
  189.             if str(valor).isdigit():
  190.                 continua_jogo = True
  191.  
  192.         # adiciona estas possibilidades numa lista
  193.         checaGames = [game1, game2, game3, game4, game5, game6, game7, game8]
  194.  
  195.         # itera a lista para verificar se ha uma rodada vitoriosa (True)
  196.         for possibilidade in checaGames:
  197.             if possibilidade:
  198.                self.__ganhou = True
  199.  
  200.         # Se encontrar uma possibilidade vitoriosa, chama a funcao para declarar o vencedor
  201.         # caso contrario, altera o turno para o outro jogador e continua o jogo
  202.         if self.__ganhou:
  203.             self.__jogador_ganhou()
  204.         else:
  205.             if continua_jogo:          # se ainda ha jogadas disponiveis, continua a o jogo
  206.                 self.__altera_rodada()
  207.             else:                      # se nao tiver mais jogadas, houve um empate
  208.                 titulo = 'EMPATE!'
  209.                 mensagem = 'Opa! Parece que temos um empate.\nQue tal mais uma rodada?'
  210.                 self.__mostra_caixa_dialogo(titulo, mensagem)
  211.  
  212.  
  213.     """
  214.    Metodo chamado quando um jogador ganha a partida    
  215.    """
  216.     def __jogador_ganhou(self):
  217.         self.__ganhou = True
  218.         titulo = 'Temos um vencedor!'
  219.         mensagem = 'O Jogador ' + str(self.__rodada_jogador) + ' venceu! Parabéns!\nQue tal mais uma rodada?'
  220.         self.__marcar_ponto()
  221.         self.__mostra_caixa_dialogo(titulo, mensagem)
  222.  
  223.  
  224.  
  225.     """
  226.    Metodo responsavel por marcar o ponto no placar do jogador vencedor    
  227.    """
  228.     def __marcar_ponto(self):
  229.         if self.__rodada_jogador == 1:
  230.             valor = int(self.__pontos_p1.get())
  231.             valor = valor + 1
  232.             self.__pontos_p1.set(valor)
  233.         elif self.__rodada_jogador == 2:
  234.             valor = int(self.__pontos_p2.get())
  235.             valor = valor + 1
  236.             self.__pontos_p2.set(valor)
  237.  
  238.  
  239.     """
  240.    Metodo responsavel por alterar a rodada entre os jogadores  
  241.    """
  242.     def __altera_rodada(self):
  243.         if self.__rodada_jogador == 1:
  244.             self.__rodada_jogador = 2
  245.             self.__var_info.set('Rodada do Jogador 2')
  246.         else:
  247.             self.__rodada_jogador = 1
  248.             self.__var_info.set('Rodada do Jogador 1')
  249.  
  250.  
  251.     """
  252.    Metodo responsavel por exibir a caixa de dialogo no final das partidas  
  253.    """
  254.     def __mostra_caixa_dialogo(self, titulo, mensagem):
  255.         # Altera a mensagem de informacao do Rodape
  256.         self.__var_info.set(mensagem)
  257.  
  258.         # exibe a caixa de dialogo e recebe a opcao escolhida pelos jogadores (True ou False)
  259.         resp = messagebox.askretrycancel(title=titulo, message=mensagem)
  260.  
  261.         # se o jogador escolher "Repetir", reinicia o jogo. Se escolher cancelar, fecha o jogo
  262.         if resp:
  263.             self.__reiniciar_joog()
  264.         else:
  265.             self.__janela.quit()
  266.  
  267.     """
  268.    Metodo que reinicia a partida, zerando as variaveis para uma nova rodasa  
  269.    """
  270.     def __reiniciar_joog(self):
  271.         # recria a lista de possibilidades
  272.         self.__possibilidades = list(range(1, 10))
  273.         self.__ganhou = False
  274.  
  275.         # verifica o jogador que ganhou para alterar a info e iniciar a partida a partir dele
  276.         if self.__rodada_jogador == 1:
  277.             self.__var_info.set('Rodada do Jogador 1')
  278.         else:
  279.             self.__var_info.set('Rodada do Jogador 2')
  280.  
  281.         # Limpa o tabuleiro com as marcações "x" e "o"
  282.         self.__char_pos_1.set('')
  283.         self.__char_pos_2.set('')
  284.         self.__char_pos_3.set('')
  285.         self.__char_pos_4.set('')
  286.         self.__char_pos_5.set('')
  287.         self.__char_pos_6.set('')
  288.         self.__char_pos_7.set('')
  289.         self.__char_pos_8.set('')
  290.         self.__char_pos_9.set('')
  291.  
  292. # FIM DA CLASSE TIPTAPTOE
  293.  
  294. # Instancia a classe e inicia o jogo! LET'S PLAY!
  295. TipTapToe()
Advertisement
Add Comment
Please, Sign In to add comment