Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
(Python)嵌套for循环中的列表遍历?_Python_Pygame - Fatal编程技术网

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

(Python)嵌套for循环中的列表遍历?,python,pygame,Python,Pygame,我不知道这里发生了什么。我已经设置了几个列表,每个颜色都有一个列表,其成员是相应的RGB值,然后是包含每个颜色列表的列表colors[]。然后我得到了一个嵌套的for循环:外部循环创建填充颜色的矩形列,而内部循环推进行。在我看来并不复杂 我试图使用numdown遍历colors[]列表,以便每两行颜色都会更改为colors[]中对应的成员 问题是,当我使用内部列表的numover时,它工作得很好,但显然我得到了错误的颜色模式(颜色前进而不是下降)。如果我使用numdown遍历列表,则似乎只访问成

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

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

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

为什么会这样?为什么如果我使用内部for的numdown,列表成员的numdown会被正确访问,但是如果我使用外部for的numdown,它会断开

我突然想到这可能与pygame有关,尽管我不知道是什么

(此外,实际上我才刚开始学习Python,如果您看到其他值得一提的东西,无论是方法还是风格,请随意指出。)


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

colors = []
colors.append(white)
...
而不是创建然后覆盖一个范围。你甚至可以

colors = [white, white, ...]

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

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

我对其进行了一些修改,但试图尽可能接近您的结构:

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


祝你好运。

numcols和numrows的定义在哪里?为什么所有内容都在类声明中?如果您了解编程,请阅读深入Python,这将为您省去很多麻烦。如果不是,您可能想知道这不是所有的代码,只是相关的代码片段。numcols和numrows实际上是定义的,它们只是范围为1-11的列表。
for。。。在
中,将以索引
0
开始迭代列表,而不是
1
。那可能是你的问题。请发布更多的代码。@Frédéric,在我最近的编辑之前,它并不明显,但索引从1开始。最初我确实声明了“colors=[white,white,…”,但后来扩展了,以了解发生了什么。非常感谢您提供的建议代码。明天我会更仔细地看一看,但现在运行它,它的性能确实如您所说。尽管如此,我还是想知道为什么变量numover(来自外部循环)得到了成功的使用,而不是numdown(来自内部循环)。再次感谢您的帮助。我认为这是可行的,我只是注意到,要使您的代码以同样的方式工作,您只需在中断内部循环时将brickxcoord重置为0。--
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()