Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme "IndexError: tuple index out of range"

Sujet résolu
    24 avril 2016 à 11:17:16

    Voila donc je veux crée un petit jeu. Mais j'ai un probleme pour l'update de mon mob, j'ai cette erreur: IndexError: tuple index out of range

    Programme principale: 

    import pygame,math,os,random
    from pygame.locals import *
    from classes import *
    from constantes import *
    pygame.init()
    
    #Ouverture de la fenêtre et compagnie
    fenetre = pygame.display.set_mode((largeur_fenetre1, hauteur_fenetre1))
    pygame.display.set_caption(titre_fenetre)
    
    #Chargement images et musiques
    menu1 = pygame.image.load(image_menu1).convert()
    menu2 = pygame.image.load(image_menu2).convert()
    arene = pygame.image.load(image_arene).convert()
    
    while continuer == 1:
    	#Menu et actualisation
    	fenetre = pygame.display.set_mode((largeur_fenetre1, hauteur_fenetre1))
    	fenetre.blit(menu1, (0,0))
    	pygame.display.flip()
    	#On remet à 1 à chaque tour de boucle
    	continuer_jeu = 1
    	continuer_menu = 1
    
    	#BOUCLE DE MENU
    	while continuer_menu:
    		#Limitation vitesse boucle
    		pygame.time.Clock().tick(30)
    		for event in pygame.event.get():		
    			#Si l'utilisateur quitte, on met tout à 0
    			if event.type == QUIT or event.type == KEYDOWN and event.key == K_ESCAPE:
    				continuer_menu = 0
    				continuer_jeu = 0
    				continuer = 0
    
    			elif event.type == KEYDOWN and event.key == K_RETURN: #Petite animation pour commencer
    				fenetre.blit(menu2, (0,0))
    				pygame.display.flip()
                                   
    			elif event.type == KEYUP and event.key == K_RETURN:				
    				#Lancement de l'arène
    				continuer_menu = 0	#On quitte le menu
    				continuer_jeu = 1	#On lance la boucle JEU
    				choix = 1
    
    	if choix != 0:
    		#Affichage fond etc...
    		fenetre = pygame.display.set_mode((largeur_fenetre2, hauteur_fenetre2))
    		fenetre.blit(arene, (0,0))
    
    		#Création du perso
    		Pe=Perso(fenetre)
    		Mob1= Mob1(fenetre,Pe)
    		Mob1.create(1)
    		pygame.display.flip()
    	
    	#BOUCLE DE JEU
    	while continuer_jeu:
    		#Limitation vitesse boucle
    		pygame.time.Clock().tick(30)
    		ev = pygame.event.poll()
    		k = pygame.key.get_pressed()
    		for i in (K_DOWN,K_LEFT,K_RIGHT,K_UP,K_SPACE, K_ESCAPE):
    			
    			#Si l'utilisateur quitte, on met tout à 0
    			if k == K_ESCAPE:
    				continuer_jeu = 0
    				continuer = 0
    				
    			elif k[i] and i !=32:
    				Pe.direction = i
    				Pe.index_img = (Pe.index_img+1)%3
    				if Pe.x>=50 and Pe.x<=660:
    					Pe.x += (-k[K_LEFT]+k[K_RIGHT])*Pe.speed
    				else:
    					if Pe.x<50:
    						Pe.x=50
    					if Pe.x>660:
    						Pe.x=660
    					break
    				if Pe.y>=58 and Pe.y<=650:
    					Pe.y += (-k[K_UP]+k[K_DOWN])*Pe.speed
    				else:
    					if Pe.y<58:
    						Pe.y=58
    					if Pe.y>650:
    						Pe.y=650
    					break
    
    				break
    			if k[32]:
    				Pe.index_img=3
    		else: Pe.index_img = 0
    		
    
    		#affichage aux nouvelles positions
    		fenetre.fill(0)
    		fenetre.blit(arene, (0,0))
    		fenetre.blit(Pe.image[Pe.direction][Pe.index_img],(Pe.x,Pe.y))
    		Mob1.update()
    		pygame.display.flip()
    

    Classes: 

    """Classes du jeu"""
    import pygame,math,os,random
    from pygame.locals import *
    from constantes import *
    
    class Perso: #Classe définissant les caractéristique du personnage
    	"""Classe permettant de créer un perso"""
    	def __init__(self, fen):
    		self.perso = pygame.image.load('images/link.png')
    		self.fen=fen
    		self.image = dict([(self.direction,[self.perso.subsurface(self.x,self.y,50,50)for self.x in range(0,200,50)]) for self.direction,self.y in zip((K_RIGHT,K_LEFT,K_UP,K_DOWN),range(0,200,50))])
    		self.x,self.y = 375,375
    		self.xy= self.x,self.y
    		self.direction = K_DOWN
    		self.index_img = 0
    		self.fen.blit(self.image[self.direction][self.index_img],(self.x,self.y))
    		self.speed=8
    
    
    class Mob1(pygame.sprite.Sprite):
    	def __init__(self,fen,mob):
    		pygame.sprite.Sprite.__init__(self)
    		self.anim = (pygame.image.load('images/blob1.png'),pygame.image.load('images/blob2.png'),pygame.image.load('images/blob3.png'))
    		self.fen=fen
    		self.list= list()
    		self.rlist=list()
            
    		self.mob=mob
    		self.speed=1/50
    		self.timerlist=list()
            
    	def create(self,num):
    		for k in range(0,num):
    			self.list.append((random.randint(51,659),random.randint(59,649),random.randint(0,1)))
                    
                    
    	def update(self):
    		lx=1
    		ly=1
    		self.rlist=list()
    		
    		for k in range(0,len(self.list)):
    			lx=lx-self.speed
    			ly=ly-self.speed
    			time= self.list[k][4]
    			if self.list[k][3]<0:
    				self.list.remove(seld.list[k])
    				break
    			if self.list[k][2]==1:
    				anim=0
    			elif self.list[k][2]==0:
    				anim=1
    			elif self.list[k][2]==2:
    				anim=2
    			x=lx*self.list[k][0]+(1-lx)*self.mob.x
    			y=ly*self.list[k][1]+(1-ly)*self.mob.y
    			health=self.list[k][3]
    			rect=self.fen.blit(self.anim[anim],(x,y))
    			if not time== 0:
    				time= time-1
    				l,r = 20,4
    				pygame.draw.rect(self.fen,(0,0,0),Rect((x-2,y-2),(l+4,r+4)))
    				pygame.draw.rect(self.fen,(120,120,120),Rect((x,y),(l,r)))
    				pygame.draw.rect(self.fen, (255,0,0), Rect((x,y),(l*(health/100),r)))
    
    				if time==0:
    					anim=0
    
    				self.rlist.insert(k,rect)
    				self.list.remove(k, (x,y,anim,health,time))
    
    		
    
    
    		
    

    Et voila mon erreur 

    Traceback (most recent call last):
      File "F:\Users\pc bureau\bureau\Projet final\Projet ISN\jeu2.0\Jeuv2.0.py", line 100, in <module>
        Mob1.update()
      File "F:\Users\pc bureau\bureau\Projet final\Projet ISN\jeu2.0\classes.py", line 45, in update
        time= self.list[k][4]
    IndexError: tuple index out of range
    >>> 
    • Partager sur Facebook
    • Partager sur Twitter
      24 avril 2016 à 11:59:30

      Bonjour, le problème est là:

      self.list.append((random.randint(51,659),random.randint(59,649),random.randint(0,1))) #ligne 34

      tu ajoutes a une liste des tuples comprenant 3 éléments

      à la ligne 45: (dans la boucle for qui est codée sans aucun problème, le out of range vient pas de là)

      time= self.list[k][4]

      le k va selectionner le tuple, et dans le tuple tu vas selectionner le 4ème élément: out of range, y'en a que 3 donc les seules valeurs possibles sont 0,1 ou 2 (donc fais attention aux ligne en dessous aussi)

      J'espère avoir pu t'aider, bonne journée à toi =)

      -
      Edité par WexyR 24 avril 2016 à 12:00:47

      • Partager sur Facebook
      • Partager sur Twitter
      Si je suis tête en l'air, c'est par habitude de viser le sommet
        24 avril 2016 à 14:25:58

        Super merci a toi j'ai réussi. 

        • Partager sur Facebook
        • Partager sur Twitter

        Probleme "IndexError: tuple index out of range"

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown