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()
aW1wb3J0IHJhbmRvbQoKZGVmIGdlbmVydWpfcGxhbnN6ZSh3YXosIGphYmxrbywgc3plcm9rb3NjPTEwLCB3eXNva29zYz0xMCk6CiAgICAjIFR3b3J6ZW5pZSBwdXN0ZWogcGxhbnN6eQogICAgcGxhbnN6YSA9IFtbJy4gJyBmb3IgXyBpbiByYW5nZShzemVyb2tvc2MpXSBmb3IgXyBpbiByYW5nZSh3eXNva29zYyldCiAgICAKICAgICMgUnlzb3dhbmllIGphYmxrYSAoTykKICAgIGp4LCBqeSA9IGphYmxrbwogICAgcGxhbnN6YVtqeV1banhdID0gJ08gJwogICAgICAgIAogICAgIyBSeXNvd2FuaWUgd2V6YSAoSCAtIGdsb3dhLCBYIC0gdHVsb3cpCiAgICBmb3IgaSwgKHd4LCB3eSkgaW4gZW51bWVyYXRlKHdheik6CiAgICAgICAgcGxhbnN6YVt3eV1bd3hdID0gJ0ggJyBpZiBpID09IDAgZWxzZSAnWCAnCiAgICAgICAgICAgIAogICAgIyBGb3JtYXRvd2FuaWUgcGxhbnN6eSBkbyB0ZWtzdHUKICAgIHdpZG9rID0gIiIKICAgIGZvciByemFkIGluIHBsYW5zemE6CiAgICAgICAgd2lkb2sgKz0gJycuam9pbihyemFkKSArICdcbicKICAgIHJldHVybiB3aWRvawoKZGVmIG1haW4oKToKICAgICMgVXN0YXdpZW5pYSBwb2N6YXRrb3dlCiAgICBzemVyb2tvc2MsIHd5c29rb3NjID0gMTAsIDEwCiAgICB3YXogPSBbKDMsIDUpLCAoMiwgNSksICgxLCA1KV0gIyBHbG93YSBqZXN0IG5hIHBvenljamkgKDMsNSkKICAgIAogICAgIyBMb3Nvd2FuaWUgcGllcndzemVnbyBqYWJsa2EKICAgIGphYmxrbyA9IChyYW5kb20ucmFuZGludCgwLCBzemVyb2tvc2MtMSksIHJhbmRvbS5yYW5kaW50KDAsIHd5c29rb3NjLTEpKQogICAgd2hpbGUgamFibGtvIGluIHdhejoKICAgICAgICBqYWJsa28gPSAocmFuZG9tLnJhbmRpbnQoMCwgc3plcm9rb3NjLTEpLCByYW5kb20ucmFuZGludCgwLCB3eXNva29zYy0xKSkKICAgICAgICAKICAgIGtpZXJ1bmtpID0geydHT1JBJzogKDAsIC0xKSwgJ0RPTCc6ICgwLCAxKSwgJ0xFV08nOiAoLTEsIDApLCAnUFJBV08nOiAoMSwgMCl9CiAgICBvYmVjbnlfa2llcnVuZWsgPSAnUFJBV08nCiAgICB3eW5payA9IDAKICAgIG1heF9ydWNob3cgPSA1MCAjIExpbWl0IHJ1Y2hvdywgYWJ5IElkZW9uZSBuaWUgcHJ6ZXJ3YWxvIHByb2dyYW11IHphIGRsdWdpZSBkemlhbGFuaWUKICAgIAogICAgcHJpbnQoIj09PSBBVVRPTUFUWUNaTlkgU05BS0UgPT09IikKICAgIHByaW50KGdlbmVydWpfcGxhbnN6ZSh3YXosIGphYmxrbywgc3plcm9rb3NjLCB3eXNva29zYykpCiAgICAKICAgIGZvciBrcm9rIGluIHJhbmdlKDEsIG1heF9ydWNob3cgKyAxKToKICAgICAgICAjIFByb3N0ZSBBSSB3ZXphOiB3eWJpZXJhIGxvc293eSBraWVydW5laywga3RvcnkgZ28gb2QgcmF6dSBuaWUgemFiaWplCiAgICAgICAgZ3gsIGd5ID0gd2F6WzBdCiAgICAgICAgbW96bGl3ZV9ydWNoeSA9IFtdCiAgICAgICAgCiAgICAgICAgZm9yIG5hendhLCAoZHgsIGR5KSBpbiBraWVydW5raS5pdGVtcygpOgogICAgICAgICAgICBueCwgbnkgPSBneCArIGR4LCBneSArIGR5CiAgICAgICAgICAgICMgU3ByYXdkemFuaWUgY3p5IHJ1Y2ggamVzdCBiZXpwaWVjem55IChzY2lhbnkgaSB0dWxvdykKICAgICAgICAgICAgaWYgMCA8PSBueCA8IHN6ZXJva29zYyBhbmQgMCA8PSBueSA8IHd5c29rb3NjIGFuZCAobngsIG55KSBub3QgaW4gd2F6WzotMV06CiAgICAgICAgICAgICAgICAjIE5pZSBwb3p3YWxhaiBuYSBuYXR5Y2htaWFzdG93ZSBvZHdyb2NlbmllIHNpZSB3IHR5bAogICAgICAgICAgICAgICAgaWYgKG5hendhID09ICdHT1JBJyBhbmQgb2JlY255X2tpZXJ1bmVrICE9ICdET0wnKSBvciBcCiAgICAgICAgICAgICAgICAgICAobmF6d2EgPT0gJ0RPTCcgYW5kIG9iZWNueV9raWVydW5layAhPSAnR09SQScpIG9yIFwKICAgICAgICAgICAgICAgICAgIChuYXp3YSA9PSAnTEVXTycgYW5kIG9iZWNueV9raWVydW5layAhPSAnUFJBV08nKSBvciBcCiAgICAgICAgICAgICAgICAgICAobmF6d2EgPT0gJ1BSQVdPJyBhbmQgb2JlY255X2tpZXJ1bmVrICE9ICdMRVdPJyk6CiAgICAgICAgICAgICAgICAgICAgbW96bGl3ZV9ydWNoeS5hcHBlbmQobmF6d2EpCiAgICAgICAgCiAgICAgICAgIyBKZXNsaSBicmFrIGJlenBpZWN6bnljaCBydWNob3csIHdheiBwcnplZ3J5d2EKICAgICAgICBpZiBub3QgbW96bGl3ZV9ydWNoeToKICAgICAgICAgICAgcHJpbnQoZiJLcm9rIHtrcm9rfTogV2F6IHphcGV0bGlsIHNpZSBpIG5pZSBtYSBnZHppZSB1Y2lla2FjISBLb25pZWMgZ3J5LiIpCiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIAogICAgICAgICMgV3lib3IgcnVjaHU6IGNlbHVqIHcgamFibGtvIGx1YiBpZHogbG9zb3dvIHogYmV6cGllY3pueWNoIG9wY2ppCiAgICAgICAgIyBTenVrYW5pZSBydWNodSwga3RvcnkgcHJ6eWJsaXphIGRvIGphYmxrYQogICAgICAgIG5hamxlcHN6eV9ydWNoID0gbW96bGl3ZV9ydWNoeVswXQogICAgICAgIG5ham1uaWVqc3p5X2R5c3RhbnMgPSA5OTkKICAgICAgICBqeCwgankgPSBqYWJsa28KICAgICAgICAKICAgICAgICBmb3IgcnVjaCBpbiBtb3psaXdlX3J1Y2h5OgogICAgICAgICAgICBkeCwgZHkgPSBraWVydW5raVtydWNoXQogICAgICAgICAgICBueCwgbnkgPSBneCArIGR4LCBneSArIGR5CiAgICAgICAgICAgIGR5c3RhbnMgPSBhYnMobnggLSBqeCkgKyBhYnMobnkgLSBqeSkgIyBPZGxlZ2xvc2NpIE1hbmhhdHRhbgogICAgICAgICAgICBpZiBkeXN0YW5zIDwgbmFqbW5pZWpzenlfZHlzdGFuczoKICAgICAgICAgICAgICAgIG5ham1uaWVqc3p5X2R5c3RhbnMgPSBkeXN0YW5zCiAgICAgICAgICAgICAgICBuYWpsZXBzenlfcnVjaCA9IHJ1Y2gKICAgICAgICAgICAgICAgIAogICAgICAgIG9iZWNueV9raWVydW5layA9IG5hamxlcHN6eV9ydWNoCiAgICAgICAgZHgsIGR5ID0ga2llcnVua2lbb2JlY255X2tpZXJ1bmVrXQogICAgICAgIG5vd2FfZ2xvd2EgPSAoZ3ggKyBkeCwgZ3kgKyBkeSkKICAgICAgICAKICAgICAgICAjIFJ1Y2ggd2V6YQogICAgICAgIHdhei5pbnNlcnQoMCwgbm93YV9nbG93YSkKICAgICAgICAKICAgICAgICAjIFpqZWR6ZW5pZSBqYWJsa2EKICAgICAgICBpZiBub3dhX2dsb3dhID09IGphYmxrbzoKICAgICAgICAgICAgd3luaWsgKz0gMQogICAgICAgICAgICBwcmludChmIktyb2sge2tyb2t9OiBSdWNoIHcge29iZWNueV9raWVydW5la30uIFpqZWR6b25vIGphYmxrbyEgV3luaWs6IHt3eW5pa30iKQogICAgICAgICAgICAjIE5vd2UgbG9zb3dlIGphYmxrbwogICAgICAgICAgICBpZiBsZW4od2F6KSA8IHN6ZXJva29zYyAqIHd5c29rb3NjOgogICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgICAgICBqYWJsa28gPSAocmFuZG9tLnJhbmRpbnQoMCwgc3plcm9rb3NjLTEpLCByYW5kb20ucmFuZGludCgwLCB3eXNva29zYy0xKSkKICAgICAgICAgICAgICAgICAgICBpZiBqYWJsa28gbm90IGluIHdhejoKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHByaW50KCJHcmF0dWxhY2plISBXYXogemFwZWxuaWwgY2FsYSBwbGFuc3plISIpCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHdhei5wb3AoKQogICAgICAgICAgICBwcmludChmIktyb2sge2tyb2t9OiBSdWNoIHcge29iZWNueV9raWVydW5la30iKQogICAgICAgICAgICAKICAgICAgICAjIFd5c3dpZXRsZW5pZSBwbGFuc3p5CiAgICAgICAgcHJpbnQoZ2VuZXJ1al9wbGFuc3plKHdheiwgamFibGtvLCBzemVyb2tvc2MsIHd5c29rb3NjKSkKICAgICAgICAKICAgIHByaW50KGYiS29uaWVjIHN5bXVsYWNqaS4gRmluYWxueSB3eW5pazoge3d5bmlrfSIpCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgbWFpbigpCg==