Scopri come incorporare la funzione di salvataggio e caricamento dell'avanzamento del gioco per un'esperienza di gioco senza interruzioni.

Nello sviluppo di giochi moderni, la possibilità di salvare e caricare i progressi del gioco è una caratteristica cruciale che migliora l'esperienza e il coinvolgimento dell'utente. PyGame, una popolare libreria per la creazione di giochi 2D in Python, fornisce gli strumenti necessari per implementare la funzionalità di salvataggio e caricamento senza sforzo.

Creazione di un gioco semplice

Prima di iniziare, assicurati di averlo pip installato sul tuo dispositivo. Dopo aver installato pip, eseguire il comando seguente per installare il file pygame modulo:

pip installa pygame

Per illustrare l'implementazione di un sistema di salvataggio e caricamento in PyGame, inizia creando un semplice gioco.

Il codice utilizzato in questo articolo è disponibile in this Deposito GitHub ed è gratuito per l'uso con la licenza MIT.

In questo gioco, il giocatore avrà la possibilità di muoversi a sinistra ea destra. Ecco uno snippet di codice di esempio che dimostra la struttura di base del gioco:

importare pygame

# Inizializza Pygame
pygame.init()

# Imposta la finestra di gioco
window_width = 800
altezza_finestra = 600
finestra = pygame.display.set_mode((finestra_larghezza, finestra_altezza))
pygame.display.set_caption("Tutorial di sistema di salvataggio e caricamento")

# Variabili di gioco
giocatore_x = 400
giocatore_y = 500
player_speed = 5

# Ciclo di gioco
correre = VERO
Mentre corsa:
per evento In pygame.event.get():
Se event.type == pygame. ESENTATO:
correre = Falso

chiavi = pygame.key.get_pressed()
Se chiavi[pygame. K_SINISTRA]:
player_x -= player_speed
Se chiavi[pygame. K_DESTRA]:
player_x += player_speed

# Cancella lo schermo
finestra.riempimento((0, 0, 0))

# Disegna il giocatore
pygame.draw.rect (finestra, (255, 255, 255), (giocatore_x, giocatore_y, 50, 50))

# Aggiorna il display
pygame.display.flip()

# Esci dal gioco
pygame.quit()

Gestione dello stato del gioco e della persistenza dei dati

Prima di implementare la funzionalità di salvataggio e caricamento, è necessario stabilire un modo per gestire lo stato del gioco e rendere persistenti i dati. Un approccio comune è quello di usa un dizionario Python per memorizzare i dati di gioco rilevanti. Ecco un esempio di come puoi modificare il codice precedente per includere la gestione dello stato del gioco:

# Variabili di gioco
stato_gioco = {
'giocatore_x': 400,
'giocatore_y': 500
}

# Ciclo di gioco
correre = VERO
Mentre corsa:
# ...

chiavi = pygame.key.get_pressed()
Se chiavi[pygame. K_SINISTRA]:
gioco_stato['giocatore_x'] -= player_speed
Se chiavi[pygame. K_DESTRA]:
gioco_stato['giocatore_x'] += player_speed

# ...

pygame.display.flip()

Implementazione della funzionalità di salvataggio e caricamento

Per abilitare il salvataggio e il caricamento dei progressi del gioco, puoi sfruttare il built-in di Python salamoia modulo, che ci permette di serializzare e deserializzare oggetti Python. Crea un nuovo file denominato salva-gioco.py e aggiungi il codice con i seguenti aggiornamenti:

stato_gioco = {
'giocatore_x': giocatore_x,
'giocatore_y': giocatore_y
}

# Salva lo stato del gioco
defsave_game_state(stato_gioco, nome_file):
Tentativo:
con aperto (nome_file, 'wb') COME file:
pickle.dump (game_state, file)
stampa("Stato del gioco salvato con successo!")
tranne IOError:
stampa("Errore: impossibile salvare lo stato del gioco.")

