Header
🠖 Débuter avec Python

Projet Jeu Vidéo

Un jeu de base

Le code

Exécuter ce code python.
Si le module pygame n'est pas installé, python mentionne une erreur d'importation et arrête l'exécution du code.
Si c'est le cas, installer pygame à l'aide de la commande
pip install pygame
ou en passant par le menu d'ajout de module de l'EDI.
Si la version de python est inférieure à la 3.7, les f-string ne sont pas supportées
Si c'est le cas, remplacer par :
screen.blit(font.render("Score: {}".format(score), True, (255,255,255)), (10,10))
la ligne :
screen.blit(font.render(f"Score: {score}", True, (255,255,255)), (10,10))
import pygame, random
pygame.init()

W, H = 400, 300
screen = pygame.display.set_mode((W, H))
clock = pygame.time.Clock()
font = pygame.font.SysFont(None, 30)

player = pygame.Rect(180, 260, 40, 20)
enemy = pygame.Rect(random.randint(0, W-20), 0, 20, 20)
score = 0
running = True

while running:
    for e in pygame.event.get():
        if e.type == pygame.QUIT:
            running = False

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        player.x -= 5
    if keys[pygame.K_RIGHT]:
        player.x += 5
    player.clamp_ip(screen.get_rect())


    enemy.y += 4
    if enemy.y > H:
        enemy.y = 0
        enemy.x = random.randint(0, W-20)
        score += 1

    if player.colliderect(enemy):
        running = False

    screen.fill((0,0,0))
    pygame.draw.rect(screen, (255,255,255), player)
    pygame.draw.rect(screen, (255,0,0), enemy)
    screen.blit(font.render(f"Score: {score}", True, (255,255,255)), (10,10))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
Débuter avec Python / Projet Jeu vidéo - questions Apprentissage 0x Réussite 0/0
Associer chaque instruction python à son rôle :
import pygame, random
W, H = 400, 300
enemy = pygame.Rect(random.randint(0, W-20), 0, 20, 20)
font = pygame.font.SysFont(None, 30)
Former les bons couples par glisser-déposer ou clics successifs.

Améliorer le code : niveau 1

Déplacement des ennemis

  1. Quelle instruction permet le déplacement vertical de l'ennemi ?
    enemy.y += 4
  2. Ajouter, sur la ligne au dessus de enemy.y += 4 :
    • enemy.x += random.randint(-5, 5)
      Qu'observe-t-on ?
      Le déplacement de l'ennemi devient aléatoire (+ ou - 5 pixels maximum à chaque rafraichissement de l'affichage).

      Effacer cette ligne et la remplacer par :
    • enemy.x += - 2 if player.x < enemy.x else 2
      Qu'observe-t-on ?
      Le déplacement de l'ennemi suit le joueur (+ ou - 2 pixels à chaque rafraichissement de l'affichage).
    On pourra écrire ces deux instructions, ensemble et à la suite pour en combiner les effets et surprendre le joueur.
Débuter avec Python / Projet Jeu vidéo - questions Apprentissage 0x Réussite 0/0/8
L'instruction player.x -= 5 :
déplace qui ?
direction ?
sens ?
Former les bons couples par glisser-déposer ou clics successifs.

Taille de la fenêtre de jeu

  1. Modifier la taille de la fenêtre de jeu (on pourra l'agrandir pour qu'elle occupe une partie plus importante de l'écran) en modifiant les variables H et W.
    On pourra commencer par :
    W, H = 600, 400

    Remarques :
    • Cette écriture est équivalente à :
      W = 600
      H = 400
      On parle d'affectation simultanée (ou multiple)
    • Les variables qui n'ont pas vocation à être changées durant l'éxécution du programme sont mises, par convention, en majuscules.
  2. Repositionner le joueur verticalement en bas de la fenêtre.
    player = pygame.Rect(180, 350, 40, 20)

Déplacement vertical du joueur

Permettre un déplacement vertical pour le joueur.
On pourra utiliser : pygame.K_UP et pygame.K_DOWN.

Modifications du code : niveau 2

Player 2 enters the game

  1. Colorier le joueur 1 en vert pour le différencier du joueur 2 qui sera en bleu.
  2. En plaçant judicieusement les instructions suivantes, transformer le jeu en jeu à deux joueurs :
    • player2 = pygame.Rect(100, 350, 40, 20)
    • player2.clamp_ip(screen.get_rect())
    • if keys[pygame.K_a]: player2.x -= 5
      if keys[pygame.K_d]: player2.x += 5
      et d'autres instructions pour les déplacements verticaux ;
      ⚠️ Pygame utilise le clavier QWERTY ! On utilisera les touches coloriées en orange pour les déplacements du joueur 2.
      Clavier QWERTY :
      Q W E R T Y U I O P
      A S D F G H J K L M
      W X C V B N M
    • pygame.draw.rect(screen, (0,0,255), player2)
    • if player.colliderect(enemy) or player2.colliderect(enemy):
  3. Pour être équitable, le joueur 2 doit aussi être attaqué ; si l'ennemi est plus proche du joueur 2, faire en sorte qu'il se dirige vers lui.
    abs(a-b) mesure la distance entre les valeurs a et b

Le son

  1. Ajouter de la musique en insérant les lignes suivantes (avant la création des rectangles joueurs 1 et 2) :
    pygame.mixer.init()
    pygame.mixer.music.load("music.mp3")
    pygame.mixer.music.play()
    Adapter le nom du fichier musical qui devra être mis dans le même dossier que le script du jeu.
  2. Rajouter des bruitages (on pourra visiter lasonotheque.org) :
    • Charger les fichier «bruitages», au format wav juste à la suite du code précédent permettant de charger la musique, en les affectant à une variable, par exemple :
      son_bonus = pygame.mixer.Sound("bonus.wav")
    • Dans le programme, à l'endroit judicieux (par exemple lorsque le score augmente), j ouer le son avec :
      son_explosion.play()
      . Il est bien sur préférable d'utiliser plusieurs sons.
      Remarque : Pour un son de «Game Over», il peut être judicieux de faire une pause de la longueur correspondant au son avant de quitter : par exemple,
      pygame.time.delay(2000)
      fait une pause de 2000 millisecondes.

Le fond

Ajouter une image de fond :
  • Charger l'image (avant d'entrer dans la boucle ; le fichier doit être dans le même dossier que le programme) :
    bg_image = pygame.image.load("background_image_2.jpg")
  • Dans la boucle, rafraichir l'image de fond après screen.fill((0,0,0)) :
    screen.blit(bg_image, (0, 0))

Les «vies»

Ajouter un compteur de vies (au choix : pour chaque joueur avec affichage, ou partagé par les 2 joueurs.

Améliorations et style : niveau 3

⭐⭐⭐ Faire en sorte que le nombre d'ennemis augmente en fonction du temps, ou qu'ils grossissent en fonction du temps.
⭐⭐⭐⭐ Faire défiler l'image de fond (scrolling) et ajouter des images pour chaque joueur et ennemi, au lieu de rectangles de couleurs. On pourra utiliser la documentation de pygame
⭐⭐⭐⭐⭐ Faire en sorte que les joueurs puissent éliminer les ennemis en tirant dessus.