2014-06-12 7 views
3

Bon, c'est ma première fois sur ce site, donc j'espère que je comprends bien.Pygame Snake Game

Je fais un jeu de serpent dans Pygame, pour une tâche d'évaluation scolaire, et j'ai un problème. Je suis incapable de faire disparaître les parties du corps du serpent.

Actuellement, voici comment une partie du corps est générée:

def more_body(bodyparts, x, y, z): 
    body = pygame.sprite.Sprite() 
    body.image = pygame.image.load('body.png') 
    body.rect = head.image.get_rect() 
    body.rect.right = x 
    body.rect.top = y 
    body.timeleft = z 
    bodyparts.add(body) 

Le contrôle de la suppression du corps, tel qu'il est, fonctionne comme ça.

for x in bodyparts: 
    body.timeleft -= 1 
    if body.timeleft == 0: 
     body = False 

Bodyparts est, de manière assez évidente, le regroupement pour les parties du corps. C'est un groupe d'images-objets OrderedUpdates.

Le problème est que le code ne semble pas aimer cette solution. Actuellement, l'erreur est répertoriée comme "NameError: nom 'body' n'est pas défini". Si j'essaie de le développer, la coche pour faire référence à bodyparts.body.timeleft au lieu de body.timeleft, j'obtiens plutôt "AttributeError: l'objet 'OrderedUpdates' n'a pas d'attribut 'body'".

J'ai trouvé une deuxième solution. Comme bodyparts est un groupe OrderedUpdates, il devrait être possible de sélectionner et de supprimer des pièces spécifiques en fonction de leur emplacement dans la liste. Par conséquent, les étapes prévues sont les suivantes:

  1. Comparer les len (parties du corps) à une variable précédemment définie.
  2. Si la longueur dépasse la longueur du serpent, supprimez le premier élément ajouté aux parties du corps - je ne suis pas sûr que ce soit le premier ou le dernier.

Mes principales questions sont:

Est-ce une solution viable, et seriez-vous en mesure de fournir le code pour le faire? Est-ce que je peux juste le traiter comme une liste, et le diviser de sorte que l'avant (ou le dos, selon comment ils sont ajoutés) du groupe de bodyparts soit abandonné? Toutes les solutions que vous pourriez fournir seraient d'une grande aide.

Répondre

1
for x in bodyparts: 
    body.timeleft -= 1 
    if body.timeleft == 0: 
     body = False 

Ici, vous itérer sur le groupe de sprite, stocker chaque sprite dans la x variable. Vous ne définissez jamais body, donc une exception est déclenchée.

Même si vous le faisiez, définir body à False ne supprimerait pas par magie l'image-objet du groupe d'images-objets. Pour ce faire, vous avez la méthode remove.

Alors vous devriez changer votre boucle:

for body in bodyparts: 
    body.timeleft -= 1 
    if body.timeleft == 0: 
     bodyparts.remove(body) 

Au lieu d'utiliser un groupe de sprite, vous pouvez également utiliser une simple liste, et supprimer des éléments une fois qu'il est trop grand:

max_len = 4 # current max length of snake 
bodyparts = [] 

def more_body(bodyparts, x, y, z): 
    body = ... 
    bodyparts.append(body) 
    bodyparts=bodyparts[-max_len:] 

En outre, vous devez charger votre image 'body.png' une seule fois et la réutiliser, au lieu de la charger à chaque fois.

+0

Je n'étais pas réellement au courant de la méthode remove. Cela dit, le conflit X-corps aurait dû être évident ...>. Leafsw0rd