2010-11-11 7 views
2

Je n'arrive pas à comprendre ce qui se passe ici. J'ai quelques listes mises en place, une pour chaque couleur avec les valeurs RVB correspondantes comme membre, puis la liste, colors [], qui contient chaque liste de couleurs. Ensuite, j'ai une boucle for imbriquée: la boucle externe crée des colonnes de rectangles remplis de couleurs et la boucle interne avance la ligne. Pas compliqué, comme je le vois. J'essaie d'utiliser numdown pour parcourir la liste des couleurs [] de sorte que tous les deux rangs la couleur change pour le membre correspondant dans les couleurs []. Le problème est que lorsque j'utilise le numover de la liste interne, cela fonctionne bien, sauf évidemment que je reçois le mauvais modèle de couleur (les couleurs avancent plutôt que vers le bas). Si j'utilise numdown pour parcourir la liste, seul le membre blanc semble être accédé, même si dans la boucle for interne I 'print (numdown)' ou même 'print (colors [numdown])' la valeur correcte est imprimée .(Python) Liste traversée dans une boucle for imbriquée?

Pourquoi est-ce le cas? Pourquoi si j'utilise le numero de inner-for, le membre de la liste est-il correctement accédé, mais si j'utilise le numdown de outer-for, il se casse?

Il me semble que cela pourrait avoir quelque chose à voir avec pygame, bien que je n'aurais aucune idée de quoi.

(De plus, comme vraiment que je suis juste commençant par Python, si vous voyez quoi que ce soit d'autre valeur de sauter sur, méthode ou style sage, s'il vous plaît ne hésitez pas à le signaler.)

import pygame, sys 
from pygame.locals import * 

#initialize pygame 
pygame.init() 

#assign display window dimensions 
winwidth = 400 
winheight = 700 

#number of rows, number of colums 
numrows = range(1,11) 
numcols = range(1,11) 

#Keeping brick size proportionate to the window size 
brickwidth = winwidth/(len(numrows)) 
brickheight = winheight/4 

#Pixel space above the breakout area 
bricktopspace = winheight/7 

#Set display window width, height 
windowSurface = pygame.display.set_mode((winwidth, winheight), 0, 0) 

brickxcoord = 0 
    blue = [0, 0, 255] 
    green = [0, 255, 0] 
    yellow = [255, 255, 0] 
    red = [255, 0, 0] 
    white = [255, 255, 255] 

    colors = range(0,11)  
    colors[1] = white 
    colors[2] = white 
    colors[3] = red 
    colors[4] = red 
    colors[5] = green 
    colors[6] = green 
    colors[7] = yellow 
    colors[8] = yellow 
    colors[9] = blue 
    colors[10] = blue 

    class Setup(): 

     for numdown in numcols: 

      for numover in numrows: 

       print(numdown) 
       pygame.draw.rect(windowSurface, colors[numdown], (brickxcoord, 
       bricktopspace, brickwidth, brickheight)) 
       brickxcoord = brickxcoord + brickwidth 

      bricktopspace = bricktopspace + brickheight 

class Main(): 

    Setup() 
    pygame.display.update() 
+0

Où sont les nombres numériques et les nombres définis? Pourquoi tout est dans une déclaration de classe?Si vous connaissez la programmation, veuillez lire Dive into Python http://diveintopython.org/, vous épargnerez beaucoup de problèmes. Sinon, vous pourriez vouloir http://learnpythonthehardway.org – stefanw

+0

Ce n'est pas tout le code, juste l'extrait pertinent. numcols et numrows sont en fait définis, ce ne sont que des listes de 1-11. – ryanklee

+1

'for ... in' va itérer sur vos listes en commençant par l'index' 0', pas '1'. Cela pourrait être votre problème. S'il vous plaît poster plus de code. –

Répondre

1

euh ... un peu en retard mais si vous êtes toujours là. Quelque chose comme ça?

J'ai modifié un peu, mais en essayant de garder le plus près de votre structure que possible:

import pygame, sys 
from pygame.locals import * 

#assign display window dimensions 
winwidth = 400 
winheight = 700 

#number of rows, number of colums 
numrows = 10 
numcols = 10 

#Keeping brick size proportionate to the window size 
brickwidth = winwidth/numcols 
brickheight = winheight/numcols 

#initialize pygame 
pygame.init() 
#Set display window width, height 
windowSurface = pygame.display.set_mode((winwidth, winheight), 0, 0) 

#Colours 
blue = [0, 0, 255] 
green = [0, 255, 0] 
yellow = [255, 255, 0] 
red = [255, 0, 0] 
white = [255, 255, 255] 

colours = [white, white, red, red, green, green, yellow, yellow, blue, blue] 

class Setup(): 
    def __init__(self): 
     #Setup nest for loop to generate 2d array of blocks. 
     for y in range(0, numrows): 
      for x in range(0, numcols): 
       #Using modulo to get the different colours for rows, we use y as the changing key 
       col_index = y % len(colours) 
       pygame.draw.rect(windowSurface, colours[col_index], (x*brickwidth, y*brickheight, brickwidth, brickheight)) 

class Main(): 
    Setup() 
    pygame.display.update() 

Parce que vous vouliez un numéro fixe ou les lignes et les colonnes, vous pouvez avoir deux variables indiquant le nombre de lignes et les colonnes dont vous avez besoin. Ensuite, vous les utilisez pour déterminer la taille des blocs comme vous l'avez fait.

J'ai changé les couleurs à la matrice comme suggéré, personnellement c'est comme ça que je le ferais aussi (pour un c'est plus court et vous pouvez le lire comme une séquence). De plus, si vous vouliez changer la séquence, il vous suffit de déplacer les éléments. Enfin, j'ai utilisé deux boucles for qui utilisent les nombres et les numcols comme limites de la plage. Si vous pensez à vos tables de temps, y compris le 0, cela crée une grille parfaite. Considérez simplement la première boucle comme les lignes et la boucle imbriquée comme la colonne.

Eh bien, bonne chance.

+0

merci beaucoup pour le code suggéré. Je vais y jeter un coup d'oeil de plus près demain, mais en l'exécutant tout à l'heure, ça fonctionne comme vous le dites. Pourtant, je me demande pourquoi la variable numover (de la boucle externe) était utilisée avec succès mais pas numdown (à partir de la boucle interne). Merci encore pour votre aide. – ryanklee

+0

Je pense que cela fonctionnait, je viens de remarquer que pour que votre code fonctionne de la même manière, il vous suffit de réinitialiser brickxcoord à 0 lorsque vous sortez de la boucle interne. -.- – Aesphere

3

I ne peut pas dire quoi que ce soit au sujet de la méthode pygame, mais d'une manière plus idiomatiques de déclarer la liste serait

colors = [] 
colors.append(white) 
... 

plutôt que de créer et d'écraser une gamme. Vous pourriez même faire

colors = [white, white, ...] 

mais ce serait probablement une ligne laide. De plus, votre premier élément de liste est toujours à la position "0", donc vous finirez avec une liste qui a les éléments [0, white, white, ...] plutôt que [white, white, ...] depuis que vous commencez à définir les couleurs aux couleurs [1].

+1

Initialement, j'ai déclaré 'colors = [blanc, blanc, ...]' mais je l'ai développé plus tard afin de savoir ce qui était passe. – ryanklee

Questions connexes