(Python)在嵌套的for循环中列出遍历?

时间:2010-11-11 02:19:53

标签: python pygame

我无法弄清楚这里发生了什么。我已经设置了一些列表,每个颜色一个,相应的RGB值作为其成员,然后列表,colors [],包含每个单独的颜色列表。然后我有一个嵌套的for循环:外部循环创建颜色填充矩形的列,内部循环前进行。我看来并不复杂。

我正在尝试使用numdown遍历colors []列表,以便每两行颜色更改为colors []中对应的成员。

问题在于,当我使用内部列表的numover时,它工作正常,除了显然我得到错误的颜色模式(颜色前进而不是下降)。如果我使用numdown遍历列表,则只会访问成员white,即使在内部for循环中我打印(numdown)'或甚至'print(colors [numdown])'也会打印正确的值。

为什么会这样?为什么我使用inner-for的numover是正确访问的list成员,但是如果我使用outer-for的numdown则会中断?

我觉得这可能与pygame有关,虽然我不知道是什么。

(另外,我真的只是只是从Python开始,如果你看到其他任何值得跳跃,方法或风格的话,请随时指出。)

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()

2 个答案:

答案 0 :(得分:3)

我不能说pygame方法,但是一个更惯用的方式来声明列表

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

而不是创建然后覆盖范围。你甚至可以做

colors = [white, white, ...]

虽然这可能是一条丑陋的线。此外,您的第一个列表元素始终位于“0”位置,因此您将最终得到一个包含元素[0, white, white, ...]而不是[white, white, ...]的列表,因为您开始定义颜色[1]的颜色。

答案 1 :(得分:1)

呃......有点晚了但如果你还在附近。像这样的东西?

我对它进行了一些修改,但试图保持尽可能接近你的结构:

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()

因为您需要修订号或行和列,所以可以使用两个变量来说明所需的行数和列数。然后,您可以使用它们来确定块的大小。

我已按照建议将颜色更改为数组,我个人就是这样做的(如果它更短,你可以将它作为序列读取)。此外,如果您想更改序列,只需移动项目即可。

最后,我使用了两个for循环,使用numrows和numcols作为范围限制。如果你想到你的时间表,包括0,它会创建一个完美的网格。只需将第一个循环视为行,将嵌套循环视为列。

好吧,祝你好运。