kolizja ze ścianami w snake

kolizja ze ścianami w snake
AA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 16
0

Witam,
czytałam sporo podobnych artykułów w związku z grą snake, kolizjami etc. jednak mam cały czas problem jak to napisać. Jak napisać kolizję ze ścianami. Snake mam na podstawie listy

Kopiuj
 List<Point> snake = new List<Point>(); 

mam klasę planszę, snake no i form. Gdzie mam tę kolizję ulokować? w snake? i na jakiej zasadzie ma wyglądać warunek??

  • Rejestracja: dni
  • Ostatnio: dni
0

No chyba mnie więcej tak:
( w zależności gdzie twój snake ma 'głowe')

if(snakeBody[0]/snakeBody[snakebody.Lenght-1].X/Y == 0 || X == Width || Y == Height)
Metoda();

spartanPAGE
  • Rejestracja: dni
  • Ostatnio: dni
1

Musisz sprawdzać, czy głowa po wykonaniu ruchu nie będzie z czymś kolidować.

msm
  • Rejestracja: dni
  • Ostatnio: dni
2

Chodzi chyba o to gdzie ten warunek fizycznie ulokować.

mam klasę planszę, snake no i form. Gdzie mam tę kolizję ulokować? w snake? i na jakiej zasadzie ma wyglądać warunek??

Ja bym zrobił coś w rodzaju:

W klasie snake:

Kopiuj
private Point Head { get { return snake[0]; } } // helper

public void Move()
{
    this.ChangePosition(); // przesunięcie głowy węża i reszty ciała za nią
    if (!board.IsValidPosition(Head)) // sprawdzenie czy wąż stoi na dozwolonej pozycji, warunek to 0<=x && 0<=y && x<width && y<=height
    {
        Die(); // Zabij węża, ustaw jakieś flagi, zmień stan gry, cokolwiek
    }
}
  • Rejestracja: dni
  • Ostatnio: dni
0

To nie dzielenie.
Jeżeli głowa znajduje się w liście o indeksie 'q' wtedy :

Kopiuj

if(snakeBody[q].X ==0 || snakeBody[q].Y == 0 || snakeBody[q].X == okno.Width || snakeBody[q].Y == okno.Height)
         JakaśMetodaOdpowiedzialnaZaZakończenieGry();
msm
  • Rejestracja: dni
  • Ostatnio: dni
2
Czarny Kot napisał(a):

To nie dzielenie.
Jeżeli głowa znajduje się w liście o indeksie 'q' wtedy :

Kopiuj

if(snakeBody[q].X ==0 || snakeBody[q].Y == 0 || snakeBody[q].X == okno.Width || snakeBody[q].Y == okno.Height)
         JakaśMetodaOdpowiedzialnaZaZakończenieGry();

Dlaczego == a nie <=?

Na razie to dokładnie to samo, ale co jesli w przyszłości:

  • dojdzie "ulepszenie węża" gdzie wąż będzie skakał/chodził co dwa pola (i wąż przeskoczy ścianę)
  • dojdzie jakiś teleport, i wąż zostanie przeniesiony poza planszę (i wąż znajdzie się za planszą)
  • plansza z jakiegoś powodu zostanie zmniejszona w środku gry (i wąż znajdzie się za nią)
  • i jeszcze duzo więcej zmian wymagań które trudno przewidzieć

To tylko gra w węża pisana prawdopodobnie dla zabawy, ale moim zdaniem dużo bardziej 'future proof' jest stosowanie < albo <= zamiast == wszędzie gdzie się da.

  • Rejestracja: dni
  • Ostatnio: dni
1

Ma Pan 100% rację, ale jako, że autorowi chodziło o klasycznego snake'a to starałem się udzielić odpowiedzi zgodnej z jego wymaganiami.
Pozdrawiam

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.