Wartość tupli w liście nie może być inna niż warunek - Gra w Statki

0

Cześć, mam następujący kod

        row = "ABCDEFGHIJ"
        column = "0123456789"
        ships_coordinates: dict = {"1": [], "2": [], "3": [], "4": []}
        for _ in range(4):
            coordinates = random.choice(row) + random.choice(column)
            ships_coordinates["1"].append(coordinates)

        for _ in range(6):
            coordinates = random.choice(row) + random.choice(column)
            ships_coordinates["2"].append(coordinates)
        ships_coordinates["2"] = [
            tuple(ships_coordinates["2"][i : i + 2])
            for i in range(0, len(ships_coordinates["2"]), 2)
        ]

Chciałbym aby w tej drugiej pętli co ma range(6) zrobić tak żeby wylosowane coordinates mogły różnić się tylko o jeden w alfabecie albo cyfrze, czyli jak w pierwszej tupli pierwsza wartość będzie A1 to kolejna wartość w tupli może być tylko B1 lub A2.
Upraszczając - chodzi mi o to że w pętli każda wylosowana DRUGA wartość do poprzedniej była większa o jeden w cyfrze lub literze alfabetu. Dopiero później to się zamieni w tuple.
Poprawny przykład coordinates:
['F9', 'F10', 'B2', 'C2', 'A1', A2', 'G2', 'H2']

2

Losuj najpierw jedną wartość całkiem swobodnie¹, a potem zamiast losować drugą, losuj którą współrzędną chcesz zmienić (literową czy cyfrową) i w którą stronę.

¹ No, w Twoim przypadku pewnie chcesz, żeby była unikalna albo i nawet oddalona od pozostałych trafień — w każdym razie, najłatwiej będzie losować do skutku, testując poprawność po wylosowaniu.

4

Zakładając, że trzymałbyś wewnętrznie pozycję na planszy jako parę liczb na liście liść (jak doradzałem tutaj) to twój poprawny przykład współrzędnych ['F9', 'F10', 'B2', 'C2', 'A1', A2', 'G2', 'H2'] sprowadza się do [(5, 9), (5, 10), (1, 2), (2, 2), (0, 1), (0, 2), (6, 2), (7, 2)] - dokładnie jak pisałem, trzymanie pary liczb zamiast pary liczba-litera jest dużo prostsze w operowaniu, generowaniu itd.

1

Tak jak @Althorion. Do tego for wsadzilbym while i losowal do poki warunek nie zostanie spelniony.

1

Ja bym to inaczej zrobił, Po pierwsze żadnych koordynatow literowych, tylko normalne inty od ktorych bedziesz wprost odejmowal dodawal 1 bez żadnych konwersji. Konwersja ew. przy inputach/wyswietlaniu. O wiele czytelniejsze beda wszystkie operacje liczbowe, losowania, sprawdzanie kolizji etc...

Zreszta w ogóle zastanow sie czy jest Ci potrzebna taka abstrakcja jak statek, ktora skomplikuje niesamowicie logike programu. Dlaczego by nie zrobic tak ze masz macierz 10 x 10 w ktorej w miejscach gdzie jest pudlo jest "0", a w miejscach zajmowanych przez statek numer statku (o ile potrzebujesz je miec ponumerowane do jakichs celow statystycznych, bo jesli nie to np. "1")

0 0 0 1 1 1 1 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 2 0 0 0 0 3 3 0
0 0 2 0 0 0 0 0 0 0
0 0 2 0 0 0 0 0 4 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 5 0 0 0 0 0

jestem zwolennikiem splaszczania problemow :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1