Skip to content

Commit

Permalink
Organização do codigo e mostrando todos os dados do chunk que o usuar…
Browse files Browse the repository at this point in the history
…io se encontra
  • Loading branch information
EhOMiguel committed Sep 1, 2024
1 parent 156b029 commit ff7d071
Showing 1 changed file with 140 additions and 61 deletions.
201 changes: 140 additions & 61 deletions app/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,18 @@
# Inicializa o Colorama para colorir as strings
init(autoreset=True)

# Utilidade para limpar a tela
def limpar_tela():
os.system('cls' if os.name == 'nt' else 'clear')

def mostrar_texto_gradualmente(texto, cor=Fore.WHITE, velocidade=0.03):
# Função para mostrar texto gradualmente
def mostrar_texto_gradualmente(texto, cor=Fore.CYAN, velocidade=0.03):
for char in texto:
print(cor + char, end='', flush=True)
time.sleep(velocidade)
print()

# Conexão com o banco de dados
def connect_to_db():
return psycopg2.connect(
user="postgres",
Expand All @@ -26,22 +29,18 @@ def connect_to_db():
database="2024_1_Minecraft"
)

# Validação do nick do jogador
def validar_nick(nomeUser):
if re.fullmatch(r'^[a-zA-Z0-9_]{1,10}$', nomeUser):
if re.fullmatch(r'^[a-zA-Z0-9_]{1,30}$', nomeUser):
return True
else:
mostrar_texto_gradualmente(f"Nome de usuário inválido! Use apenas letras, números e sublinhados, com no máximo 10 caracteres.", Fore.RED)
mostrar_texto_gradualmente("Nome de usuário inválido! Use apenas letras, números e sublinhados, com no máximo 10 caracteres.", Fore.RED)
return False

# Criação de um novo jogador
def criar_novo_jogador(cursor, nomeUser):
fome = 20
vida = 20
nivel = 0
exp = 0
cabeca = None
peito = None
pernas = None
pes = None
fome, vida, nivel, exp = 20, 20, 0, 0
cabeca = peito = pernas = pes = None
numero_chunk = random.randint(1, 10000)
missao = 0

Expand All @@ -54,38 +53,30 @@ def criar_novo_jogador(cursor, nomeUser):
(nomeUser, fome, vida, nivel, exp, cabeca, peito, pernas, pes, numero_chunk, missao)
)

# Boas-vindas ao jogador
def dar_boas_vindas(nomeUser, novo_jogador):
limpar_tela()
if novo_jogador:
mostrar_texto_gradualmente(f"Seja bem-vindo ao nosso jogo, {nomeUser}!", Fore.GREEN)
else:
mostrar_texto_gradualmente(f"Seja bem-vindo de volta, {nomeUser}!", Fore.GREEN)

# Calcular movimentos possíveis
def calcular_movimentos_possiveis(chunkAtual):
movimentos = {}

if chunkAtual > 100:
movimentos['norte'] = chunkAtual - 100
else:
movimentos['norte'] = None

if chunkAtual <= 9900:
movimentos['sul'] = chunkAtual + 100
else:
movimentos['sul'] = None

if chunkAtual % 100 != 0:
movimentos['leste'] = chunkAtual + 1
else:
movimentos['leste'] = None

if chunkAtual % 100 != 1:
movimentos['oeste'] = chunkAtual - 1
else:
movimentos['oeste'] = None

return movimentos

# Mover jogador para um novo chunk
def mover_jogador(cursor, nomeUser, direcao, movimentos):
novo_chunk = movimentos.get(direcao)

Expand All @@ -95,20 +86,24 @@ def mover_jogador(cursor, nomeUser, direcao, movimentos):
else:
mostrar_texto_gradualmente(f"Não é possível ir para {direcao.capitalize()}.", Fore.RED)

# Determinar a cor do bioma
def determinar_cor_bioma(bioma):
cores_biomas = {
'Lago': Fore.BLUE,
'Deserto': Fore.YELLOW,
'Floresta': Fore.GREEN,
'Montanhas': Fore.WHITE,
'Planície': Fore.LIGHTGREEN_EX,
'Caverna': Fore.MAGENTA
'Floresta': Fore.GREEN,
'Selva': Fore.LIGHTBLACK_EX,
'Pântano': Fore.MAGENTA,
'Montanha': Fore.WHITE,
'Neve': Fore.LIGHTCYAN_EX,
}
return cores_biomas.get(bioma, Fore.WHITE)

