Projet Pacman-like#

Partie 1 : fonctionnalités de base#

Créez et dessinez l'acteur principal pacman au centre de l'écran avec l'image pacman.png. Rappel : l'écran fait 600x600 pixels.

Dans ce jeu, pacman doit se déplacer automatiquement. Appuyer sur une touche permet de changer la direction de ce déplacement automatique.

  • Avant la boucle de jeu, créez deux variables vitesse_x = 0 et vitesse_y = -3 pour contrôler la direction du mouvement.

  • Dans la boucle de jeu, déplacez en tout temps pacman avec move() par rapport à ses deux vitesses.

pacman devrait maintenant avancer continuellement vers le haut et sortir de l'écran.

Permettez à pacman de changer de direction avec les touches WASD.

  • Dans la boucle de jeu, récupérez les touches pressées avec get_pressed_keys().

  • Si la touche A est pressée, changez la direction vers la gauche. Cela signifie que vitesse_x = -3 et vitesse_y = 0

  • Si la touche S est pressée, changez la direction vers le bas : vitesse_x = 0 et vitesse_y = 3

  • Faites de même pour pour les touches W et D.

Vous pouvez maintenant contrôler la direction de pacman qui avance continuellement !

Faisons en sorte que pacman regarde dans la direction où il se déplace.

  • Juste après avoir changé les vitesses avec les touches WASD, utilisez la méthode set_angle() pour orienter pacman :

    • Si vous allez vers la gauche, l'angle est de 90° : pacman.set_angle(90)

    • Si vous allez vers le bas, l'angle est de 180°

    • Vers la droite, l'angle est de 270°

    • Vers le haut, l'angle est de 0°

pacman devrait maintenant tourner pour regarder dans la direction où il se déplace !

pacman doit rebondir sur les bords de l'écran.

  • Si la position horizontale de pacman (pacman.get_x()) est inférieure à 0 OU supérieure à 600, inversez la vitesse horizontale : vitesse_x = -vitesse_x

  • Faites de même avec la position verticale (get_y() et vitesse_y).

pacman devrait maintenant rebondir sur les murs comme une balle de ping-pong !

Faisons apparaître des pommes à ramasser aléatoirement.

  • Avant la boucle de jeu, créez une liste vide pommes = [].

  • Créez également un timer_pommes = Timer(2) et démarrez-le immédiatement avec timer_pommes.start().

  • Dans la boucle de jeu, vérifiez si le timer est terminé (if timer_pommes.is_finished():).

  • Si c'est le cas :

    1. Créez un nouvel acteur pomme avec l'image apple.png. Pour ses positions x et y, à la place de valeurs fixes, utilisez à chaque fois randint(30, 570). Cette fonction permet de tirer un nombre entier aléatoire entre ces deux bornes et donc de placer la pomme aléatoirement sur l'écran.

    2. Ajoutez cette pomme à la liste pommes.

    3. Redémarrez le timer.

  • Utilisez une boucle for dans la boucle de jeu pour dessiner draw() toutes les pommes. Pour chaque pomme dans la liste de pommes : draw cette pomme.

Des pommes devraient apparaître toutes les 2 secondes à des positions aléatoires.

pacman doit pouvoir ramasser les pommes.

  • Avant la boucle de jeu, créez une variable score = 0.

  • Créez également un texte pour afficher le score : txt_score = Text("Score: 0", 70, 30, True, (255, 255, 255), (0, 0, 0)).

  • Dans la boucle de jeu, parcourez la liste des pommes avec une boucle for.

  • Pour chaque pomme, vérifiez si pacman est en collision avec elle : if pacman.collide(pomme):.

  • Si c'est le cas :

    1. Supprimez la pomme de la liste avec remove().

    2. Augmentez le score de 10 : score += 10.

    3. Mettez à jour le texte : txt_score = Text(f"Score: {score}", 70, 30, True, (255, 255, 255), (0, 0, 0)).

  • N'oubliez pas de dessiner draw() le texte du score dans la boucle de jeu.

Les pommes devraient maintenant disparaître quand vous les touchez et le score augmenter !

Créons maintenant un fantôme qui se déplace tout seul.

  • Avant la boucle de jeu, créez un acteur fantôme avec l'image blinky.png à une position aléatoire.

  • Créez deux variables vitesse_fantome_x = 2 et vitesse_fantome_y = 2 pour contrôler le mouvement du fantôme.

  • Dans la boucle de jeu, déplacez le fantôme avec move() de manière similaire à pacman.

  • N'oubliez pas de dessiner draw() le fantôme.

Le fantôme devrait maintenant se déplacer en diagonale et sortir de l'écran.

Le fantôme doit rebondir sur les bords de l'écran, exactement comme pacman.

  • Si la position horizontale du fantôme est inférieure à 0 OU supérieure à 600, inversez-la.

  • Faites de même avec la position verticale.

Le fantôme devrait maintenant rebondir sur les murs et se déplacer partout dans l'écran !

Ajoutons la condition de gameover quand pacman touche le fantôme.

  • Dans la boucle de jeu, vérifiez si pacman est en collision avec le fantôme avec collide(). Si c'est le cas, utilisez la fonction kill() pour détruire pacman

pacman devrait maintenant disparaître lorsqu'il entre en contact avec le fantôme.

async def main():
  while True:
    await refresh((0, 0, 0))

Partie 2 : fonctionnalités intermédiaires#

Les fonctionnalités de la partie 2 valent au maximum 10 pts. Vous pouvez donc choisir des éléments de la liste suivante à implémenter et s'additionnant à 10 pts.

  • (2 pts) Faites accélérer progressivement le fantôme. À chaque fois que pacman ramasse une pomme, augmentez légèrement les vitesses du fantôme (en conservant leur signe) pour rendre le jeu plus difficile.

  • (3 pts) Ajoutez un power-up d'invincibilité. Créez un acteur qui apparaît rarement (timer de 10 secondes). Si pacman le ramasse, il devient invincible pendant 5 secondes (utilisez un timer). Pendant ce temps, faites clignoter pacman et le fantôme ne peut plus le toucher.

  • (4 pts) Ajoutez un système de vies. pacman commence avec 3 vies affichées à l'écran. Toucher un fantôme fait perdre une vie au lieu du gameover immédiat. Après avoir perdu une vie, pacman est invincible pendant 2 secondes. Le gameover n'arrive que lorsque toutes les vies sont perdues.

Partie 3 : fonctionnalités avancées#

  • ...