# Carica lo stato del gioco
defload_game_state(nome del file):
Tentativo:
con aperto (nome_file, 'rb') COME file:
game_state = pickle.load (file)
stampa("Stato del gioco caricato con successo!")
ritorno game_state
tranne (IOErrore, sottaceto. UnpicklingError):
stampa("Errore: impossibile caricare lo stato del gioco.")

# Ciclo di gioco
correre = VERO
Mentre corsa:

# ...

chiavi = pygame.key.get_pressed()
Se chiavi[pygame. K_SINISTRA]:
player_x -= player_speed
gioco_stato['giocatore_x'] = giocatore_x
Se chiavi[pygame. K_DESTRA]:
player_x += player_speed
gioco_stato['giocatore_x'] = giocatore_x

Se chiavi[pygame. K_s]:
save_game_state (game_state, 'save_game.pickle')
Se chiavi[pygame. K_l]:
game_state = carica_game_state('save_game.pickle')
player_x = game_state['giocatore_x']

# ...

# ...

Di seguito è riportato l'output:

Progettazione di un'interfaccia utente per gli slot di salvataggio

Per fornire un'interfaccia di salvataggio e caricamento, puoi visualizzare gli slot di salvataggio che consentono al giocatore di scegliere quale slot salvare o caricare. Per questo esempio, le opzioni vengono visualizzate nella console, ma è possibile utilizzarle Framework GUI di Python per creare un'interfaccia più user-friendly.

Creare un save_slot elenco che rappresenta gli slot di salvataggio disponibili. Inoltre, aggiungi a slot_selezionato variabile per tenere traccia dello slot scelto dal giocatore.

Mostra gli slot di salvataggio disponibili quando il giocatore preme il pulsante di salvataggio (K_s). Il giocatore può scegliere uno slot premendo il tasto numerico corrispondente (K_1, K_2, O K_3). Se viene selezionato uno slot, lo stato del gioco viene salvato in un file con il nome dello slot selezionato.

Allo stesso modo, quando il giocatore preme il pulsante di caricamento (K_l), visualizza gli slot di salvataggio. Il giocatore può scegliere uno slot premendo i tasti K_a, K_b, O K_c per caricare lo stato del gioco. In alternativa, puoi utilizzare gli input tattili invece degli input da tastiera per la selezione degli slot. Se viene selezionato uno slot, lo stato del gioco viene caricato dal file corrispondente.

Crea un nuovo file denominato interfaccia.py e aggiungi il codice con i seguenti aggiornamenti:

# Variabili di gioco
save_slot = ["Slot 1", "Slot 2", "Slot 3"]
slot_selezionato = Nessuno

# Ciclo di gioco
correre = VERO
Mentre corsa:
per evento In pygame.event.get():
Se event.type == pygame. ESENTATO:
correre = Falso

Se event.type == pygame. TASTO GIÙ:
Se event.key == pygame. K_s:
# Mostra slot di salvataggio
slot_selezionato = Nessuno
per io, fessura In enumera (save_slot):
stampa(f"Salva slot {i+1}: {fessura}")
stampa("Scegli uno slot per salvare il gioco.")

Se event.key == pygame. K_l:
stampa("Seleziona slot:- a - Slot 1, b - Slot 3, c - Slot 3")
# Mostra slot di salvataggio
slot_selezionato = Nessuno
per io, fessura In enumera (save_slot):
stampa(f"Salva slot {i+1}: {fessura}")
stampa("Scegli uno slot per caricare il gioco.")

Se evento.chiave In [pygame. K_1, pygame. K_2, pygame. K_3]:
# Salva o carica il gioco in base allo slot selezionato
slot_index = event.key - pygame. K_1
slot_selezionato = save_slot[indice_slot]

save_game_state (game_state, F"{slot_selezionato}.salamoia")
stampa(f"Gioco salvato in {slot_selezionato}!")

Se evento.chiave In [pygame. K_a, pygame. K_b, pygame. K_c]:

slot_index = event.key - pygame. K_a
slot_selezionato = save_slot[indice_slot]
game_state = carica_game_state(F"{slot_selezionato}.salamoia")
player_x = game_state['giocatore_x']
stampa(f"Gioco caricato da {slot_selezionato}!")
# ...

