Skip to content

Instantly share code, notes, and snippets.

@vladymir
Last active May 10, 2017 22:19
Show Gist options
  • Save vladymir/b07f85d2ca9adcbea2259efe2c798175 to your computer and use it in GitHub Desktop.
Save vladymir/b07f85d2ca9adcbea2259efe2c798175 to your computer and use it in GitHub Desktop.
###########################
## 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