# Função para mostrar a mensagem de localização com bioma colorido
# Mostrar bioma com cor específica
def mostrar_bioma_com_cor(bioma):
cor_bioma = determinar_cor_bioma(bioma)
mostrar_texto_gradualmente("Você está no bioma:", Fore.CYAN)
mostrar_texto_gradualmente("De bioma:", Fore.CYAN)
mostrar_texto_gradualmente(bioma, cor_bioma)

# Função principal do jogo
Expand All @@ -117,34 +112,111 @@ def jogar(cursor, nomeUser):
cursor.execute("SELECT numero_chunk FROM jogador WHERE nome = %s;", (nomeUser,))
result = cursor.fetchone()

if result:
chunkAtual = result[0]
cursor.execute("SELECT * FROM chunk WHERE numero = %s;", (chunkAtual,))
result = cursor.fetchone()
if not result:
mostrar_texto_gradualmente("Jogador não encontrado!", Fore.RED)
break

chunkAtual = result[0]
cursor.execute("SELECT * FROM chunk WHERE numero = %s;", (chunkAtual,))
dadosChunkAtual = cursor.fetchone()

if result:
dadosChunkAtual = result
bioma = dadosChunkAtual[1]
if not dadosChunkAtual:
mostrar_texto_gradualmente("Chunk não encontrado!", Fore.RED)
break

mostrar_bioma_com_cor(bioma)
bioma = dadosChunkAtual[1]

# Consultar tabelas relacionadas
cursor.execute("SELECT nome_fonte FROM instanciafonte WHERE numero_chunk = %s;", (chunkAtual,))
fontes_recursos = cursor.fetchall()

cursor.execute("SELECT nome_mob, id_estrutura FROM instanciamob WHERE numero_chunk = %s;", (chunkAtual,))
mobs_no_chunk = cursor.fetchall()

cursor.execute("SELECT nome_estrutura FROM instanciaestrutura WHERE numero_chunk = %s;", (chunkAtual,))
estruturas_no_chunk = cursor.fetchall()

# Classificar mobs em pacíficos e agressivos
mobs_pacificos = []
mobs_agressivos = []
for mob in mobs_no_chunk:
nome_mob, id_estrutura = mob
if id_estrutura is None: # Só mostrar mobs que não estão em estruturas
cursor.execute("SELECT tipo_mob FROM mob WHERE nome = %s;", (nome_mob,))
tipo_mob = cursor.fetchone()
if tipo_mob:
if tipo_mob[0] == 'pacifico':
mobs_pacificos.append(nome_mob)
elif tipo_mob[0] == 'agressivo':
mobs_agressivos.append(nome_mob)

# Mostrar informações ao jogador
limpar_tela()
mostrar_texto_gradualmente(f"Você está no Chunk {chunkAtual}", Fore.CYAN)
mostrar_bioma_com_cor(bioma)
print()

# Exibir estruturas, se houver
if estruturas_no_chunk:
mostrar_texto_gradualmente("Você vê a seguinte estrutura:", Fore.YELLOW)
for estrutura in estruturas_no_chunk:
mostrar_texto_gradualmente(f" - {estrutura[0]}", Fore.YELLOW)
else:
mostrar_texto_gradualmente("Não há estruturas visíveis aqui.", Fore.YELLOW)
print()

# Exibir mobs pacíficos, se houver
if mobs_pacificos:
mostrar_texto_gradualmente("Mobs pacíficos na área:", Fore.LIGHTGREEN_EX)
for mob in mobs_pacificos:
mostrar_texto_gradualmente(f" - {mob}", Fore.LIGHTGREEN_EX)
else:
mostrar_texto_gradualmente("Nenhum mob pacífico à vista.", Fore.LIGHTGREEN_EX)
print()

# Exibir mobs agressivos, se houver
if mobs_agressivos:
mostrar_texto_gradualmente("Mobs agressivos na área:", Fore.RED)
for mob in mobs_agressivos:
mostrar_texto_gradualmente(f" - {mob}", Fore.RED)
else:
mostrar_texto_gradualmente("Parece tranquilo, nenhum mob agressivo por aqui.", Fore.RED)
print()

