Попытка удалить два объекта при размещении рядом друг с другом в pygame

avatar
yarrsome
12 мая 2019 в 17:25
53
1
2

У меня есть игра в стиле тетрис, где пользователь управляет блоком случайного цвета, а затем опускает этот блок вниз, где он фиксируется на месте, а затем порождает новый блок в верхней части экрана. Я хочу "очистить" всякий раз, когда два блока одного цвета помещаются рядом друг с другом, и для любых блоков, которые были выше этих очищенных блоков, двигаться вниз, как если бы на них воздействовала гравитация.

Я безуспешно пытался использовать список конфликтов.

Источник
Rabbid76
12 мая 2019 в 17:52
0

Вам нужно найти соседние блоки одного цвета и удалить их из copylist. Это нужно делать каждый раз, когда блок достигает дна (например, в chooseBlock).

yarrsome
12 мая 2019 в 18:11
0

Хорошо, я мог бы придумать реализацию, но как насчет перемещения блоков, которые находятся над удаленными блоками, вниз?

Rabbid76
12 мая 2019 в 18:47
0

Конечно, вы должны сбросить те блоки, чей блок ниже ушел. Смотрите ответ.

Ответы (1)

avatar
Rabbid76
12 мая 2019 в 18:22
1

Вы должны найти соседние блоки одного цвета и удалить их из copylist. Это нужно делать каждый раз, когда блок достигает дна (например, в chooseBlock).

Найдите индексы смежных блоков и сохраните их в set(). Обратите внимание, в наборе индексы уникальны:

например:

adjoining = set()
for i in range(len(copylist)):
    for j in range(len(copylist)):
        if i == j or colorList[i] != colorList[j]:
            continue
        if (copylist[i][0] == copylist[j][0] and abs(copylist[i][1]-copylist[j][1]) == height) or \
           (copylist[i][1] == copylist[j][1] and abs(copylist[i][0]-copylist[j][0]) == width):
            adjoining.add(i)
            adjoining.add(j)

Создайте новые copylist и colorList, содержащие только те элементы, чей индекс не содержится в adjoining:

copylist = [copylist[i] for i in range(len(copylist)) if i not in adjoining]
colorList = [colorList[i] for i in range(len(colorList)) if i not in adjoining]

В конце вы найдете все блоки, которые нужно сбросить на землю, потому что блок ниже был удален.
Перемещение вниз на блок в not any() блок ниже:

например,

for i in range(len(copylist)):
    if copylist[i][1] >= 390:
        continue
    if not any([copylist[j] for j in range(len(copylist)) \
                if i != j and copylist[i][0] == copylist[j][0] and copylist[i][1] + height == copylist[j][1]]):
        copylist[i][1] += height

Выполните алгоритм в chooseBlock и повторяйте его, пока не будут найдены смежные блоки:

def chooseBlock():
    global player, copylist, colorList, colorChoice, blocksLeft
    #running list of blocks and their positions once placed
    copylist.append(player.copy())
    #running list of those blocks' colors
    colorList.append(colorChoice)
    #resetting player position
    player.y = 50 
    #choosing the color of the next block randomly from a list
    colorChoice = random.choice(colors)
    #subtracting 1 from the count of the blocks left to place after one is placed
    blocksLeft = blocksLeft - 1

    while True:
        adjoining = set()
        for i in range(len(copylist)):
            for j in range(len(copylist)):
                if i == j or colorList[i] != colorList[j]:
                    continue
                if (copylist[i][0] == copylist[j][0] and abs(copylist[i][1]-copylist[j][1]) == height) or \
                   (copylist[i][1] == copylist[j][1] and abs(copylist[i][0]-copylist[j][0]) == width):
                    adjoining.add(i)
                    adjoining.add(j)

        if not adjoining:
            break

        copylist = [copylist[i] for i in range(len(copylist)) if i not in adjoining]
        colorList = [colorList[i] for i in range(len(colorList)) if i not in adjoining]

    testmovedown = True
    while testmovedown:
        testmovedown = False
        for i in range(len(copylist)):
            if copylist[i][1] >= 390:
                continue
            if not any([copylist[j] for j in range(len(copylist)) \
                        if i != j and copylist[i][0] == copylist[j][0] and copylist[i][1] + height == copylist[j][1]]):
                copylist[i][1] += height
                testmovedown = True