import random

def generuj_plansze(waz, jablko, szerokosc=10, wysokosc=10):
    # Tworzenie pustej planszy
    plansza = [['. ' for _ in range(szerokosc)] for _ in range(wysokosc)]
    
    # Rysowanie jablka (O)
    jx, jy = jablko
    plansza[jy][jx] = 'O '
        
    # Rysowanie weza (H - glowa, X - tulow)
    for i, (wx, wy) in enumerate(waz):
        plansza[wy][wx] = 'H ' if i == 0 else 'X '
            
    # Formatowanie planszy do tekstu
    widok = ""
    for rzad in plansza:
        widok += ''.join(rzad) + '\n'
    return widok

def main():
    # Ustawienia poczatkowe
    szerokosc, wysokosc = 10, 10
    waz = [(3, 5), (2, 5), (1, 5)] # Glowa jest na pozycji (3,5)
    
    # Losowanie pierwszego jablka
    jablko = (random.randint(0, szerokosc-1), random.randint(0, wysokosc-1))
    while jablko in waz:
        jablko = (random.randint(0, szerokosc-1), random.randint(0, wysokosc-1))
        
    kierunki = {'GORA': (0, -1), 'DOL': (0, 1), 'LEWO': (-1, 0), 'PRAWO': (1, 0)}
    obecny_kierunek = 'PRAWO'
    wynik = 0
    max_ruchow = 50 # Limit ruchow, aby Ideone nie przerwalo programu za dlugie dzialanie
    
    print("=== AUTOMATYCZNY SNAKE ===")
    print(generuj_plansze(waz, jablko, szerokosc, wysokosc))
    
    for krok in range(1, max_ruchow + 1):
        # Proste AI weza: wybiera losowy kierunek, ktory go od razu nie zabije
        gx, gy = waz[0]
        mozliwe_ruchy = []
        
        for nazwa, (dx, dy) in kierunki.items():
            nx, ny = gx + dx, gy + dy
            # Sprawdzanie czy ruch jest bezpieczny (sciany i tulow)
            if 0 <= nx < szerokosc and 0 <= ny < wysokosc and (nx, ny) not in waz[:-1]:
                # Nie pozwalaj na natychmiastowe odwrocenie sie w tyl
                if (nazwa == 'GORA' and obecny_kierunek != 'DOL') or \
                   (nazwa == 'DOL' and obecny_kierunek != 'GORA') or \
                   (nazwa == 'LEWO' and obecny_kierunek != 'PRAWO') or \
                   (nazwa == 'PRAWO' and obecny_kierunek != 'LEWO'):
                    mozliwe_ruchy.append(nazwa)
        
        # Jesli brak bezpiecznych ruchow, waz przegrywa
        if not mozliwe_ruchy:
            print(f"Krok {krok}: Waz zapetlil sie i nie ma gdzie uciekac! Koniec gry.")
            break
            
        # Wybor ruchu: celuj w jablko lub idz losowo z bezpiecznych opcji
        # Szukanie ruchu, ktory przybliza do jablka
        najlepszy_ruch = mozliwe_ruchy[0]
        najmniejszy_dystans = 999
        jx, jy = jablko
        
        for ruch in mozliwe_ruchy:
            dx, dy = kierunki[ruch]
            nx, ny = gx + dx, gy + dy
            dystans = abs(nx - jx) + abs(ny - jy) # Odleglosci Manhattan
            if dystans < najmniejszy_dystans:
                najmniejszy_dystans = dystans
                najlepszy_ruch = ruch
                
        obecny_kierunek = najlepszy_ruch
        dx, dy = kierunki[obecny_kierunek]
        nowa_glowa = (gx + dx, gy + dy)
        
        # Ruch weza
        waz.insert(0, nowa_glowa)
        
        # Zjedzenie jablka
        if nowa_glowa == jablko:
            wynik += 1
            print(f"Krok {krok}: Ruch w {obecny_kierunek}. Zjedzono jablko! Wynik: {wynik}")
            # Nowe losowe jablko
            if len(waz) < szerokosc * wysokosc:
                while True:
                    jablko = (random.randint(0, szerokosc-1), random.randint(0, wysokosc-1))
                    if jablko not in waz:
                        break
            else:
                print("Gratulacje! Waz zapelnil cala plansze!")
                break
        else:
            waz.pop()
            print(f"Krok {krok}: Ruch w {obecny_kierunek}")
            
        # Wyswietlenie planszy
        print(generuj_plansze(waz, jablko, szerokosc, wysokosc))
        
    print(f"Koniec symulacji. Finalny wynik: {wynik}")

if __name__ == "__main__":
    main()
