Aprenda a incorporar o recurso de salvar e carregar o progresso do jogo para uma experiência de jogo perfeita.

No desenvolvimento de jogos modernos, a capacidade de salvar e carregar o progresso do jogo é um recurso crucial que aprimora a experiência e o envolvimento do usuário. PyGame, uma biblioteca popular para criar jogos 2D em Python, fornece as ferramentas necessárias para implementar o recurso de salvar e carregar sem esforço.

Criando um jogo simples

Antes de começar, certifique-se de ter pip instalado no seu dispositivo. Depois de instalar o pip, execute o comando abaixo para instalar o pygame módulo:

pip instalar pygame

Para ilustrar a implementação de um sistema de salvar e carregar no PyGame, comece criando um jogo simples.

O código usado neste artigo está disponível neste Repositório GitHub e é gratuito para você usar sob a licença do MIT.

Neste jogo, o jogador terá a capacidade de se mover para a esquerda e para a direita. Aqui está um trecho de código de exemplo que demonstra a estrutura básica do jogo:

importar pygame

# Inicializa Pygame
pygame.init()

# Configure a janela do jogo
largura_janela = 800
window_height = 600
window = pygame.display.set_mode((window_width, window_height))
pygame.display.set_caption("Salvar e carregar tutorial do sistema")

# Variáveis ​​do jogo
jogador_x = 400
jogador_y = 500
jogador_velocidade = 5

# Repetição do jogo
correndo = Verdadeiro
enquanto correndo:
para evento em pygame.event.get():
se event.type == pygame. DESISTIR:
correndo = Falso

keys = pygame.key.get_pressed()
se keys[pygame. K_LEFT]:
jogador_x -= jogador_velocidade
se keys[pygame. K_RIGHT]:
jogador_x += jogador_velocidade

# Limpa a tela
window.fill((0, 0, 0))

# Desenhe o jogador
pygame.draw.rect (janela, (255, 255, 255), (jogador_x, jogador_y, 50, 50))

# Atualize a exibição
pygame.display.flip()

# Sair do jogo
pygame.quit()

Gerenciando o estado do jogo e a persistência de dados

Antes de implementar a funcionalidade de salvar e carregar, você precisa estabelecer uma maneira de gerenciar o estado do jogo e manter os dados. Uma abordagem comum é usar um dicionário Python para armazenar os dados relevantes do jogo. Aqui está um exemplo de como você pode modificar o código anterior para incluir o gerenciamento de estado do jogo:

# Variáveis ​​do jogo
estado_jogo = {
'jogador_x': 400,
'player_y': 500
}

# Repetição do jogo
correndo = Verdadeiro
enquanto correndo:
# ...

keys = pygame.key.get_pressed()
se keys[pygame. K_LEFT]:
estado_jogo['jogador_x'] -= jogador_velocidade
se keys[pygame. K_RIGHT]:
estado_jogo['jogador_x'] += player_speed

# ...

pygame.display.flip()

Implementando a Funcionalidade de Salvar e Carregar

Para habilitar salvar e carregar o progresso do jogo, você pode aproveitar o built-in do Python salmoura módulo, que nos permite serializar e desserializar objetos Python. Crie um novo arquivo chamado salvar-jogo.py e adicione o código com as atualizações abaixo:

estado_jogo = {
'jogador_x': jogador_x,
'player_y': player_y
}

# Salve o estado do jogo
defsave_game_state(estado_do_jogo, nome_do_arquivo):
tentar:
com aberto (nome_do_arquivo, 'wb') como arquivo:
pickle.dump (game_state, arquivo)
imprimir("Estado do jogo salvo com sucesso!")
exceto IOError:
imprimir("Erro: não foi possível salvar o estado do jogo.")

# Carrega o estado do jogo
defload_game_state(nome do arquivo):
tentar:
com aberto (nome_do_arquivo, 'rb') como arquivo:
game_state = pickle.load (arquivo)
imprimir("Estado do jogo carregado com sucesso!")
retornar game_state
exceto (IOError, picles. UnpicklingError):
imprimir("Erro: não foi possível carregar o estado do jogo.")

# Repetição do jogo
correndo = Verdadeiro
enquanto correndo:

# ...

keys = pygame.key.get_pressed()
se keys[pygame. K_LEFT]:
jogador_x -= jogador_velocidade
estado_jogo['jogador_x'] = jogador_x
se keys[pygame. K_RIGHT]:
jogador_x += jogador_velocidade
estado_jogo['jogador_x'] = jogador_x

se keys[pygame. K_s]:
salvar_jogo_estado (jogo_estado, 'save_game.pickle')
se keys[pygame. K_l]:
game_state = load_game_state('save_game.pickle')
player_x = game_state['jogador_x']

# ...

# ...

Abaixo está a saída:

Projetando uma interface de usuário para salvar slots

Para fornecer uma interface de salvar e carregar, você pode exibir slots de salvamento que permitem ao jogador escolher qual slot salvar ou carregar. Para este exemplo, as opções são exibidas no console, mas você pode usar Estruturas GUI do Python para criar uma interface mais amigável.

Criar uma save_slots lista que representa os slots de salvamento disponíveis. Além disso, adicione um slot_selecionado variável para acompanhar o slot escolhido pelo jogador.

Mostra os slots de salvamento disponíveis quando o jogador pressiona o botão de salvar (K_s). O jogador pode escolher um slot pressionando a tecla numérica correspondente (K_1, K_2, ou K_3). Se um slot for selecionado, o estado do jogo será salvo em um arquivo com o nome do slot selecionado.

