(Python) Список обхода во вложенном цикле for? - PullRequest
2 голосов
/ 11 ноября 2010

Я не могу понять, что здесь происходит.У меня настроено несколько списков, по одному для каждого отдельного цвета с соответствующими значениями RGB в качестве его члена, а затем список colors [], который содержит каждый отдельный список цветов.Затем у меня есть вложенный цикл for: внешний цикл создает столбцы заполненных цветом прямоугольников, а внутренний цикл продвигает строку.Не сложно, как я вижу.

Я пытаюсь использовать numdown, чтобы пройти список цветов [] так, чтобы каждые две строки цвет менялся на член, соответствующий цветам [].

Проблема в том, что, когда я использую нумерацию внутреннего списка, он работает нормально, за исключением того, что, очевидно, я получаю неправильный образец цвета (цвета продвигаются вперед, а не вниз).Если я использую numdown для обхода списка, кажется, что доступен только белый элемент, даже если во внутреннем цикле for я «print (numdown)» или даже «print (colors [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 ]

3 голосов
/ 11 ноября 2010

Я ничего не могу сказать о методе pygame, но более идиоматическим способом объявить список будет

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

вместо создания, а затем перезаписи диапазона. Вы могли бы даже сделать

colors = [white, white, ...]

хотя это, вероятно, будет ужасной чертой. Кроме того, ваш первый элемент списка всегда находится в позиции «0», поэтому вы получите список, содержащий элементы [0, white, white, ...], а не [white, white, ...], поскольку вы начинаете определять цвета в цветах [1].

1 голос
/ 11 ноября 2010

э-э ... немного поздно, но если ты все еще рядом. Как то так?

Я немного его изменил, но стараюсь максимально приблизиться к вашей структуре:

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

Поскольку вам нужен фиксированный номер или строки и столбцы, у вас может быть две переменные, указывающие, сколько строк и столбцов вам нужно. Затем вы используете их для определения размеров блоков, как вы сделали.

Я изменил цвета на массив, как это было предложено, лично я так и сделал бы (для одного он короче, и вы можете прочитать его как последовательность). Кроме того, если вы хотите изменить последовательность, вам просто нужно переместить элементы.

Наконец, я использовал два для циклов, которые используют числа и числа в качестве пределов диапазона. Если вы думаете о своих временных таблицах, включая 0, это создает идеальную сетку. Просто представьте первый цикл как строки, а вложенный цикл как столбец.

Ну, удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...