Created
February 14, 2020 23:34
-
-
Save nenodias/380174fd1ac4de3b62088450df7f1032 to your computer and use it in GitHub Desktop.
Jogo da Velha Python
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
| 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