Da mesma forma, quando o jogador pressiona o botão de carregamento (K_l), exibe os slots de salvamento. O jogador pode escolher um slot pressionando as teclas K_a, K_b, ou K_c para carregar o estado do jogo. Como alternativa, você pode usar entradas de toque em vez de entradas de teclado para seleção de slot. Se um slot for selecionado, o estado do jogo será carregado do arquivo correspondente.

Crie um novo arquivo chamado interface.py e adicione o código com as atualizações abaixo:

# Variáveis ​​do jogo
salvar_slots = ['Espaço 1', 'Espaço 2', 'Espaço 3']
slot_selecionado = Nenhum

# Repetição do jogo
correndo = Verdadeiro
enquanto correndo:
para evento em pygame.event.get():
se event.type == pygame. DESISTIR:
correndo = Falso

se event.type == pygame. TECLA PARA BAIXO:
se event.key == pygame. K_s:
# Mostrar slots de salvamento
slot_selecionado = Nenhum
para eu, slot em enumerar (save_slots):
imprimir(f"Salvar espaço {i+1}: {espaço}")
imprimir("Escolha um slot para salvar o jogo.")

se event.key == pygame. K_l:
imprimir("Selecionar Slot:- a - Slot 1, b - Slot 3, c - Slot 3")
# Mostrar slots de salvamento
slot_selecionado = Nenhum
para eu, slot em enumerar (save_slots):
imprimir(f"Salvar espaço {i+1}: {espaço}")
imprimir("Escolha um slot para carregar o jogo.")

se evento.chave em [pygame. K_1, pygame. K_2, pygame. K_3]:
# Salve ou carregue o jogo com base no slot selecionado
slot_index = event.key - pygame. K_1
slot_selecionado = save_slots[slot_index]

salvar_jogo_estado (jogo_estado, f"{slot_selecionado}.salmoura")
imprimir(f"Jogo salvo em {slot_selecionado}!")

se evento.chave em [pygame. K_a, pygame. K_b, pygame. K_c]:

slot_index = event.key - pygame. K_a
slot_selecionado = save_slots[slot_index]
game_state = load_game_state(f"{slot_selecionado}.salmoura")
player_x = game_state['jogador_x']
imprimir(f"Jogo carregado de {slot_selecionado}!")
# ...

pygame.display.flip()

# ...

Abaixo está a saída:

Nenhuma atribuição necessária: captura de tela por Imran

Manipulando Opções de Substituição

Para fornecer opções para substituir salvamentos existentes, você pode implementar uma mensagem de aviso que solicita a confirmação do jogador antes de substituir um arquivo salvo. Crie um novo arquivo chamado substituindo-save.py e modifique o código com as atualizações abaixo:

# Salve o estado do jogo
defsave_game_state(estado_do_jogo, nome_do_arquivo):
se os.path.exists (file_name):
# Solicita confirmação para substituir o arquivo salvo existente
sobrescrever = entrada("Salvar arquivo já existe. Você deseja substituir? (s/n): ")
se overwrite.lower() != 'y':
imprimir("Salvar cancelado.")
retornar

tentar:
com aberto (nome_do_arquivo, 'wb') como arquivo:
pickle.dump (game_state, arquivo)
imprimir("Estado do jogo salvo com sucesso!")
exceto IOError:
imprimir("Erro: não foi possível salvar o estado do jogo.")

# ...

# Carrega o estado do jogo
defload_game_state(nome do arquivo):
senão os.path.exists (file_name):
imprimir("Erro: Salvar arquivo não existe.")
retornarNenhum

tentar:
com aberto (nome_do_arquivo, 'rb') como arquivo:
game_state = pickle.load (arquivo)
imprimir("Estado do jogo carregado com sucesso!")
retornar game_state
exceto (IOError, picles. UnpicklingError):
imprimir("Erro: não foi possível carregar o estado do jogo.")
retornarNenhum

# ...

No código acima, antes de salvar um estado do jogo, você verifica se o arquivo salvo já existe usando os.path.exists(). Em caso afirmativo, você solicita ao player uma confirmação para substituir o arquivo salvo existente. Se o jogador optar por não substituir, a operação de salvamento será cancelada.

Da mesma forma, antes de carregar um estado de jogo, você verifica se o arquivo salvo existe usando os.path.exists(). Caso contrário, você informa o jogador com uma mensagem de erro.

Melhores práticas para salvar e carregar o sistema

Ao implementar um sistema de salvar e carregar no PyGame ou em qualquer projeto de desenvolvimento de jogos, considere as seguintes práticas recomendadas:

  • Use uma estrutura de dados bem definida para representar o estado do jogo e serialize-o usando uma biblioteca de serialização como salmoura. Isso permite que você salve e carregue facilmente todo o estado do jogo.
  • Crie um diretório ou pasta dedicada para armazenar arquivos salvos. Isso ajuda a organizar os arquivos salvos e evita a confusão no diretório principal do jogo.
  • Implemente o tratamento de erros e forneça mensagens de erro informativas para auxiliar na depuração e solução de problemas. Isso ajuda os jogadores a entender quaisquer problemas que possam surgir durante as operações de salvar e carregar.
  • Considere a implementação de vários slots de salvamento para permitir que os jogadores tenham vários jogos salvos. Isso dá aos jogadores a flexibilidade de explorar caminhos diferentes ou reproduzir seções específicas do jogo sem sobrescrever seu progresso.

Torne os jogos mais envolventes com o sistema de salvar e carregar

A adição do recurso de salvar e carregar pode aumentar muito o envolvimento e a diversão de um jogo. Ele permite que os jogadores salvem seu progresso e retornem ao jogo quando quiserem. Além disso, abre possibilidades para a criação de mundos de jogo complexos, onde as escolhas e ações dos jogadores têm consequências duradouras.

Ao implementar um sistema de salvar e carregar, você pode capacitar seus jogadores a terem uma experiência de jogo mais envolvente e satisfatória.