2011-03-12 7 views
6

Parece que tengo un problema con mi programa de generación de laberinto realizado en Python. Intento crear aleatoriamente un camino que se bifurca en puntos seleccionados, con los puntos almacenados a medida que avanza. Cuando el laberinto llegue a un callejón sin salida, se volverá a ordenar a través de los puntos visitados probando el valor superior que apareciendo y pasando al siguiente, hasta que llega a un punto donde no es un callejón sin salida. Sin embargo, cuando intento agregar elementos a la lista que estoy usando para guardar los espacios en los que he estado, sucede algo extraño, nunca antes lo había visto. Aquí está el código, y la mejor manera de verlo es ejecutarlo una y otra vez hasta que llegue hasta el final. Realmente no he encontrado una manera de contrarrestar el problema del callejón sin salida, así que si alguien puede ayudarme con eso también, sería genial.List.append() cambiando todos los elementos al elemento adjunto

import random 

width = 8 

def check(x,y): 
    """Figures out the directions that Gen can move while""" 
    if x-1 == -1: 
     maze[x][y][3] = 0 

    if x+1 == 8: 
     maze[x][y][1] = 0 

    if y+1 == 8: 
     maze[x][y][2] = 0 

    if y-1 == -1: 
     maze[x][y][0] = 0 

    if x + 1 in range(0,8) and visited[x+1][y] == False: 
     maze[x][y][1] = 2 

    if x - 1 in range(0,8) and visited[x-1][y] == False: 
     maze[x][y][3] = 2 

    if y + 1 in range(0,8) and visited[x][y+1] == False: 
     maze[x][y][2] = 2 

    if y - 1 in range(0,8) and visited[x][y-1] == False: 
     maze[x][y][0] = 2 



def Gen(x,y): 
    visited[x][y] = True 
    past.append(current) 
    dirs = [] 
    check(x,y) 
    print current 

    if maze[x][y][0] == 2: 
     dirs.append(0) 
    if maze[x][y][1] == 2: 
     dirs.append(1) 
    if maze[x][y][2] == 2: 
     dirs.append(2) 
    if maze[x][y][3] == 2: 
     dirs.append(3) 

    pos = random.choice(dirs) 

    print dirs 

    maze[x][y][pos] = 1 

    if pos == 0: 
     current[1] -= 1 
    if pos == 1: 
     current[0] += 1 
    if pos == 2: 
     current[1] += 1 
    if pos == 3: 
     current[0] -= 1 

    if maze[x][y][0] == 4: 
     maze[x][y][0] = 1 

    if maze[x][y][1] == 4: 
     maze[x][y][1] = 1 

    if maze[x][y][2] == 4: 
     maze[x][y][2] = 1 

    if maze[x][y][3] == 4: 
     maze[x][y][3] = 1 

    print maze[x][y] 
    print past, '\n' 


#Build the initial values for the maze to be replaced later 
maze = [] 
current = [0,0] 
visited = [] 
past = [] 

#Generate empty 2d list with a value for each of the xy coordinates 
for i in range(0,width): 
    maze.append([]) 
    for q in range(0, width): 
     maze[i].append([]) 
     for n in range(0, 4): 
      maze[i][q].append(4) 

#Makes a list of falses for all the non visited places 
for x in range(0, width): 
    visited.append([]) 
    for y in range(0, width): 
     visited[x].append(False) 

#Generates the walls 
#for q in range(0, width): 
# for i in range(0, width): 
#  check(q, i) 

current = [0,0] 

while current != [7,7]: 
    Gen(current[0], current[1]) 
print maze 

Como puede ver, comienza en 0,0 y luego descubre los posibles caminos a seguir. Selecciona aleatoriamente de esos y establece el valor para ese lado de la sala en 0,0 a 1, lo que significa un pasaje. 2 significa pared y 0 significa fuera de límites. 4 es solo un marcador de posición, ya que todos los valores deben llenarse para cuando el laberinto se haya generado por completo.

Si alguien me puede ayudar, sería genial y muy apreciado. Gracias por adelantado.

+0

¿Cuál es el comportamiento extraño que ves cuando usas list.append()? ¿Cuál es el resultado esperado? ¿Cuál es el resultado real? – dappawit

+0

Cada elemento de la lista se convierte en el elemento recién agregado. Por ejemplo, después de 4 cuadrados del laberinto, los 4 elementos del pasado se cambian a cualquiera que sea el elemento anexo. Lo que estoy esperando es que sea una lista de la ruta que tomó el generador, por ejemplo, [[0,0] [0,1] [1,1] [2,1]] etc. –

+0

Ok , por lo que el comportamiento actual (erróneo) es, por ejemplo, si tuviera '[[0,0], [0,0], [0,0]]' y añádase '[1,2]', la lista sería convertirse en: '[[1,2], [1,2], [1,2], [1,2]]'? – dappawit

Respuesta

12

Creo que la lista current simplemente se copia varias veces en past. Por lo tanto, tiene varias copias de la misma lista .

Para corregir: en la línea past.append(current) (dos líneas por debajo de def Gen(x,y):), cámbiela a past.append(current[:]).

La notación list[:] crea una copia de la lista. Técnicamente, estás creando una porción de toda la lista.

Por cierto, una mejor solución sería la de no utilizar una variable global current :)

+0

Eso funcionó, pero ¿puedes decirme por qué? No sé por qué el simple apéndice no funciona. –

+4

De acuerdo, tiene una lista de dos elementos llamada 'actual'. Cuando agrega eso a 'pasado', inserta una referencia a él. Entonces, ahora 'current' y' pasado [-1] 'ambos se refieren al * mismo * objeto. Luego, lo vuelve a agregar, y todos: 'pasado [-2]', 'pasado [-1]' y 'actual' se refieren al * mismo * objeto. Por lo tanto, cuando edita 'current', los elementos en la lista también cambian. Porque todos se refieren al * mismo * objeto ... Para decirlo de otra manera, usar 'past.append (current)' no * hace * una copia de 'current'. – dappawit

+0

Ah, gracias por eso. –

0

Sí esto es correcto, mientras que lista por comprensión en Python que necesita para anexar por la tira de otra forma que reemplazará varias veces

+1

Corrija su gramática para que la respuesta sea clara. –

Cuestiones relacionadas