# Exibir fontes de recursos, se houver
if fontes_recursos:
mostrar_texto_gradualmente("Fontes de recursos disponíveis:", Fore.CYAN)
for fonte in fontes_recursos:
mostrar_texto_gradualmente(f" - {fonte[0]}", Fore.CYAN)
else:
mostrar_texto_gradualmente("Não há recursos disponíveis neste chunk.", Fore.CYAN)
print()

movimentos = calcular_movimentos_possiveis(chunkAtual)
direcoes_disponiveis = [direcao for direcao, chunk in movimentos.items() if chunk is not None]
mostrar_texto_gradualmente(f"Você pode se mover para: {', '.join(direcoes_disponiveis)}", Fore.CYAN)
# Mostrar direções disponíveis
movimentos = calcular_movimentos_possiveis(chunkAtual)
direcoes_disponiveis = [direcao for direcao, chunk in movimentos.items() if chunk is not None]
mostrar_texto_gradualmente(f"Você pode se mover para: {', '.join(direcoes_disponiveis)}", Fore.CYAN)

direcao = input(f"{Fore.CYAN}Digite a direção para onde deseja se mover (norte, sul, leste, oeste) ou 'sair' para terminar: ").strip().lower()
# Receber comando do jogador
direcao = input(f"{Fore.CYAN}Digite a direção para onde deseja se mover (norte, sul, leste, oeste), 'ajuda' para ver a lista de comandos, ou 'sair' para terminar: ").strip().lower()

if direcao in movimentos:
limpar_tela()
mover_jogador(cursor, nomeUser, direcao, movimentos)
elif direcao == "sair":
break
else:
mostrar_texto_gradualmente(f"Direção inválida! Tente novamente.", Fore.RED)
else:
mostrar_texto_gradualmente(f"Jogador não encontrado!", Fore.RED)
if direcao in movimentos:
limpar_tela()
mover_jogador(cursor, nomeUser, direcao, movimentos)
elif direcao == "sair":
break
elif direcao == "ajuda":
limpar_tela()
mostrar_texto_gradualmente("Comandos disponíveis:", Fore.BLUE)
print(f"{Fore.YELLOW}norte, sul, leste, oeste{Fore.RESET}: para se mover na respectiva direção")
print(f"{Fore.YELLOW}ajuda{Fore.RESET}: para ver esta lista de comandos")
print(f"{Fore.YELLOW}sair{Fore.RESET}: para terminar o jogo")
input(f"{Fore.CYAN}Pressione Enter para continuar o jogo...")
else:
mostrar_texto_gradualmente("Comando inválido! Tente novamente.", Fore.RED)
print()

# Função para iniciar o jogo
def iniciar_jogo(nomeUser):
connection = None
try:
Expand All @@ -171,6 +243,7 @@ def iniciar_jogo(nomeUser):
cursor.close()
connection.close()

# Testar banco de dados
def testar_banco():
connection = None
try:
Expand All @@ -184,6 +257,7 @@ def testar_banco():
mostrar_texto_gradualmente("Tabela de Jogadores:", Fore.YELLOW)
for jogador in jogadores:
mostrar_texto_gradualmente(f"ID: {jogador[0]}, Nome: {jogador[1]}, Fome: {jogador[2]}, Vida: {jogador[3]}, Nível: {jogador[4]}, Chunk: {jogador[9]}, Missão: {jogador[10]}")
print()

input(f"{Fore.CYAN}Pressione Enter para voltar ao menu...")

Expand All @@ -194,7 +268,7 @@ def testar_banco():
cursor.close()
connection.close()


