Skip to content

Instantly share code, notes, and snippets.

@nenodias
Created February 14, 2020 23:34
Show Gist options
  • Select an option

  • Save nenodias/380174fd1ac4de3b62088450df7f1032 to your computer and use it in GitHub Desktop.

Select an option

Save nenodias/380174fd1ac4de3b62088450df7f1032 to your computer and use it in GitHub Desktop.
Jogo da Velha Python
from curses import initscr, wrapper, noecho, cbreak, endwin
from random import randint
def boas_vindas(stdscr):
stdscr.addstr(1, 1, 'Bem-vindo ao Jogo da Velha.')
stdscr.addstr(2, 1, 'Pressione q para sair ou h para obter ajuda.')
stdscr.addstr(16, 1, 'Desenvolvido por: Horácio Dias.')
stdscr.addstr(17, 1, 'Licensa Nova BSD.')
def ajuda(stdscr):
stdscr.clear()
stdscr.border()
stdscr.addstr(1, 1, 'Pressione Q para sair ou H para exibir essa ajuda.')
stdscr.addstr(2, 1, 'Para mudar a posição use as teclas: A, D, S, W')
stdscr.addstr(3, 1, 'Para definir uma posição do jogo, digite: L')
stdscr.addstr(4, 1, 'Para reiniciar a partida, digite Y')
stdscr.addstr(1, 1, 'Pressione espaço para sair dessa tela.')
stdscr.refresh()
def reiniciar_tela(stdscr, limpar=True):
if limpar:
stdscr.clear()
stdscr.border()
boas_vindas(stdscr)
stdscr.refresh()
def tabuleiro(stdscr, posicoes, x_center):
stdscr.clear()
reiniciar_tela(stdscr, limpar=False)
stdscr.addstr(10, x_center - 3, '------')
stdscr.addstr(12, x_center - 3, '------')
i = 9
for linha in posicoes:
tela = "%s|%s|%s" % tuple(linha)
stdscr.addstr(i, x_center - 3, tela)
i += 2
def limites(pos_x, pos_y):
if pos_x > 2:
pos_x = 0
if pos_x < 0:
pos_x = 2
if pos_y > 2:
pos_y = 0
if pos_y < 0:
pos_y = 2
return pos_x, pos_y
def robo(posicoes):
vazias = []
for i in range(0, 3):
for j in range(0, 3):
if posicoes[j][i] == ' ':
vazias.append([j, i])
n_escolhas = len(vazias)
if n_escolhas != 0:
j, i = vazias[randint(0, n_escolhas - 1)]
posicoes[j][i] = 'o'
return posicoes
def espaco_do_tableiro(pos_x, pos_y, entrada):
if entrada == 'a':
pos_x, pos_y = limites(pos_x - 1, pos_y)
elif entrada == 'd':
pos_x, pos_y = limites(pos_x + 1, pos_y)
elif entrada == 's':
pos_x, pos_y = limites(pos_x, pos_y + 1)
elif entrada == 'w':
pos_x, pos_y = limites(pos_x, pos_y - 1)
else:
pass
return pos_x, pos_y
def cursor(stdscr, pos_x, pos_y, x_center):
cursor_y = 9
cursor_x = x_center - 3
if pos_y == 1:
cursor_y += 2
if pos_y == 2:
cursor_y += 4
if pos_x == 1:
cursor_x += 2
if pos_x == 2:
cursor_x += 4
stdscr.move(cursor_y, cursor_x)
def main(stdscr):
# clear screen
reiniciar_tela(stdscr)
width = stdscr.getmaxyx()[1]
x_center = (width - 1) // 2
posicoes = [
[' ', ' ', ' '],
[' ', ' ', ' '],
[' ', ' ', ' ']
]
pos_x, pos_y = 0, 0
fim_da_partida = None
while True:
entrada = stdscr.getkey()
if entrada == 'q':
break
if entrada == 'y':
posicoes = [
[' ', ' ', ' '],
[' ', ' ', ' '],
[' ', ' ', ' ']
]
pos_x, pos_y = 0, 0
fim_da_partida = None
reiniciar_tela(stdscr)
if fim_da_partida is None:
if entrada in ['a', 's', 'w', 'd']:
pos_x, pos_y = espaco_do_tableiro(pos_x, pos_y, entrada)
if entrada == '\n':
jogou, posicoes = jogador(pos_x, pos_y, posicoes)
fim_da_partida = ganhador(posicoes)
if jogou is True and fim_da_partida is None:
posicoes = robo(posicoes)
fim_da_partida = ganhador(posicoes)
if entrada == 'h':
ajuda(stdscr)
else:
tabuleiro(stdscr, posicoes, x_center)
cursor(stdscr, pos_x, pos_y, x_center)
else:
fim_de_jogo(stdscr, fim_da_partida)
def jogador(pos_x, pos_y, posicoes):
if posicoes[pos_y][pos_x] == ' ':
posicoes[pos_y][pos_x] = 'x'
return True, posicoes
return False, posicoes
def ganhador(posicoes):
diagonal1 = [posicoes[0][0], posicoes[1][1], posicoes[2][2]]
diagonal2 = [posicoes[0][2], posicoes[1][1], posicoes[2][0]]
horizontal1 = [posicoes[0][0], posicoes[1][0], posicoes[2][0]]
horizontal2 = [posicoes[0][1], posicoes[1][1], posicoes[2][1]]
horizontal3 = [posicoes[0][2], posicoes[1][2], posicoes[2][2]]
vertical1 = [posicoes[0][0], posicoes[0][1], posicoes[0][2]]
vertical2 = [posicoes[1][0], posicoes[1][1], posicoes[1][2]]
vertical3 = [posicoes[2][0], posicoes[2][1], posicoes[2][2]]
possibilidades = [
diagonal1, diagonal2,
horizontal1, horizontal2, horizontal3,
vertical1, vertical2, vertical3
]
for possibilidade in possibilidades:
gan = total_alinhado(possibilidade)
if gan is not None:
return gan
espaco = False
for i in range(3):
for j in range(3):
if posicoes[i][j] == ' ':
espaco = True
break
if not espaco:
return 'velha'
return None
def total_alinhado(linha):
num_x = linha.count('x')
num_o = linha.count('o')
if num_x == 3:
return 'x'
if num_o == 3:
return 'o'
return None
def fim_de_jogo(stdscr, vencedor):
if vencedor == 'velha':
stdscr.addstr(6, 1, 'Deu velha...')
else:
stdscr.addstr(6, 1, 'O %s venceu..' % (vencedor))
stdscr.addstr(7, 1, 'Pressione Y para jogar novamente ou Q para sair.')
stdscr.refresh()
if __name__ == '__main__':
initscr()
wrapper(main)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment