Rendre le jeu complet¶
Pour l’instant, votre jeu fonctionne… mais il ressemble encore à un prototype. On peut jouer, mais il manque des choses essentielles :
- savoir quand la partie commence
- savoir quand elle se termine
- pouvoir rejouer
Dans cette page, on va transformer votre programme en un vrai jeu complet.
Un jeu n’est pas toujours en train de jouer¶
Jusqu’ici, votre jeu était toujours dans le même état : le jeu tourne.
En réalité, un jeu a souvent plusieurs états :
- un menu (ou un écran de départ)
- la partie en cours
- un écran de fin (game over)
On va gérer ça avec une simple variable.
La variable d’état¶
On crée une variable state :
state = "playing"
Par exemple, on pourra utiliser :
"playing""game_over"
Adapter la boucle de jeu à l’état¶
Dans la boucle principale, on ne fait pas la même chose selon l’état.
if state == "playing":
# logique du jeu
elif state == "game_over":
# écran de fin
C’est la même boucle, mais avec des comportements différents.
Détecter la fin de la partie¶
Reprenons le cas classique : une collision avec un obstacle.
Avant, on faisait par exemple :
if player_rect.colliderect(enemy_rect):
print("Collision")
Maintenant, on va dire que la partie est terminée :
if player_rect.colliderect(enemy_rect):
state = "game_over"
À partir de là, on ne met plus à jour le joueur.
Afficher un écran de fin¶
Dans l’état game_over, on peut afficher un écran différent :
if state == "game_over":
screen.fill((10, 10, 10))
Plus tard, on y ajoutera du texte, mais pour l’instant, un fond différent suffit.
Rejouer une partie¶
Pour rejouer, il faut :
- remettre le joueur à sa position de départ
- relancer le jeu
On peut créer une fonction de reset :
def reset_game():
player_rect.x = 100
player_rect.y = 100
Puis écouter une touche :
keys = pygame.key.get_pressed()
if keys[pygame.K_r]:
reset_game()
state = "playing"
Exemple complet : jeu avec game over et restart¶
import pygame
pygame.init()
screen = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()
player_rect = pygame.Rect(100, 100, 50, 50)
enemy_rect = pygame.Rect(400, 250, 80, 80)
speed = 5
state = "playing"
running = True
while running:
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
keys = pygame.key.get_pressed()
if state == "playing":
if keys[pygame.K_LEFT]:
player_rect.x -= speed
if keys[pygame.K_RIGHT]:
player_rect.x += speed
if keys[pygame.K_UP]:
player_rect.y -= speed
if keys[pygame.K_DOWN]:
player_rect.y += speed
if player_rect.colliderect(enemy_rect):
state = "game_over"
elif state == "game_over":
if keys[pygame.K_r]:
player_rect.x = 100
player_rect.y = 100
state = "playing"
screen.fill((30, 30, 30))
pygame.draw.rect(screen, (0, 200, 255), player_rect)
pygame.draw.rect(screen, (255, 80, 80), enemy_rect)
pygame.display.flip()
pygame.quit()
Ce jeu :
- peut être perdu
- affiche un état différent
- peut être relancé en appuyant sur R
C’est officiellement un jeu complet.
Quizz¶
state = "game_over"
if state == "playing":
print("Jeu en cours")
elif state == "game_over":
print("Fin de partie")
Qu’affiche ce programme ?
- Jeu en cours
- *Fin de partie
- Rien
- Une erreur
> Oui j'avais pas d'idées pour le quizz mdr
Exercice pratique¶
Améliorez votre jeu précédent pour :
- Ajouter un état
game_over - Arrêter le gameplay quand le joueur perd
- Afficher un écran de fin (fond différent)
- Permettre de rejouer avec une touche
- Réinitialiser correctement la partie
Bonus :
- Ajoutez un système de nombre de vies
En résumé¶
Vous savez maintenant :
- Ce qu’est un état de jeu
- Utiliser une variable pour gérer plusieurs phases
- Détecter une fin de partie
- Rejouer sans relancer le programme
- Transformer un prototype en vrai jeu
Avec ça, votre jeu a un début, une fin, et une rejouabilité. C’est exactement ce qu’on attend d’un jeu, même très simple.