# Mostrar Creeper
def mostrar_creeper(posicao):
creeper = [
"⬛️⬛️⬛️⬛️⬛️⬛️⬛️⬛️⬛️⬛️",
Expand All @@ -218,6 +292,7 @@ def mostrar_creeper(posicao):
for linha in creeper:
print(" " * posicao + linha)

# Explosão do Creeper
def explodir_creeper(posicao):
limpar_tela()
explosao = [
Expand Down Expand Up @@ -248,17 +323,18 @@ def explodir_creeper(posicao):
# Mostrar o letreiro "Minecraft MUD" após a explosão
limpar_tela()
letreiro = """
███╗ ███╗██╗███╗ ██╗███████╗ ██████╗██████╗ █████╗ ███████╗████████╗ ███╗ ███╗██╗ ██╗██████╗
████╗ ████║██║████╗ ██║██╔════╝██╔════╝██╔══██╗██╔══██╗██╔════╝╚══██╔══╝ ████╗ ████║██║ ██║██╔══██╗
██╔████╔██║██║██╔██╗ ██║█████╗ ██║ ██████╔╝███████║█████╗ ██║ ██╔████╔██║██║ ██║██║ ██║
██║╚██╔╝██║██║██║╚██╗██║██╔══╝ ██║ ██╔══██╗██╔══██║██╔══╝ ██║ ██║╚██╔╝██║██║ ██║██║ ██║
██║ ╚═╝ ██║██║██║ ╚████║███████╗╚██████╗██║ ██║██║ ██║██║ ██║ ██║ ╚═╝ ██║╚██████╔╝██████╔╝
╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝╚══════╝ ╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝
"""
███╗ ███╗██╗███╗ ██╗███████╗ ██████╗██████╗ █████╗ ███████╗████████╗ ███╗ ███╗██╗ ██╗██████╗
████╗ ████║██║████╗ ██║██╔════╝██╔════╝██╔══██╗██╔══██╗██╔════╝╚══██╔══╝ ████╗ ████║██║ ██║██╔══██╗
██╔████╔██║██║██╔██╗ ██║█████╗ ██║ ██████╔╝███████║█████╗ ██║ ██╔████╔██║██║ ██║██║ ██║
██║╚██╔╝██║██║██║╚██╗██║██╔══╝ ██║ ██╔══██╗██╔══██║██╔══╝ ██║ ██║╚██╔╝██║██║ ██║██║ ██║
██║ ╚═╝ ██║██║██║ ╚████║███████╗╚██████╗██║ ██║██║ ██║██║ ██║ ██║ ╚═╝ ██║╚██████╔╝██████╔╝
╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝╚══════╝ ╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝
"""
print(Fore.GREEN + letreiro)
time.sleep(2)
limpar_tela()

# Movimentação do Creeper para a direita
def mover_creeper_para_direita():
largura_terminal = os.get_terminal_size().columns
largura_creeper = 10 # A largura do Creeper em emojis
Expand All @@ -280,10 +356,12 @@ def mover_creeper_para_direita():
time.sleep(1)
limpar_tela()

# Tela inicial do jogo
def tela_inicial():
limpar_tela()
mover_creeper_para_direita()
while True:
limpar_tela()
mover_creeper_para_direita()
mostrar_texto_gradualmente("Bem-vindo ao Minecraft MUD!", Fore.MAGENTA)
mostrar_texto_gradualmente("Digite 'iniciar' para começar a jogar, 'ajuda' para ver a lista de comandos, ou 'testar banco' para verificar a tabela de jogadores.", Fore.MAGENTA)

Expand All @@ -296,10 +374,10 @@ def tela_inicial():
elif command == "ajuda":
limpar_tela()
mostrar_texto_gradualmente("Comandos:", Fore.BLUE)
mostrar_texto_gradualmente("iniciar: para começar a jogar", Fore.BLUE)
mostrar_texto_gradualmente("ajuda: para ver a lista de comandos", Fore.BLUE)
mostrar_texto_gradualmente("testar banco: para verificar a tabela de jogadores", Fore.BLUE)
mostrar_texto_gradualmente("exit: para sair do jogo", Fore.BLUE)
print(f"{Fore.YELLOW}iniciar{Fore.RESET}: para começar a jogar")
print(f"{Fore.YELLOW}ajuda{Fore.RESET}: para ver a lista de comandos")
print(f"{Fore.YELLOW}testar banco{Fore.RESET}: para verificar a tabela de jogadores")
print(f"{Fore.YELLOW}exit{Fore.RESET}: para sair do jogo")
input(f"{Fore.CYAN}Pressione Enter para voltar ao menu...")

elif command == "iniciar":
Expand All @@ -314,5 +392,6 @@ def tela_inicial():
else:
mostrar_texto_gradualmente("Comando inválido! Tente novamente.", Fore.RED)

# Execução principal
if __name__ == "__main__":
tela_inicial()

0 comments on commit ff7d071

Please sign in to comment.