IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation multimédia/Jeux Python Discussion :

Space invaders et collisions : list index out of range


Sujet :

Programmation multimédia/Jeux Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 5
    Par défaut Space invaders et collisions : list index out of range
    Bonjour

    J'ai crée un Space invaders "à ma sauce" tout fonctionnait très bien jusqu'à ce que je prenne en compte les collisions entre mes missiles et mes monstres. Python me signale "list index out of range" dès que j'utilise collideRect
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    # déclenchement d'un nouveau tir de missile dans la liste de missiles
       if touches[K_SPACE]:
           tir.append(1)
           missileRect.append(missile.get_rect())
           j=len(missileRect)-1
           # initialisation missile
           missileRect[j].x = fusee1Rect.x+int(fusee1Rect.w/2)-int(missileRect[j].w/2)
           missileRect[j].y = fusee1Rect.y-missileRect[j].h   
       # déplacement de tous les missiles
       j=0
       while j<len(missileRect):
           if tir[j]==1:
               missileRect[j].y=missileRect[j].y-DYm
               # sortie d'écran du missile et suppression de la liste de missiles
               # Affichage du missile
               fenetre.blit(missile, missileRect[j])
               # COLLISIOns avec les monstres de type 1
               i=0
               reponse=0
               while not reponse and i<len(monster1Rect):
                   if monster1Rect[i].colliderect(missileRect[j]):
                       reponse=1
                       del monster1Rect[i]
                       del missileRect[j]
     
                   i=i+1


    Cependant je ne vois pas du tout où est l'erreur dans mon codage T_T)

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 790
    Par défaut
    Salut,

    Citation Envoyé par Cassandra810 Voir le message
    Cependant je ne vois pas du tout où est l'erreur dans mon codage T_T)
    Prenez une liste de longueur 2:
    Si vous faites une boucle du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >>> for i in range(len(L)):
    qui détruit L[i], à chaque itération la liste devient plus petite... et l'index va déborder:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...     del L[i]
    ...
    Traceback (most recent call last):
      File "<stdin>", line 2, in <module>
    IndexError: list assignment index out of range
    >>>
    Une solution (peut être pas applicable à votre cas) serait de parcourir la liste "à l'envers":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> for i in range(len(L)-1, -1, -1):
    ...     del L [i]
    ...
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 5
    Par défaut
    Merci de votre réponse, mais j'ai du mal à comprendre comment parcourir un liste "à l'envers" ^^'

    L'une de mes anciennes version de mon jeux fonctionne et détruit chaque monstre sans problème du coup je garderais celle là en attendant
    Je vais un peu en profiter et vous posez une autre question, j'aimerais que lorsqu'il n'y a plus de monstres un message du type "vous avez gagné" s'affiche sur ma fenêtre graphique comment est ce possible ?

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 163
    Billets dans le blog
    153
    Par défaut
    Bonjour,

    C'est possible en testant le nombre de monstres.
    ou, si vous utilisez une liste :
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 5
    Par défaut
    Merci beaucoup little white ça me sera super utile!

    Je vais encore un peu profité de vos connaissances et vous posez dernière une question

    pour les tirs de ma fusée j'ai fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    if touches[K_SPACE]:
           tir.append(1)
           missileRect.append(missile.get_rect())
           j=len(missileRect)-1
           # initialisation missile
           missileRect[j].x = fusee1Rect.x+int(fusee1Rect.w/2)-int(missileRect[j].w/2)
           missileRect[j].y = fusee1Rect.y-missileRect[j].h   
       # déplacement de tous les missiles
       j=0
       while j<len(missileRect):
           if tir[j]==1:
               missileRect[j].y=missileRect[j].y-DYm
               # sortie d'écran du missile et suppression de la liste de missiles
               # Affichage du missile
               fenetre.blit(missile, missileRect[j])
    Qui fonctionne très bien et envoie des missiles tant que j'appuie sur espace et j'aimerais le modifier pour qu'il envoie un seul missile et que j'ai à re-cliquer sur espace pour qu'il en envoit un autre.
    Est ce qu'il existe une fonction sur pygame qui permet de faire ça ?

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 163
    Billets dans le blog
    153
    Par défaut
    Oui, bien sûr. Lors du premier tir, il faudra sauvegarder le temps actuel (du programme). Ensuite, lorsque l'utilisateur appuie toujours et que le temps actual - le temps sauvegarder est toujours plus petit qu'un certain délai, alors on ne fait pas le tir.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. besoin d aide urgent code C++ merci bp
    Par adomri dans le forum C++
    Réponses: 2
    Dernier message: 05/07/2007, 18h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo