Skip to content

nimcl/pygame-spaceInvaders-gemini

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

pygame-spaceInvaders-gemini

Réplica de space invaders com feedback gerado por IA Para este projeto montei o esqueleto da réplica de space invaders utilizando a biblioteca “pygame”. Durante a partida são coletados dados como: tempo e quantidade de inimigos acertados até a pontuação zerar (a pontuação inicial é 3 e vai aumentando à medida que eu acerto um oponente e diminui quando o oponente me acerta). Os dados de cada partida são convertidos em arquivos .txt e adicionados a uma pasta dentro do meu diretório vscode, para isso utilizei a biblioteca “os” e “uuid”. Tendo os meus dados armazenados, utilizo a API do Gemini para fazer a leitura desses dados e gerar um feedback geral, me dizendo se o jogador aumentou ou diminuiu o seu desempenho ao longo de cada partida e gerando estratégias para o jogo (apesar do jogo ser extremamente limitado é uma função de grande valia para jogos RPG).

import pygame
import random
import time
import os
import uuid
import google.generativeai as genai

pygame.init()

x = 1280
y = 720
fonte = pygame.font.SysFont('arial', 50)
fonte_pequena = pygame.font.SysFont('arial', 30)
logado = False

cenario = pygame.Surface((x, y))
cenario.fill((255, 255, 255))

inimigo = pygame.Surface((100, 70))
inimigo.fill((255, 0, 0))

jogador = pygame.Surface((200, 200))
jogador.fill((0, 0, 255))

tiro = pygame.Surface((50, 20))
tiro.fill((0, 255, 0))

jogador_x = 100
jogador_y = 300
tiro_x = 100
tiro_y = 300
inimigo_x = 500
inimigo_y = 360
pontos = 3
inimigos_derrotados = 0
disparo = False
velocidade_x_tiro = 0
tempo_inicio = time.time()
numero_jogada = 1

tela = pygame.display.set_mode((x, y))
pygame.display.set_caption('Joguinho Python')

cenario = pygame.image.load('imagens/cenario.jpg').convert_alpha()
cenario = pygame.transform.scale(cenario, (x, y))

inimigo = pygame.image.load('imagens/inimigo.png').convert_alpha()
inimigo = pygame.transform.scale(inimigo, (100, 70))

jogador = pygame.image.load('imagens/jogador.png').convert_alpha()
jogador = pygame.transform.scale(jogador, (200, 200))

tiro = pygame.image.load('imagens/missil.png').convert_alpha()
tiro = pygame.transform.scale(tiro, (50, 20))

email_rect = pygame.Rect(50, 50, 400, 50)
senha_rect = pygame.Rect(50, 100, 400, 50)
botao_rect = pygame.Rect(50, 200, 100, 50)
email_active = False
senha_active = False
email = ""
senha = ""
mensagem_erro = ""

numero_jogada = 1

def criar_diretorio(diretorio_usuario):
	diretorio_completo = os.path.join(diretorio_usuario, 'dados_jogadas')
	os.makedirs(diretorio_completo, exist_ok=True)
	return diretorio_completo

def salvar_dados_jogador(diretorio_jogadas, email, pontos, inimigos_derrotados, tempo_jogo, numero_jogada):
	nome_arquivo = f'{uuid.uuid4()}.txt'
  caminho_arquivo = os.path.join(diretorio_jogadas, nome_arquivo)
	with open(caminho_arquivo, 'w') as file:
    	file.write(f'Email: {email}\n')
    	file.write(f'Pontos: {pontos}\n')
    	file.write(f'Inimigos Derrotados: {inimigos_derrotados}\n')
    	file.write(f'Tempo de Jogo: {tempo_jogo:.2f} segundos\n')

