Outils pour utilisateurs

Outils du site


nsi:tds:pygame:snake

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
nsi:tds:pygame:snake [2023/05/12 11:43] goupillwikinsi:tds:pygame:snake [2023/05/13 23:57] (Version actuelle) goupillwiki
Ligne 130: Ligne 130:
 # c'est plus simple quand on met les sprites dans des groupes # c'est plus simple quand on met les sprites dans des groupes
 apples = pygame.sprite.Group() # groupe contenant les pommes apples = pygame.sprite.Group() # groupe contenant les pommes
-all = pygame.srpite.Group()    # groupe contenant tous les sprites+all_sprites = pygame.sprite.Group()    # groupe contenant tous les sprites
  
 # ajout de 15 pommes # ajout de 15 pommes
Ligne 138: Ligne 138:
     apple = Apple(x, y) # création de la pomme en x, y     apple = Apple(x, y) # création de la pomme en x, y
     apples.add(apple)   # ajout de la pomme crée dans le groupe des pommes     apples.add(apple)   # ajout de la pomme crée dans le groupe des pommes
-    all.add(apple)      # ajout de la pomme au groupe de tous les sprites+    all_sprites.add(apple)      # ajout de la pomme au groupe de tous les sprites
  
 # lancement d'une boucle assurant le rafraichissement du jeu # lancement d'une boucle assurant le rafraichissement du jeu
Ligne 159: Ligne 159:
  
     # dessine les sprites     # dessine les sprites
-    all.draw(screen)+    all_sprites.draw(screen)
  
     # met à jour l'affichage     # met à jour l'affichage
Ligne 255: Ligne 255:
 # c'est plus simple quand on met les sprites dans des groupes # c'est plus simple quand on met les sprites dans des groupes
 apples = pygame.sprite.Group() # groupe contenant les pommes apples = pygame.sprite.Group() # groupe contenant les pommes
-all = pygame.srpite.Group()    # groupe contenant tous les sprites+all_prites = pygame.sprite.Group()    # groupe contenant tous les sprites
  
 # ajout de 15 pommes # ajout de 15 pommes
Ligne 263: Ligne 263:
     apple = Apple(x, y) # création de la pomme en x, y     apple = Apple(x, y) # création de la pomme en x, y
     apples.add(apple)   # ajout de la pomme crée dans le groupe des pommes     apples.add(apple)   # ajout de la pomme crée dans le groupe des pommes
-    all.add(apple)      # ajout de la pomme au groupe de tous les sprites+    all_sprites.add(apple)      # ajout de la pomme au groupe de tous les sprites
  
 # création de la tête     # création de la tête    
 head = Head(300,200) head = Head(300,200)
-all.add(head)+all_sprites.add(head)
          
 # lancement d'une boucle assurant le rafraichissement du jeu # lancement d'une boucle assurant le rafraichissement du jeu
Ligne 314: Ligne 314:
  
     # dessine les pommes     # dessine les pommes
-    all.draw(screen)+    all_sprites.draw(screen)
  
     # met à jour l'affichage     # met à jour l'affichage
Ligne 326: Ligne 326:
 ===== Il reste à faire... ===== ===== Il reste à faire... =====
  
 +  * ne faire apparaître les pommes qu'alignés sur une grille,
   * adapter le mouvement pour obéir à une logique de grille,   * adapter le mouvement pour obéir à une logique de grille,
   * prévoir les anneaux du serpent et les faire se déplacer convenablement,   * prévoir les anneaux du serpent et les faire se déplacer convenablement,
Ligne 331: Ligne 332:
   * faire perdre quand le serpent touche un bord ou quand il se croque lui-même,   * faire perdre quand le serpent touche un bord ou quand il se croque lui-même,
   * afficher un score   * afficher un score
 +
 +== Aligner sur une grille ==
 +
 +Les pommes on un taille ''Apple.SIZE = 20''. On voudrait qu'elle ne puissent avoir que des coordonnées en 0, 20, 40, 60, ... de sorte qu'elles ne tombent pas sur n'importe quelles coordonnées mais sur une grille.
 +
 +C'est rapide à faire : si ''x'' est  un entier quelconque et qu'on veut le ramener à un multiple de ''Apple.SIZE'', il suffit de faire le calcul ''x -= x % Apple.SIZE'' (ou ''self.SIZE'' si on fait ce calcul depuis l'intérieur de la classe).
 +
 +De la même façon, on désire que le serpent ne puisse tourner que quand il est aligné sur une grille. C'est simple également : il suffit n'autoriser le changement de sens que quand les coordonnées sont multiples de ''SIZE''.
 +
 +<code python>
 +self.rect.x % self.SIZE == 0 and self.rect.y % self.SIZE == 0
 +</code>
 +
 +plusieurs approche sont possibles :
 +  * ne permettre le changement que quand la tête est alignée. Autrement dit une pression sur un bouton est ignorée si elle n'est pas faite au moment de l'alignement,
 +  * enregistrer le dernier bouton appuyé mais n'en tenir compte qu'au prochain alignement.
 +
 +== Créer un anneau ==
 +
 +On peut créer la classe ''Anneau'' dans le module ''snake.py''. L'anneau sera très proche de ''Head''. Voici ce que l'on pourrait faire :
 +  * définir ''class Anneau(Head):'' de sorte que l'anneau hérite de toutes les fonctions de ''Head''.
 +  * modifier la fonction ''__init__'' : quand on crée un anneau, on le superpose avec le dernier anneau du serpent. Cette anneau sera l'anneau précédent. L'anneau créé devra suivre l'anneau précédent d'une certaine façon et devra donc toujours se rappeler son anneau précédent. Un anneau est donc comme une tête qui a un anneau précédent...\\ <code python>
 +def __init__(self, precedent):
 +    super().__init__(precedent.rect.x, precedent.rect.y)
 +    self.precedent = precedent
 +</code>
 +  * enfin modifier la fonction ''update_position'' de façon à, si l'anneau est aligné et si le précédent est à au moins une distance ''SIZE'' d'ajuster la vitesse.\\ <code python>
 +def update_position(self):
 +    # code disant : si aligné
 +    #     si précédent assez loin
 +    #         ajuster la vitesse
 +    super().update_position() # pour le reste, faire comme avec Head
 +</code>
 +
 +
 +
 +
 +
  
nsi/tds/pygame/snake.1683884602.txt.gz · Dernière modification : de goupillwiki