(Python)嵌套for循环中的列表遍历?
我不知道这里发生了什么。我已经设置了几个列表,每个颜色都有一个列表,其成员是相应的RGB值,然后是包含每个颜色列表的列表colors[]。然后我得到了一个嵌套的for循环:外部循环创建填充颜色的矩形列,而内部循环推进行。在我看来并不复杂 我试图使用numdown遍历colors[]列表,以便每两行颜色都会更改为colors[]中对应的成员 问题是,当我使用内部列表的numover时,它工作得很好,但显然我得到了错误的颜色模式(颜色前进而不是下降)。如果我使用numdown遍历列表,则似乎只访问成员白色,即使在内部for循环中,我“print(numdown)”甚至“print(colors[numdown])打印了正确的值 为什么会这样?为什么如果我使用内部for的numdown,列表成员的numdown会被正确访问,但是如果我使用外部for的numdown,它会断开 我突然想到这可能与pygame有关,尽管我不知道是什么 (此外,实际上我才刚开始学习Python,如果您看到其他值得一提的东西,无论是方法还是风格,请随意指出。)(Python)嵌套for循环中的列表遍历?,python,pygame,Python,Pygame,我不知道这里发生了什么。我已经设置了几个列表,每个颜色都有一个列表,其成员是相应的RGB值,然后是包含每个颜色列表的列表colors[]。然后我得到了一个嵌套的for循环:外部循环创建填充颜色的矩形列,而内部循环推进行。在我看来并不复杂 我试图使用numdown遍历colors[]列表,以便每两行颜色都会更改为colors[]中对应的成员 问题是,当我使用内部列表的numover时,它工作得很好,但显然我得到了错误的颜色模式(颜色前进而不是下降)。如果我使用numdown遍历列表,则似乎只访问成
关于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()