nsi:tds:pygame:snake
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Prochaine révision | Révision précédente | ||
| nsi:tds:pygame:snake [2023/05/12 11:20] – créée goupillwiki | nsi:tds:pygame:snake [2023/05/13 23:57] (Version actuelle) – goupillwiki | ||
|---|---|---|---|
| Ligne 78: | Ligne 78: | ||
| Cette fonction spéciale (en Python, les '' | Cette fonction spéciale (en Python, les '' | ||
| - | Quand on va créer un objet '' | + | Quand on va créer un objet '' |
| Dans toutes les fonctions de la classe (on dit des méthodes), '' | Dans toutes les fonctions de la classe (on dit des méthodes), '' | ||
| 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_sprites = pygame.sprite.Group() | ||
| # ajout de 15 pommes | # ajout de 15 pommes | ||
| Ligne 136: | Ligne 137: | ||
| y = randrange(100, | y = randrange(100, | ||
| 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(candy) # 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_sprites.add(apple) | ||
| # lancement d'une boucle assurant le rafraichissement du jeu | # lancement d'une boucle assurant le rafraichissement du jeu | ||
| Ligne 156: | Ligne 158: | ||
| running = False # permet la fin de la boucle | running = False # permet la fin de la boucle | ||
| - | # dessine les pommes | + | # dessine les sprites |
| - | | + | |
| # met à jour l' | # met à jour l' | ||
| Ligne 170: | Ligne 172: | ||
| Avec le module '' | Avec le module '' | ||
| + | |||
| + | ==== La tête du serpent ==== | ||
| + | |||
| + | On va se contenter pour l' | ||
| + | |||
| + | <code python> | ||
| + | # fichier snake.py | ||
| + | import pygame | ||
| + | |||
| + | class Head(pygame.sprite.Sprite): | ||
| + | COLOR = (0, 255, 0) | ||
| + | SIZE = 20 | ||
| + | VELOCITY = 2 # vitesse du serpent | ||
| + | def __init__(self, | ||
| + | super().__init__() | ||
| + | self.image = pygame.Surface((self.SIZE, | ||
| + | self.image.fill(self.COLOR) | ||
| + | self.rect = self.image.get_rect() | ||
| + | self.rect.x = x | ||
| + | self.rect.y = y | ||
| + | self.vx = 0 | ||
| + | self.vy = 0 | ||
| + | |||
| + | def move_up(self): | ||
| + | # amorce un mouvement vers le haut | ||
| + | # attention, sur l' | ||
| + | if self.vy > 0: | ||
| + | # interdit d' | ||
| + | return | ||
| + | self.vy = - self.VELOCITY | ||
| + | self.vx = 0 | ||
| + | |||
| + | def move_down(self): | ||
| + | # amorce un mouvement vers le haut | ||
| + | # attention, sur l' | ||
| + | if self.vy < 0: | ||
| + | # interdit d' | ||
| + | return | ||
| + | self.vy = self.VELOCITY | ||
| + | self.vx = 0 | ||
| + | |||
| + | def move_left(self): | ||
| + | if self.vx > 0: | ||
| + | # interdit d' | ||
| + | return | ||
| + | self.vx = - self.VELOCITY | ||
| + | self.vy = 0 | ||
| + | |||
| + | def move_right(self): | ||
| + | if self.vx < 0: | ||
| + | # interdit d' | ||
| + | return | ||
| + | self.vx = self.VELOCITY | ||
| + | self.vy = 0 | ||
| + | |||
| + | def update_position(self): | ||
| + | # modifie les coordonnees selon la vitesse en cours | ||
| + | self.rect.x += self.vx | ||
| + | self.rect.y += self.vy | ||
| + | </ | ||
| + | |||
| + | ==== Le main avec la tête de serpent ==== | ||
| + | |||
| + | ==== Le main avec les récompenses ==== | ||
| + | |||
| + | <code python> | ||
| + | # fichier main.py | ||
| + | import pygame | ||
| + | from random import randrange | ||
| + | pygame.init() # initialisation de pygame | ||
| + | |||
| + | from apple import Apple | ||
| + | from snake import Head | ||
| + | |||
| + | clock = pygame.time.Clock() # Pour contrôler la vitesse d' | ||
| + | |||
| + | # création de la zone de dessin | ||
| + | WIDTH = 600 | ||
| + | HEIGHT = 500 | ||
| + | screen = pygame.display.set_mode((WIDTH, | ||
| + | |||
| + | # c'est plus simple quand on met les sprites dans des groupes | ||
| + | apples = pygame.sprite.Group() # groupe contenant les pommes | ||
| + | all_prites = pygame.sprite.Group() | ||
| + | |||
| + | # ajout de 15 pommes | ||
| + | for i in range(15): | ||
| + | x = randrange(100, | ||
| + | y = randrange(100, | ||
| + | apple = Apple(x, y) # création de la pomme en x, y | ||
| + | apples.add(apple) | ||
| + | all_sprites.add(apple) | ||
| + | |||
| + | # création de la tête | ||
| + | head = Head(300, | ||
| + | all_sprites.add(head) | ||
| + | | ||
| + | # lancement d'une boucle assurant le rafraichissement du jeu | ||
| + | running = True | ||
| + | BLACK = (0,0,0) # couleur noire | ||
| + | while running: | ||
| + | clock.tick(60) # limite a 60 fps (frames per second) | ||
| + | |||
| + | # remplit le fond en noir pour créer la prochaine image | ||
| + | screen.fill(BLACK) | ||
| + | |||
| + | # La gestion des éléments du jeu aura lieu ici : déplacement du personnage | ||
| + | # apparition des bonbons, etc. | ||
| + | |||
| + | for event in pygame.event.get(): | ||
| + | # parcours les événements qui se sont produit | ||
| + | if event.type == pygame.QUIT: | ||
| + | # c'est un événement de type fermeture de fenêtre | ||
| + | running = False # permet la fin de la boucle | ||
| + | |||
| + | # récupère la liste des états des touches | ||
| + | keys = pygame.key.get_pressed() | ||
| + | if keys[pygame.K_LEFT] and not keys[pygame.K_RIGHT]: | ||
| + | # la touche flèche gauche est appuyée mais pas la flèche droite | ||
| + | head.move_left() | ||
| + | elif keys[pygame.K_RIGHT] and not keys[pygame.K_LEFT]: | ||
| + | # la touche flèche droite est appuyée | ||
| + | head.move_right() | ||
| + | if keys[pygame.K_UP] and not keys[pygame.K_DOWN]: | ||
| + | # la touche flèche haut est appuyée mais pas la flèche bas | ||
| + | head.move_up() | ||
| + | elif keys[pygame.K_DOWN] and not keys[pygame.K_UP]: | ||
| + | # la touche flèche bas est appuyée mais pas la flèche haut | ||
| + | head.move_down() | ||
| + | |||
| + | # met à jour la tête | ||
| + | head.update_position() | ||
| + | |||
| + | # la tête touche-t-elle une pomme ? | ||
| + | # l' | ||
| + | hits = pygame.sprite.spritecollide(head, | ||
| + | n = len(hits) | ||
| + | # pour l' | ||
| + | if n > 0: | ||
| + | print(" | ||
| + | |||
| + | # dessine les pommes | ||
| + | all_sprites.draw(screen) | ||
| + | |||
| + | # met à jour l' | ||
| + | pygame.display.flip() | ||
| + | |||
| + | |||
| + | # boucle finie | ||
| + | pygame.quit() # lance la fermeture de la fenêtre | ||
| + | </ | ||
| + | |||
| + | ===== Il reste à faire... ===== | ||
| + | |||
| + | * ne faire apparaître les pommes qu' | ||
| + | * adapter le mouvement pour obéir à une logique de grille, | ||
| + | * prévoir les anneaux du serpent et les faire se déplacer convenablement, | ||
| + | * augmenter la taille du serpent à mesure qu'il mange, | ||
| + | * faire perdre quand le serpent touche un bord ou quand il se croque lui-même, | ||
| + | * afficher un score | ||
| + | |||
| + | == Aligner sur une grille == | ||
| + | |||
| + | Les pommes on un taille '' | ||
| + | |||
| + | C'est rapide à faire : si '' | ||
| + | |||
| + | 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' | ||
| + | |||
| + | <code python> | ||
| + | self.rect.x % self.SIZE == 0 and self.rect.y % self.SIZE == 0 | ||
| + | </ | ||
| + | |||
| + | 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' | ||
| + | * enregistrer le dernier bouton appuyé mais n'en tenir compte qu'au prochain alignement. | ||
| + | |||
| + | == Créer un anneau == | ||
| + | |||
| + | On peut créer la classe '' | ||
| + | * définir '' | ||
| + | * modifier la fonction '' | ||
| + | def __init__(self, | ||
| + | super().__init__(precedent.rect.x, | ||
| + | self.precedent = precedent | ||
| + | </ | ||
| + | * enfin modifier la fonction '' | ||
| + | def update_position(self): | ||
| + | # code disant : si aligné | ||
| + | # si précédent assez loin | ||
| + | # | ||
| + | super().update_position() # pour le reste, faire comme avec Head | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
nsi/tds/pygame/snake.1683883258.txt.gz · Dernière modification : de goupillwiki
