Gra "Snake" – problem z dodaniem segmentu po zebraniu punktu

1

Krótko: tworzę sobie grę "Snake". Nie korzystam z żadnych przykładów, sam sobie układam w głowie. Doszedłem do pewnej ściany algorytmicznej (i szukam w niej klamki).

Wąż składa się z segmentów. Porusza się w pętli. W każdym kroku pętli są wykonywane między innymi następujące działania:

1. Porusz węża o jedno pole (tzn. jeszcze nie wyświetlaj nic).
2. Sprawdź, czy wąż jest w niedozwolonej pozycji.
    2.1. Jeśli tak, zakończ grę.
    2.2. Jeśli nie, sprawdź, czy wąż właśnie zebrał punkt.
        2.2.1. Jeśli tak, zwiększ długość węża o jeden segment.
        2.2.2. (Jeśli nie, nic nie rób).
3. Wyświetl planszę (wraz z wężem).

I to powinno działać... chyba że dojdzie do takiej sytuacji jak poniżej (rysowałem w arkuszu kalkulacyjnym):

Screenshot_2019-08-19_23-40-40.png

Wąż porusza się, jak pokazują strzałki. Głowa jest oznaczona ciemniejszym kolorem i znakiem "G", punkt znakiem "x", ostatni segment węża przed dodaniem nowego znakiem "O", a nowy segment znakiem "N". I teraz:

  1. Jeśli wąż nie zebrał punktu, to nic się nie dzieje złego: w następnym ruchu ostatni segment przesuwa się do pola wyżej, a głowa przesuwa się na jego poprzednie miejsce (czyli puste) (schemat 3-a).
  2. Jeśli jednak wąż zebrał właśnie punkt, to w następnym ruchu ostatni segment przesuwa się nadal na miejsce wyżej... ale na poprzednim jego miejscu jest dodawany nowy segment. I jeśli głowa się tam przesunie, to wąż na siebie wejdzie (i koniec gry) (schemat 3-b).

Nie mógłbym przecież w instrukcji do gry napisać, że jeśli wystąpi w grze taka sytuacja, jak powyżej narysowałem, to koniec gry, bo jest to według mnie nieintuicyjne.

Jak to rozwiązać?


UPDATE2: Zastanawiam się właśnie, czy w ogóle jest jakikolwiek problem... Chyba coś pomieszałem w głowie z sekwencją działań w kroku pętli.


UPDATE3: Zaktualizowałem obrazek i jego opis. Teraz, myślę, będzie lepiej widoczne, jaki mam problem.

0

Twój problem jest banalny do rozwiązania... Pobierz jakiegoś dobrego snake'a i zobacz jak tam to wygląda...

Głowa by mogła być bardziej wyróżniona, zamień ją w trójkąt (chyba, że w ogóle odrzucisz ostatecznie design z Excela :) ).
Gdy głowa wejdzie na koniec ogona zaraz po zjedzeniu, to logiczne, że końcówka ogona przez jeden ruch zostanie w miejscu.

1

@Spine: ja niedokładnie to samo wywnioskowałem, ale sądzę, że chyba rozwiązałem problem. Rysunki pomogły. :) W kroku 2-b mamy stan, że nowy segment jest już dodany – więc to on jest brany pod uwagę w kroku 3-b, a nie poprzedni-ostatni segment.


PS. Lubię takie rozwiązania – gdy okazuje się, że aktualny algorytm jest w porządku i nic nie trzeba zmieniać. ;)

0

Zobacz:

Obracanie klocków w Tetrisie też nie jest logiczne i nie jest zgodne z prawami fizyki, a ludzie muszą to zaakceptować ;)

1
Silv napisał(a):
  1. Jeśli jednak wąż zebrał właśnie punkt, to w następnym ruchu ostatni segment przesuwa się nadal na miejsce wyżej... ale na poprzednim jego miejscu jest dodawany nowy segment. I jeśli głowa się tam przesunie, to wąż na siebie wejdzie (i koniec gry) (schemat 3-b).

Moim zdaniem nie ma tutaj problemu, tak właśnie działa gra w Węża i jeśli ktoś nie jest w stanie ogarnąć powyższej sytuacji, to najwidoczniej Wąż jest dla niego za trudny :)

p.s. To że wąż się wydłuża po zjedzeniu kolejnego elementu też nie jest intuicyjne, bo węże przecież w takich okolicznościach grubieją ;)p

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