def tela_login():
	global email, senha, logado, mensagem_erro, email_active, senha_active
	email_active = False
	senha_active = False
	numero_jogada = 1  
	while not logado:
    	for event in pygame.event.get():
        	if event.type == pygame.QUIT:
            	pygame.quit()
            	exit()
        	if event.type == pygame.KEYDOWN:
            	if event.key == pygame.K_BACKSPACE:
                	if senha_active:
                    	senha = senha[:-1]
                	else:
                    	email = email[:-1]
            	else:
                	if senha_active:
                    	senha += event.unicode
                	else:
                    	email += event.unicode
        	if event.type == pygame.MOUSEBUTTONDOWN:
            	if email_rect.collidepoint(event.pos):
                	email_active = True
                	senha_active = False
            	elif senha_rect.collidepoint(event.pos):
                	senha_active = True
                	email_active = False
            	elif botao_rect.collidepoint(event.pos):
                	if email == "Teste" and senha == "Teste":
                    	logado = True
                	else:
                    	mensagem_erro = "Email ou senha incorretos"

    	tela.fill((255, 255, 255))

    	email_surface = fonte_pequena.render(f'Email: {email}', True, (0, 0, 0))
    	senha_surface = fonte_pequena.render(f'Senha: {"*" * len(senha)}', True, (0, 0, 0))
    	mensagem_surface = fonte_pequena.render(mensagem_erro, True, (255, 0, 0))

    	tela.blit(email_surface, (email_rect.x + 5, email_rect.y + 5))
    	tela.blit(senha_surface, (senha_rect.x + 5, senha_rect.y + 5))
    	tela.blit(mensagem_surface, (50, 150))

    	pygame.draw.rect(tela, (0, 0, 0), email_rect, 2)
    	pygame.draw.rect(tela, (0, 0, 0), senha_rect, 2)
    	pygame.draw.rect(tela, (0, 0, 0), botao_rect, 2)

    	botao_surface = fonte_pequena.render('Login', True, (0, 0, 0))
    	tela.blit(botao_surface, (botao_rect.x + 20, botao_rect.y + 10))

    	pygame.display.flip()

	main(numero_jogada)  


def voltar():
	x = 1350
	y = random.randint(1, 640)
	return [x, y]

def voltar_tiro():
	global disparo, velocidade_x_tiro
	disparo = False
	voltar_tiro_x = jogador_x + 150 
	voltar_tiro_y = jogador_y + 90
	velocidade_x_tiro = 0
	return [voltar_tiro_x, voltar_tiro_y]

def colisao(jogador_rect, inimigo_rect, tiro_rect):
	global pontos, inimigos_derrotados
	if jogador_rect.colliderect(inimigo_rect):
    	pontos -= 1
    	return True
	elif tiro_rect.colliderect(inimigo_rect):
    	pontos += 1
    	inimigos_derrotados += 1
    	return True
	return False

def mostrar_relatorio(diretorio_dados):  
	global pontos, inimigos_derrotados, tempo_jogo, numero_jogada
	tela.fill((255, 255, 255))
	relatorio = [
    	f"Email: {email}",
    	f"Pontos: {pontos}",
    	f"Inimigos Derrotados: {inimigos_derrotados}",
    	f"Tempo de Jogo: {tempo_jogo:.2f} segundos"
	]
	y_offset = 100
	for linha in relatorio:
    	texto_surface = fonte.render(linha, True, (0, 0, 0))
    	tela.blit(texto_surface, (50, y_offset))
    	y_offset += 60
	pygame.display.flip()
	pygame.time.wait(5000)  # Espera 5 segundos antes de fechar
	reiniciar_jogo(numero_jogada, diretorio_dados)  


def reiniciar_jogo(numero_jogada, diretorio_dados):
	global jogador_x, jogador_y, tiro_x, tiro_y, inimigo_x, inimigo_y, pontos, inimigos_derrotados, tempo_inicio, logado, disparo
	numero_jogada += 1  
	jogador_x = 100
	jogador_y = 300
	tiro_x = 100
	tiro_y = 300
	inimigo_x = 500
	inimigo_y = 360
	pontos = 3
	inimigos_derrotados = 0
	tempo_inicio = time.time()
	logado = False  
	disparo = False  
	salvar_dados_jogador(diretorio_dados, email, pontos, inimigos_derrotados, tempo_jogo, numero_jogada)  
	tela_login()  


