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

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 5
    Points : 2
    Points
    2
    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 sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    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
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 5
    Points : 2
    Points
    2
    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
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    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
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 5
    Points : 2
    Points
    2
    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
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    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.

  7. #7
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup pour ton aide, c'est super utile

    J'ai encore une question quand j'ai modifié mon code pour ajouter la partie ou le jeu affiche un message de fin lorsque les monstres sont tous éliminés cependant mon problème de collisions en revenu.

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     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]
                        points1=points1 + 20
                    i=i+1
     
                # COLLISIOns avec les monstres de type 2
                i=0
                reponse=0
                while not reponse and i<len(monster2Rect):
                    if monster2Rect[i].colliderect(missileRect[j]):
                        reponse=1
                        del monster2Rect[i]
                        del missileRect[j]
                        points1=points1 + 10
                    i=i+1
     
                # COLLISIOns avec les monstres de type 3
                i=0
                reponse=0
                while not reponse and i<len(monster3Rect):
                    if monster3Rect[i].colliderect(missileRect[j]):
                        reponse=1
                        del monster3Rect[i]
                        del missileRect[j]
                        points1=points1 + 5
                    i=i+1
     
            j=j+1
    selon les fois ou je lance le jeu il m'affiche
    if monster2Rect[i].colliderect(missileRect[j]):
    IndexError: list index out of range
    ou if monster3Rect[i].colliderect(missileRect[j]):
    IndexError: list index out of range

    Quelle valeurs d'index est dépassé et par quelle liste T_T j'ai vraiment du mal aidez moi, ça fait des heures que j'essaye de résoudre le problèmes

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Normalement, il indique aussi la ligne où l'erreur est déclenchée (ainsi que la liste des appels de fonction). Sinon, vous pouvez utiliser print() pour afficher la valeur de certaines variables.
    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.

  9. #9
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci de votre aide, j'ai réussi à régler mon problèmes de collisions

    J'ai encore besoin d'aide svp : alors j'ai mis une conditions pour afficher un message de fin ainsi que le chrono lorsqu'il n'y a plus de monstres, tout fonctionne très bien mais mon message de fin et le chrono n'apparaissent pas

    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
    27
    28
    29
    30
    # COLLISIOns avec les monstres de type 3
                i=0
                reponse=0
                while not reponse and i<len(monster3Rect):
                    if monster3Rect[i].colliderect(missileRect[j]):
                        reponse=1
                        del monster3Rect[i]
                        del missileRect[j]
                    i=i+1
                j=j+1
                #conditions de fin de jeu
                if (Vmax1 <= 0
                    and Vmax2 <= 0
                    and Vmax3 <= 0):
                    textRect.x = int(largeur/2-0.5*textRect.w)
                    textRect.y = int(hauteur/2-0.5*textRect.h)
                    #affichage messagesde fin de jeu
                    fenetre.blit(text, textRect)
                    fenetre.blit(Win, WinRect)
     
        # déplacement de tous les vaisseaux
        for i in range (0,len(monster1Rect)):
            fenetre.blit(monster1, monster1Rect[i])
        for i in range (0,len(monster2Rect)):
            fenetre.blit(monster2, monster2Rect[i])
        for i in range (0,len(monster3Rect)):
            fenetre.blit(monster3, monster3Rect[i])
        #affichage messagesde fin de jeu
        fenetre.blit(text, textRect)
        fenetre.blit(Win, WinRect)

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