Last active
May 10, 2017 22:19
-
-
Save vladymir/b07f85d2ca9adcbea2259efe2c798175 to your computer and use it in GitHub Desktop.
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
| ########################### | |
| ## JOGO DA VELHA ## | |
| ## IFCE - Boa Viagem ## | |
| ########################### | |
| # Copyright: Vladymir Bezerra | |
| # O Jogo todo é representado apenas por funcoes. Cada funcao tem uma funcionalidade | |
| # bastante específicas. As funcoes devem ser pequenas e devem fazer apenas UMA coisa. | |
| # Em cima de cada funcao tem um comentario explicando a mesma. | |
| # Retorna um novo tabuleiro | |
| def novo_tabuleiro(): | |
| return [[" "," "," "], | |
| [" "," "," "], | |
| [" "," "," "]] | |
| def print_tabuleiro(tabuleiro): | |
| for linha in tabuleiro: | |
| print(linha) | |
| # Retorna lista com a LINHA correspondente a i | |
| # Ex.: i = 0 retorna [(0,1), (0,2), (0,3)] | |
| def pega_linha(i): | |
| line = [] | |
| for c in range(3): | |
| line.append((i,c)) | |
| return line | |
| # Retorna lista com a COLUNA correspondente a j | |
| # Ex.: j = 1 retorna [(0,1), (1,1), (2,1)] | |
| def pega_coluna(j): | |
| col = [] | |
| for c in range(3): | |
| col.append((c,j)) | |
| return col | |
| # Retorna lista com diagonal pendendo para a direita 45 graus | |
| # Retorna uma lista vazia se não der pra formar uma diagonal completa | |
| def diagonal45(i, j): | |
| diag = [(x, 2-x) for x in range(3)] | |
| if (i,j) in diag: | |
| return diag | |
| return [] | |
| # Retorna lista com diagonal pendendo pra esquerda 135 graus | |
| # Retorna uma lista vazia se não der pra formar uma diagonal completa | |
| def diagonal135(i,j): | |
| if i==j: | |
| return [(x,x) for x in range(3)] | |
| return [] | |
| # Retorna True se um jogador ganhou a partida | |
| # retorna False caso contrário | |
| def check(x, jogador, tabuleiro, funcao_pega, *args): | |
| vencedor = True | |
| vetor = funcao_pega(x) if len(args)==0 else funcao_pega(x,args[0]) | |
| if (len(vetor) > 0): | |
| for l,c in vetor: | |
| vencedor = vencedor and (tabuleiro[l][c] == jogador) | |
| return vencedor | |
| else: | |
| return False | |
| # Retorna True se um jogador ganhou na linha | |
| def check_linha(linha, jogador, tabubeiro): | |
| return check(linha, jogador, tabuleiro, pega_linha) | |
| # Retorna True se um jogador ganhou na coluna | |
| def check_coluna(coluna, jogador, tabuleiro): | |
| return check(coluna, jogador, tabuleiro, pega_coluna) | |
| # Retorna True se o jogador ganhou na diagonal | |
| # e retorna False caso contrário | |
| def check_diagonal(linha, coluna, jogador, tabuleiro): | |
| return check(linha, jogador, tabuleiro, diagonal45, coluna) or \ | |
| check(coluna, jogador, tabuleiro, diagonal135, linha) | |
| # Retorna True se um jogador venceu, | |
| # False caso contrário | |
| def vencedor(linha, coluna, jogador, tabuleiro): | |
| return check_linha(linha, jogador, tabuleiro) or \ | |
| check_coluna(coluna, jogador, tabuleiro) or \ | |
| check_diagonal(linha,coluna, jogador, tabuleiro) | |
| # Retorna True se a partida acaba | |
| # Retorna False caso contrário | |
| def partida_acaba(tabuleiro): | |
| for i,j in [(x,y) for x in range(3) for y in range(3)]: | |
| if vencedor(i,j,"X", tabuleiro) or vencedor(i,j,"O", tabuleiro): | |
| return True | |
| return False | |
| # Retorna True se o lugar estiver vazio | |
| # retorna False se o lugar já estiver ocupado | |
| def lugar_vazio(linha, coluna, tabuleiro): | |
| if linha in range(3) and coluna in range(3): | |
| return tabuleiro[linha][coluna] == " " | |
| return False | |
| # Lê do teclado e retorna Tupla X,Y | |
| def le_jogadas(): | |
| x = int(input("Linha: ")) | |
| y = int(input("Coluna: ")) | |
| return x,y | |
| # Funcao que comeca a Partida | |
| def comeca_partida(): | |
| tabuleiro = novo_tabuleiro() | |
| jogada = True #True == Player1 e False==Player2 | |
| # Enquanto a partida nao acaba, continue jogando | |
| while not partida_acaba(tabuleiro): | |
| print("\033c") # caractere especial que limpa a tela (funciona no Mac) | |
| print_tabuleiro(tabuleiro) | |
| x,y = le_jogadas() | |
| while lugar_vazio(x,y,tabuleiro) == False: | |
| print("Jogada inválida!") | |
| x,y = le_jogadas() | |
| # Player1 | |
| if jogada == True: | |
| tabuleiro[x][y] = "X" | |
| else: # Player 2 | |
| tabuleiro[x][y] = "O" | |
| jogada = not jogada # passa a vez pro oponente | |
| # Verifica quem ganhou | |
| if vencedor(x,y,"X", tabuleiro): | |
| print_tabuleiro(tabuleiro) | |
| print("X venceu!") | |
| else: | |
| print_tabuleiro(tabuleiro) | |
| print("O venceu!") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment