Почему my для l oop захватывает только значения y 699 вместо значений в диапазоне от 0 до 699? - PullRequest
4 голосов
/ 22 апреля 2020

Я программирую аркадную игру в Pygame. Я хочу, чтобы каждый черный пиксель был ходячей поверхностью для игрока. Я пытаюсь получить каждый черный пиксель на экране и добавить его к требованию. Затем я хочу сравнить координаты x и y игрока с элементами dict. Когда я печатаю пиксели dict, он печатает только значения y = 699 и значения x в диапазоне от 0 до 1250. Как я могу сделать пригодные для ходьбы черные поверхности, добавляя каждый черный пиксель в dict для сравнения с координатами игрока?

Pixels = {}

for x1 in range(0, 1250):
    for y2 in range(0, 700):
        xy12 = disp.get_at((x1, y2))
        if xy12[0] <= 3 and xy12[1] <= 3 and xy12[2] <= 3: #the <= just makes it so rgb values of 3 are close enough to black that it is acceptable...
             Pixels[x1] = y2

def pglc():
    global groundlim
    if playerx in Pixels:
        if playery == Pixels[playerx]:
            groundlim = playery

print Pixels

Ответы [ 3 ]

5 голосов
/ 22 апреля 2020

Эта строка - ваша проблема

Pixels[x1] = y2

Во внутреннем l oop вы перезаписываете значение на каждом шаге, поэтому последнее значение, которое вы видите, равно 699 (но оно имело все значения от 0 до 698 до того момента, когда условие было выполнено). Вы можете сделать два измерения:

Pixels[x1] = list()

И затем во внутреннем l oop:

Pixels[x1].append(y2)

Всего:

Pixels = {}

for x1 in range(0, 1250):
    Pixels[x1] = list()
    for y2 in range(0, 700):
        xy12 = disp.get_at((x1, y2))
        if xy12[0] <= 3 and xy12[1] <= 3 and xy12[2] <= 3:
             Pixels[x1].append(y2)

Или - если вы Вы в диковинном понимании (плюс он использует all(...)):

Pixels = {x1:
              [y2 
               for y2 in range(0, 700) 
               for xy12 in [disp.get_at((x1, y2))]
               if (all(cond <= 3 for cond in xy12[0:2]))]
          for x1 in range(0, 1250)}
2 голосов
/ 22 апреля 2020

Ваша структура данных, диктант Пикселей, не подходит для этой проблемы, вы сохраняете только один возможный черный Y для каждого X, а их может быть больше.

Итак, здесь вы получаете 699 за каждый x, потому что это последнее значение Y, которое было черным.

Ваша структура данных не позволяет хранить более одного черного пикселя на координату X.

Вы можете просто сохранить набор кортежей Pixels = {} Pixels.add( (x, y)) черного цвета и проверьте, возвращают ли (x, y) в пикселях значение True

Или вы можете сохранить набор координат Y для каждой координаты X, поэтому словарь наборов.

2 голосов
/ 22 апреля 2020

Как сказал @Jan в своем ответе, вы всегда меняете значение Pixels[x1]

. Чтобы исправить это, вам нужно использовать массив, содержащий кортежи (x, y). Помните, что dict.keys() является набором, что означает, что не может быть никаких повторяющихся объектов

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