(Python)嵌套forloop中的列表遍历?

2024-05-23 20:31:39 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

问题是,当我使用内部列表的numover时,它工作得很好,除了很明显我得到了错误的颜色模式(颜色前进而不是向下)。如果我使用numdown遍历列表,那么似乎只有white成员可以访问,即使在内部for循环中I“print(numdown)”或甚至“print(colors[numdown])”中打印了正确的值。在

为什么会这样?为什么如果我使用内部for的numbover,列表成员的访问是否正确,但是如果我使用外部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()

Tags: 列表for颜色display成员windowpygameprint
2条回答

呃。。。有点晚了,但如果你还在的话。像这样?在

我做了一点修改,但尽量靠近你的结构:

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,它会创建一个完美的网格。只需将第一个循环视为行,将嵌套循环视为列。在

好吧,祝你好运。在

我不能对pygame方法说什么,但是声明列表的一种更惯用的方法是

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

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

^{pr2}$

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

相关问题 更多 >