Почему добавление сна к этой функции нарушает его? - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть функция (называемая generateMaze), которая должна генерировать лабиринт, но до сих пор она просто находила каждую «ячейку» в сетке. Когда он находит ячейку, он помечает ячейку как «посещенную». Я отмечаю каждую ячейку черным кружком, но когда она была «посещена», она должна быть отмечена как зеленая. Когда я запускаю программу, все мгновенно становится зеленым. Я хотел бы добавить сон в конце функции generateMaze, чтобы я мог видеть, как происходит процесс зеленеть ячеек, а не происходит мгновенно. В функции он печатает «Len: {len (openCells)}», который печатает количество ячеек, для которых разрешено go. Если я добавлю спящий режим в любое место функции, он начнет печатать числа, которые go превышают возможный максимум, равный 4.

# Function
def generateMaze(x=40, y=40): 
    global cells
    possiblePositions = []
    openCells = []

    # These are all the possible positions that we can go to
    possiblePositions.append([x-80, y])
    possiblePositions.append([x+80, y])
    possiblePositions.append([x, y-80])
    possiblePositions.append([x, y+80])

    # Find open cells using the possiblePositions
    for cell in cells:
        for i in range(len(possiblePositions)):
            if cell.x == possiblePositions[i][0] and cell.y == possiblePositions[i][1] and (not cell.visited()):
                openCells.append(cell)

    # Choose random cell
    print("Len: ", len(openCells))
    if len(openCells) > 0:
        targetCell = openCells[randint(0, len(openCells)-1)]
        if targetCell in cells:
            cells[cells.index(targetCell)].visit()
        else:
            print("Error: Could not find targetCell in cells")
        generateMaze(targetCell.x, targetCell.y)
    else:
        print("Done generating")
#mainloop
while not done:
    # [...]    

    if shouldGenMaze:
        shouldGenMaze = False
        print("Generating Maze...")
        x = threading.Thread(target = generateMaze)
        x.start()

    # [...]

1 Ответ

0 голосов
/ 06 апреля 2020

Код работает для меня. Может быть, это как-то связано с вашими потоками, трудно сказать только с одной функцией.

Очевидно, что если вы поместите задержку в конец функции, вы просто получите одну большую задержку хвостов рекурсии.

Вот мой MRE:

import random
import time

cells = []

class Cell:
    def __init__( self, x, y ):
        self.x = x
        self.y = y
        self.been_there = False

    def visited( self ):
        return self.been_there
    def visit( self ):
        self.been_there = True


def generateMaze(x=40, y=40):
    global cells
    possiblePositions = []
    openCells = []

    # These are all the possible positions that we can go to
    possiblePositions.append([x-80, y])
    possiblePositions.append([x+80, y])
    possiblePositions.append([x, y-80])
    possiblePositions.append([x, y+80])

    # Find open cells using the possiblePositions
    for cell in cells:
        for i in range(len(possiblePositions)):
            if cell.x == possiblePositions[i][0] and cell.y == possiblePositions[i][1] and (not cell.visited()):
                openCells.append(cell)

    # Choose random cell
    print("Len: ", len(openCells))
    if len(openCells) > 0:
        targetCell = openCells[random.randint(0, len(openCells)-1)]
        if targetCell in cells:
            cells[cells.index(targetCell)].visit()
        else:
            print("Error: Could not find targetCell in cells")
        time.sleep( 1 )
        generateMaze(targetCell.x, targetCell.y)
    else:
        print("Done generating")



SIZE=121  #?
for y in range( 0, SIZE ):
    for x in range( 0, SIZE ):
        cells.append( Cell( x, y ) )

generateMaze()
...