0
I am working on an old game in Python, and I have 3-level codes (easy, medium and hard) distinct, as it could implement an initial "menu" where the user could choose one of the levels and be immediately directed to the same. And at the end of the game he could choose the level again.
import random
#-------------------------------------------------------------------------------
# Funções utilizadas pelo programa
#-------------------------------------------------------------------------------
# função que atualiza a estrutura de dados que representa as filas de fechamento
#-------------------------------------------------------------------------------
def atualizaFilas():
global lins, cols, dgns
lins = [linha for linha in tabuleiro]
cols = [
[tabuleiro[linha][0] for linha in range(3)], \
[tabuleiro[linha][1] for linha in range(3)], \
[tabuleiro[linha][2] for linha in range(3)] \
]
dgns = [
[tabuleiro[linha][linha] for linha in range(3)],
[tabuleiro[linha][coluna] for linha in range(3)
for coluna in range(3)
if (linha+coluna) == 2]
]
return(lins + cols + dgns)
# função que apresenta jogo ao usuário
#-------------------------------------------------------------------------------
def apresentaJogo():
print(2*'\n')
print('Nesta implementação do Jogo da Velha, as casas do tabuleiro são numeradas da seguinte forma: \n\n' \
' 11 | 12 | 13 \n' \
'----+----+----\n' \
' 21 | 22 | 23 \n' \
'----+----+----\n' \
' 31 | 32 | 33 \n')
print('Ao fazer seu lance, indique em qual dessas casas você quer jogar.')
# função que exibe o tabuleiro
#-------------------------------------------------------------------------------
def exibeTabuleiro():
print()
print(' ' + tabuleiro[0][0] + ' |' + ' ' + tabuleiro[0][1] + ' |' + ' ' + tabuleiro[0][2] + ' \n' \
'---+---+---\n' \
' ' + tabuleiro[1][0] + ' |' + ' ' + tabuleiro[1][1] + ' |' + ' ' + tabuleiro[1][2] + ' \n' \
'---+---+---\n' \
' ' + tabuleiro[2][0] + ' |' + ' ' + tabuleiro[2][1] + ' |' + ' ' + tabuleiro[2][2] + ' \n' )
# função que verifica o fechamento do jogo
#-------------------------------------------------------------------------------
def verificaFechamento():
# seta indicador de fechamento
for fila in filas:
if fila in fechamentos:
status = True
break
else:
status = False
return status
# função que obtém e processa lance do jogador
#-------------------------------------------------------------------------------
def processaLanceJogador():
global filas, jogada, tabuleiro
# contabiliza jogada do jogador
jogada += 1
# exibe lista de casas disponíveis
print('\nNo momento, o tabuleiro está com as seguintes casas disponíveis:\n', \
casasDisponíveis, '\n')
# obtém lance do jogador
while True:
try:
casa = int(input('Em qual delas você quer jogar? '))
if casa not in casasDisponíveis:
raise ValueError
else:
# elimina casa escolhida da relação das casas disponíveis
casasDisponíveis.remove(casa)
break
except ValueError:
print('Você digitou um valor inválido ou uma casa já ocupada. Tente novamente.\n')
# atualiza tabuleiro
tabuleiro[casa//10-1][casa%10-1] = 'X'
# atualiza a estrutura de dados que representa as filas de fechamento
filas = atualizaFilas()
# função que obtém lance do computador
#-------------------------------------------------------------------------------
def processaLanceComputador():
global jogada, filas
# contabiliza jogada do computador
jogada += 1
# gera lance do computador
casa = random.choice(casasDisponíveis)
# elimina casa escolhida da relação das casas disponíveis
casasDisponíveis.remove(casa)
# atualiza tabuleiro
tabuleiro[casa//10-1][casa%10-1] = 'O'
# atualiza a estrutura de dados que representa as filas de fechamento
filas = atualizaFilas()
# inicializa a estrutura de dados que representa o tabuleiro
tabuleiro = [[' ']*3, [' ']*3, [' ']*3]
# define e inicializa a estrutura de dados que representa os padrões de fechamento
fechamentos = [3*['X'], 3*['O']]
# cria lista de casas disponíveis para lance
casasDisponíveis = [i*10+j for i in range(1,4) \
for j in range(1,4) \
if tabuleiro[i-1][j-1] == ' ']
# inicializa a estrutura de dados que representa as filas de fechamento
filas = atualizaFilas()
# seta a condição de encerramento do jogo
jogada, fechou = 0, False
terminar = (jogada == 9) or (fechou == True)
#-------------------------------------------------------------------------------
# Corpo do programa
#-------------------------------------------------------------------------------
# apresenta jogo ao jogador
apresentaJogo()
# enquanto não terminar
while (not terminar):
# processa jogada do jogador
processaLanceJogador()
# verifica Fechamento
fechou = verificaFechamento()
# atualiza sinalizador de encerramento do jogo
terminar = (jogada == 9) or fechou == True
# se for para terminar:
if terminar:
# exibe tabuleiro
exibeTabuleiro()
# termina o jogo
break
# processa jogada do computador
processaLanceComputador()
# verifica Fechamento
fechou = verificaFechamento()
# atualiza sinalizador de encerramento do jogo
terminar = (jogada == 9) or fechou == True
# exibe tabuleiro
exibeTabuleiro()
# em caso de fechamento, verifica vencedor e emite mensagem correspondente:
if fechou:
# se o vencedor for o jogador:
if jogada in [1, 3, 5, 7, 9]:
# emite mensagem de congratulação:
print('Parabéns, você venceu!')
# se o vencedor for o computador:
else:
# emite mensagem de zoação:
print('Você é um pato!')
# se a partida não fechou, emite mensagem de empate
else:
print('Deu velha !')
If your question is just implementing a menu, I suggest using some GUI like Pyqt, Kivy, Tkinter, etc.
– Rogério Dec
But I do not want a graphical interface, I just wanted that when opening the program the user could choose the level and be directed to the same. The ideal would be for the user to type "easy" and be directed to this level. I don’t know if this would be possible with Tkinter
– Renato Silva
This code I posted is the easy level, there are 2 more, "join" the three and apply this initial menu
– Renato Silva
If you don’t want a graphical interface, then use
input
. Ex: https://www.python-course.eu/input.php– Rogério Dec
I wonder how it would work level in the game of old. Technically it is not a game, because two people who know how to play will draw eternally. Only if the algorithm draws first will it lose or not, in different percentages.
– Bacco
@Bacco, I created some time ago an old game in Java, where the player plays against the computer. From there you can define the levels of "cleverness" of the computer...
– Rogério Dec
@Rogériodec, thank you very much, but as I do to interconnect the 3 levels in the same code?
– Renato Silva
You can do what you want by using "smart agents". Don’t worry, it’s AI but it’s nothing out of the world. It is only a modeling, which in case is suitable for your case. One of the agents may be the player, and the other agent the machine that will challenge the player.
– Jefferson Quesado