Nie mogę zrozumieć, jak wprowadzić ten kod nie używać tej samej płytki w sieci

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) 

Próbowałem tego robić, a ale wynik właśnie wyszedł to samo

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 lipiec 2020, 18:43

1 odpowiedź

Najlepsza odpowiedź

Problem polega na tym, że nie ma nic, co uniemożliwia funkcję random.randint() z powrotu do tego samego wyboru, więc w pewnym momencie prawdopodobnie otrzymasz powtarzanie.

Zamiast tego utworzyłbym listę kanałów ze wszystkimi parami (wiersz, COL) w nim. Jest to łatwo utworzone przy użyciu dwóch zagnieżdżonych pętli dołączenia do listy. Następnie możesz użyć 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)

Za pomocą random_cells zawierający listę wyboru komórek randomizowanych ({x1}} utrzymuje pozostałe nieodstawione komórki, gdy to wykończenia).

Do ściślejszego dopasowania tego, co masz powyżej:

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) 

Edytuj:
. Nie zrobiłbym tego w ten sposób (ponieważ nie zatrzymuje ponownego wyboru, ale po prostu odrzuca je, jeśli się zdarzają). Uważam jednak, że możesz naprawić swój aktualny stan {x0}}, który zakłada, że chcesz tylko żądać płytki dołączonych do Grid, jeśli ta lokalizacja jest pusta. :

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 lipiec 2020, 19:16