我无法弄清楚这里发生了什么。我已经设置了一些列表,每个颜色一个,相应的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()
答案 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,它会创建一个完美的网格。只需将第一个循环视为行,将嵌套循环视为列。
好吧,祝你好运。