Index error: list index out of range

Résolu
Willi - 16 févr. 2024 à 20:20
 arheu - 17 févr. 2024 à 11:06

Bonjour,

Je souhaite créer une carte Minecraft de 11 blocs de 20 pixels sur 11 blocs de 20 pixels mais , n'arrive pas à lancer mon code le voici:

Carte=

[[0,0,0,0,0,0,0,4,5,6,6],[0,0,0,0,0,0,0,4,5,6,6],[0,0,0,0,0,0,0,0,4,5,6],[0,0,0,0,1,0,0,0,4,5,6],[0,0,0,1,1,1,0,0,4,5,6],[0,0,0,0,2,0,0,0,0,4,5],[3,0,0,0,2,0,0,0,0,0,4],[3,3,0,0,0,0,0,1,0,0,0],[3,3,0,0,0,0,1,1,1,0,0],[3,3,3,3,0,0,0,2,0,0,0],[3,3,3,3,3,0,0,2,0,0,0]]

def maps():

 for j in range(0,220,20):

   for i in range(0,220,20):

       if carte[j][i]==0: fill_rect(j,i,20,20,(0,150,0))

       elif carte[j][i]==1: fill_rect(j,i,20,20,(0,175,0))

       elif carte [j][i]==2: fill_rect(j,i,20,20,(100,100,0))

        elif carte[j][i]==3: fill_rect(j,i,20,20,(0,0,100))

        elif carte[j][i]==4: fill_rect(j,i,20,20,(150,150,150))

        elif carte[j][i]==5: fill_rect(j,i,20,20,(100,100,100))

        elif carte[j][i]==6: fill_rect(j,i,20,20,(50,50,50))

maps()

PS:je suis sur calculatrice numworks avec le module Kandinsky 

Merci de votre aide
Android / Chrome 121.0.6167.164

3 réponses

yg_be Messages postés 22792 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 mai 2024 1 467
Modifié le 16 févr. 2024 à 20:57

bonjour,

dans carte[j][i], i et j doivent être plus petits que 11.

def maps():
 for j in range(11):
   for i in range(11):
        if carte[j][i]==0: fill_rect(j*20,i*20,20,20,(0,150,0))
0
Willi_2121 Messages postés 1 Date d'inscription vendredi 16 février 2024 Statut Membre Dernière intervention 17 février 2024
17 févr. 2024 à 07:39

Merci

0

Salut,

Il serait judicieux de passer des arguments à ta fonction de façon à ce que tu n'as pas besoin de la modifier au cas où tu souhaites changer la carte, les dimensions des rectangles ou leurs couleurs.
La carte ne devant pas être modifiée, il est aussi opportun d'utiliser un tuple au lieu d'une liste.

Ce qui pourrait aboutir à :

board = (
    (0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 6),
    (0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 6),
    (0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6),
    (0, 0, 0, 0, 1, 0, 0, 0, 4, 5, 6),
    (0, 0, 0, 1, 1, 1, 0, 0, 4, 5, 6),
    (0, 0, 0, 0, 2, 0, 0, 0, 0, 4, 5),
    (3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 4),
    (3, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0),
    (3, 3, 0, 0, 0, 0, 1, 1, 1, 0, 0),
    (3, 3, 3, 3, 0, 0, 0, 2, 0, 0, 0),
    (3, 3, 3, 3, 3, 0, 0, 2, 0, 0, 0),
)

map_colors = (
    (0, 150, 0),
    (0, 175, 0),
    (100, 100, 0),
    (0, 0, 100),
    (150, 150, 150),
    (100, 100, 100),
    (50, 50, 50),
)


def draw_map(board, colors, cell_width, cell_height):
    line_size = len(board[0])
    for y in range(len(board)):
        for x in range(line_size):
            fill_rect(
                x * cell_width, y * cell_height,
                cell_width, cell_height,
                colors[board[y][x]],
            )

draw_map(board, map_colors, 20, 20)

Utiliser un conteneur pour les couleurs rend la fonction bien plus concise.

On pourrait auusi plutôt qu'utiliser des ranges, se servir de la fonction enumerate de python.

def draw_map(board, colors, cell_width, cell_height):
    for y, line in enumerate(board):
        for x, value in enumerate(line):
            fill_rect(
                x * cell_width, y * cell_height,
                cell_width, cell_height,
                colors[value],
            )
0