pygame.display.flip()

# ...

Di seguito è riportato l'output:

Nessuna attribuzione richiesta: Screenshot di Imran

Gestione delle opzioni di sovrascrittura

Per fornire opzioni per sovrascrivere i salvataggi esistenti, puoi implementare un messaggio di avviso che richiede al giocatore di confermare prima di sovrascrivere un file di salvataggio. Crea un nuovo file denominato sovrascrivendo-save.py e modificare il codice con i seguenti aggiornamenti:

# Salva lo stato del gioco
defsave_game_state(stato_gioco, nome_file):
Se os.percorso.esiste (nome_file):
# Richiedi conferma per sovrascrivere il file di salvataggio esistente
sovrascrivi = input("Il file di salvataggio esiste già. Vuoi sovrascrivere? (s/n): ")
Se overwrite.lower() != 'si':
stampa("Salvataggio annullato.")
ritorno

Tentativo:
con aperto (nome_file, 'wb') COME file:
pickle.dump (game_state, file)
stampa("Stato del gioco salvato con successo!")
tranne IOError:
stampa("Errore: impossibile salvare lo stato del gioco.")

# ...

# Carica lo stato del gioco
defload_game_state(nome del file):
Senon os.percorso.esiste (nome_file):
stampa("Errore: il file di salvataggio non esiste.")
ritornoNessuno

Tentativo:
con aperto (nome_file, 'rb') COME file:
game_state = pickle.load (file)
stampa("Stato del gioco caricato con successo!")
ritorno game_state
tranne (IOErrore, sottaceto. UnpicklingError):
stampa("Errore: impossibile caricare lo stato del gioco.")
ritornoNessuno

# ...

Nel codice sopra, prima di salvare uno stato di gioco, controlli se il file di salvataggio esiste già utilizzando os.percorso.esiste(). In tal caso, chiedi conferma al giocatore per sovrascrivere il file di salvataggio esistente. Se il giocatore sceglie di non sovrascrivere, l'operazione di salvataggio viene annullata.

Allo stesso modo, prima di caricare uno stato di gioco, controlli se il file di salvataggio esiste usando os.percorso.esiste(). In caso contrario, informi il giocatore con un messaggio di errore.

Best practice per il sistema di salvataggio e caricamento

Quando si implementa un sistema di salvataggio e caricamento in PyGame o in qualsiasi progetto di sviluppo di giochi, considerare le seguenti best practice:

  • Usa una struttura dati ben definita per rappresentare lo stato del gioco e serializzalo usando una libreria di serializzazione come salamoia. Ciò ti consente di salvare e caricare facilmente l'intero stato del gioco.
  • Crea una directory o una cartella dedicata per archiviare i file salvati. Questo aiuta a organizzare i file salvati e impedisce di ingombrare la directory principale del gioco.
  • Implementa la gestione degli errori e fornisci messaggi di errore informativi per facilitare il debug e la risoluzione dei problemi. Questo aiuta i giocatori a capire eventuali problemi che possono sorgere durante le operazioni di salvataggio e caricamento.
  • Prendi in considerazione l'implementazione di più slot di salvataggio per consentire ai giocatori di avere più salvataggi di gioco. Ciò offre ai giocatori la flessibilità di esplorare percorsi diversi o riprodurre sezioni specifiche del gioco senza sovrascrivere i propri progressi.

Rendi i giochi più coinvolgenti con il sistema di salvataggio e caricamento

L'aggiunta della funzione di salvataggio e caricamento può migliorare notevolmente il coinvolgimento e il divertimento di un gioco. Consente ai giocatori di salvare i propri progressi e tornare al gioco a loro piacimento. Inoltre, apre la possibilità di creare mondi di gioco complessi, in cui le scelte e le azioni dei giocatori hanno conseguenze durature.

Implementando un sistema di salvataggio e caricamento, puoi consentire ai tuoi giocatori di vivere un'esperienza di gioco più coinvolgente e soddisfacente.