def main(numero_jogada):  
	global rodando, tempo_fim, jogador_x, jogador_y, tiro_x, tiro_y, inimigo_x, inimigo_y, pontos, inimigos_derrotados, tempo_inicio, velocidade_x_tiro, disparo  
	global disparo, tempo_jogo  
	diretorio_dados = criar_diretorio('C:\\Users\\nicol\\OneDrive\\Área de Trabalho\\codigos_py\\imagens\\dados_do_usuario')
	rodando = True
	tempo_inicio = time.time()
	velocidade_x_tiro = 0  

	jogador_rect = jogador.get_rect()
	inimigo_rect = inimigo.get_rect()
	tiro_rect = tiro.get_rect()

	while rodando:
    	for event in pygame.event.get():
        	if event.type == pygame.QUIT:
            	rodando = False
        	if event.type == pygame.KEYDOWN:
            	if event.key == pygame.K_x:
                	rodando = False

    	tela.blit(cenario, (0, 0))
    	tela.blit(inimigo, (inimigo_x, inimigo_y))
    	tela.blit(tiro, (tiro_x, tiro_y))
    	tela.blit(jogador, (jogador_x, jogador_y))

    	tecla = pygame.key.get_pressed()
    	if tecla[pygame.K_UP] and jogador_y > 1:
        	jogador_y -= 1
        	if not disparo:
            	tiro_y -= 1
    	if tecla[pygame.K_DOWN] and jogador_y < 520:
        	jogador_y += 1
        	if not disparo:
            	tiro_y += 1
    	if tecla[pygame.K_SPACE] and not disparo:
        	disparo = True
        	velocidade_x_tiro = 3
        	tiro_x = jogador_x

    	if pontos < 1:
        	rodando = False

    	if inimigo_x < 0:
        	inimigo_x, inimigo_y = voltar()

    	if tiro_x > 1300:
        	tiro_x, tiro_y = voltar_tiro()

    	if colisao(jogador_rect, inimigo_rect, tiro_rect):
        	inimigo_x, inimigo_y = voltar()

    	jogador_rect.topleft = (jogador_x, jogador_y)
    	tiro_rect.topleft = (tiro_x, tiro_y)
    	inimigo_rect.topleft = (inimigo_x, inimigo_y)

    	tiro_x += velocidade_x_tiro
    	inimigo_x -= 1

    	pygame.draw.rect(tela, (255, 0, 0), jogador_rect, 2)
    	pygame.draw.rect(tela, (255, 0, 0), tiro_rect, 2)
    	pygame.draw.rect(tela, (255, 0, 0), inimigo_rect, 2)

    	score = fonte.render(f'Pontos:{int(pontos)}', True, (0, 0, 0))
    	tela.blit(score, (50, 50))

    	pygame.display.update()
    
    	jogador_rect.x = jogador_x
    	jogador_rect.y = jogador_y
    	tiro_rect.x = tiro_x
    	tiro_rect.y = tiro_y
    	inimigo_rect.x = inimigo_x
    	inimigo_rect.y = inimigo_y
 
    	tiro_x += velocidade_x_tiro
    	inimigo_x -=2

	tempo_fim = time.time()
	tempo_jogo = tempo_fim - tempo_inicio

	salvar_dados_jogador(diretorio_dados, email, pontos, inimigos_derrotados, tempo_jogo, numero_jogada)
	mostrar_relatorio(diretorio_dados)  


genai.configure(api_key="AIzaSyAnD4dhN3Of5E6f_FndVOnmzxaNyzhn1s4")
model = genai.GenerativeModel('gemini-pro')

diretorio_resultados = r"C:\Users\nicol\OneDrive\Área de Trabalho\codigos_py\imagens\dados_do_usuario\dados_jogadas"
arquivos = os.listdir(diretorio_resultados)

def ler_arquivo_txt(caminho_arquivo):
	with open(caminho_arquivo, 'r') as file:
    	linhas = file.readlines()
    	email = linhas[0].split(":")[1].strip()
    	pontos = int(linhas[1].split(":")[1].strip())
    	inimigos_derrotados = int(linhas[2].split(":")[1].strip())
    	tempo_jogo = float(linhas[3].split(":")[1].split()[0].strip())
    	return email, pontos, inimigos_derrotados, tempo_jogo


dados_partidas = []

for arquivo in arquivos:
	if arquivo.endswith(".txt"):
    	caminho_arquivo = os.path.join(diretorio_resultados, arquivo)
    	dados_partida = ler_arquivo_txt(caminho_arquivo)
    	dados_partidas.append(dados_partida)

resumo = []
for email, pontos, inimigos_derrotados, tempo_jogo in dados_partidas:
	resumo.append(f"Jogador: {email}")
	resumo.append(f"Pontos: {pontos}")
	resumo.append(f"Inimigos Derrotados: {inimigos_derrotados}")
	resumo.append(f"Tempo de Jogo: {tempo_jogo:.2f} segundos")
	resumo.append("\n")

 response = model.generate_content(
resumo + ["[END]\n\nFaça um feedback dizendo onde o jogador pode melhorar, e com base nos dados diga se o jogador obteve melhora"]
)

print(response.text)

tela_login()

About

Réplica de space invaders com feedback gerado por IA

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published