No puedo entender cómo hacer que este código no use el mismo mosaico en la cuadrícula

for i in range(60):
    RandomRow = random.randint(0, MazeSize - 1)
    RandomColumn = random.randint(0, MazeSize - 1)
    TempTile = MapTile('walls', RandomColumn, RandomRow)
    Grid[RandomColumn][RandomRow].append(TempTile) 

Intenté hacer esto y el resultado fue el mismo

for i in range(60):
    RandomRow = random.randint(0, MazeSize - 1)
    RandomColumn = random.randint(0, MazeSize - 1)
    TempTile = MapTile('walls', RandomColumn, RandomRow)
    if TempTile not in Grid: Grid[RandomColumn][RandomRow].append(TempTile)
0
FaithlessS 20 jul. 2020 a las 18:43

1 respuesta

La mejor respuesta

El problema es que no hay nada que impida que la función random.randint() devuelva las mismas selecciones, por lo que es probable que en algún momento obtenga una repetición.

En su lugar, crearía una lista de tuplas con todos los pares (fila, columna) en ella. Esto se crea fácilmente usando dos bucles for anidados que se añaden a una lista. Luego, puede usar random.choice() para seleccione de la lista y luego elimine la entrada seleccionada. Esto aseguraría que no pueda volver a seleccionar celdas.

Se vería algo así:

import random

MAX_SELECTIONS = 60
ROWS = 10
COLUMNS = 15

cells = []
for i in range(ROWS):
    for j in range(COLUMNS):
        cells.append((i, j))

random_cells = []
for _ in range(MAX_SELECTIONS):
    selection = random.choice(cells)
    random_cells.append(selection)
    cells.remove(selection)

Con random_cells que contiene la lista de selecciones de celdas aleatorias (cells contiene las celdas restantes no seleccionadas cuando finaliza).

Para que coincida más con lo que tiene arriba:

import random

MAX_SELECTIONS = 60
ROWS = MazeSize
COLUMNS = MazeSize

cells = []
for i in range(ROWS):
    for j in range(COLUMNS):
        cells.append((i, j))

for _ in range(MAX_SELECTIONS):
    selection = random.choice(cells)
    cells.remove(selection)

    RandomRow = selection[0]
    RandomColumn = selection[1]
    TempTile = MapTile('walls', RandomColumn, RandomRow)
    Grid[RandomColumn][RandomRow].append(TempTile) 

EDITAR:
No lo haría de esta manera (porque no detiene la re-selección sino que simplemente las descarta si suceden). Sin embargo, creo que podrías arreglar tu condición actual de if como esta asumiendo que solo quieres un mosaico anexado al Grid si esa ubicación está vacía. :

for i in range(60):
    RandomRow = random.randint(0, MazeSize - 1)
    RandomColumn = random.randint(0, MazeSize - 1)

    if not Grid[RandomColumn][RandomRow]:
        TempTile = MapTile('walls', RandomColumn, RandomRow)
        Grid[RandomColumn][RandomRow].append(TempTile)
1
Glenn Mackintosh 20 jul. 2020 a las 19:16