Snake - problem z poruszaniem

Snake - problem z poruszaniem
R0
  • Rejestracja:około 17 lat
  • Ostatnio:około 10 lat
0

Witam, mam problem dotyczący gry Snake. Gra jest właściwie gotowa i działa, tyle, że chciałbym zrobić nieco inne poruszanie wężykiem. Aktualnie porusza się on w ten sposób, że wciśnięcie klawisza przesuwa go o jedno pole, a ja chcę, żeby wciśnięcie jednego klawisza nadawało mu kierunek, a wężyk był cały czas w ruchu.
Nie mam w ogóle pomysłu jak to zrealizować [???] Proszę o pomoc.

W razie potrzeby mogę zamieścić cały mój kod lub jakiś fragment.


FO
  • Rejestracja:ponad 19 lat
  • Ostatnio:prawie 15 lat
0

Jak naciska się klawisz kierunku to ustawiasz odpowiednią zmienną bool,a w pętli programu dopóki program działa badasz które bool-e są true i wywołujesz ten sam kod co teraz masz przy naciskaniu


R0
  • Rejestracja:około 17 lat
  • Ostatnio:około 10 lat
0

@Force A mógłbyś tak jakoś łopatologicznie wytłumaczyć? ;)


hauleth
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:dzień
0

Będzie to mniej więcej tak:

Kopiuj
bool idz = false;

if( /* wciśnięto klawisz */ ) {
 idz = true;
 /* reszta instrukcji */
}

while( idz ) {
 /* instrukcje chodzenia */ 
}

Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Jeśli chodzi o kierunki to ja bym robił tak:
zmienne kierunkowe int x,y;
plansza char plansza[X][X];
A poruszanie to
plansza[X][Y]=''; //stara pozycja ludzika
plansza[X+x][Y+y]='znak_ludzika'; //nowa pozycja ludzika

W zalezności od tego którą strzałkę ktos wciśnie to zmienne x,y dostaja wartości -1,0, albo 1

Jedyny problem to taki jak wczytywać klawisz jednoczesnie cały cas rysując. Nie wiem, może uzyć dwóch wątków?


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
OT
  • Rejestracja:ponad 20 lat
  • Ostatnio:ponad 11 lat
0

A to jak jeden ruch weza bedzie na jednym tyknieciu timera juz nie wystarczy? Tutaj żadnych wątków nie potrzeba, odpowiednio ustawiajac timer mozna ustawiac jak szybko chodzi wąż.

Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Ja załozyłem ze mówimy o snaku w konsoli, bez użycia komponentów i tym podobnych zabawek.
Czy autor mógłby sprecyzować z jakiego środowiska korzysta i jak dokładniej ten snake wygląda? (ja załozyłem że plansza to dwuwymiarowa tablica char)


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
R0
  • Rejestracja:około 17 lat
  • Ostatnio:około 10 lat
0

Wężyk jest pisany w konsoli (Windows), przy użyciu Dev-C++.
Mapa to: char Mapa[22][79];

Ruch wygląda w ten sposób:

Kopiuj
bool ruch()
{
     Poprawnosc = true;
     Kierunek = getch();
     Bufor.X = Glowa.X;
     Bufor.Y = Glowa.Y;
     switch (Kierunek)
     {
            case 'w': ruch_gora();
                     break;
            case 's': ruch_dol();
                     break;
            case 'd': ruch_prawo();
                     break;
            case 'a': ruch_lewo();
                     break;
            default: Poprawnosc = false;
                     return false;
     }
     ruch_tulowiem();
     return true;
}

Poprawnosc - zmienna bool sprawdzająca poprawnosc wejscia
Kierunek - zmienna char, przechowująca kierunek nadany przez gracza
Bufor - struktura przechowująca współrzędne miejsca, gdzie "przed chwilą" była głowa
Glowa - struktura przechowująca współrzędne głowy węża
ruch_tulowiem() - funkcja poruszająca tułowiem, żeby "nadążał" za głową

I tutaj funkcja ruch_gora()
(reszta wygląda analogicznie)

Kopiuj
bool ruch_gora()
{
     if (Glowa.X < 1)
     {
        Zderzenie = true;
        return false;
     }
     Mapa[Glowa.X][Glowa.Y] = ' ';
     Glowa.X--;
     Mapa[Glowa.X][Glowa.Y] = 'O';
     return true;
}

Zderzenie - zmienna bool kontrolująca, czy wężyk się zderzył ze ścianą (lub z własnym ogonem)

Aha i jeszcze zaznaczę, że nie umiem korzystać z takich rzeczy jak wątki, czy timer.
I właśnie cały problem polega na tym, że przy każdym wywołaniu funkcji ruch() oczekuje ona na znak i wychodzi na to, że Wężyk... jest grą turową :/


OT
  • Rejestracja:ponad 20 lat
  • Ostatnio:ponad 11 lat
0

No to chyba najprosciej bedzie zrobic drugi wątek, który będzie poruszać wężem. Mozesz na przyklad zadeklarowac zmienna globalna, ktorej wartosc bedzie mówić co ma robic wąż - ruch w dół, górę, prawo, lewo. Funkcja obsługi wątku sprawdza wartość zmiennej co jakiś ustalony czas i podejmuje decyzje w którym kierunku iść, może też dodatkowo wykrywać kolizje.

Wątek działa w tle, a główny program tylko czeka na klawisze i zmienia wartość tej zmiennej w zależności od potrzeb. Wydaje mi sie ze w tym przypadku obejdzie sie bez synchronizacji wątków - i tak bedzie dzialac, wiec nie jest to zbyt skomplikowane zadanie.

CR
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad 15 lat
0

w takim wypadku jednak 2 wątki...

już kiedyś coś takiego komuś tu napisałem (przykład z dwoma wątkami w jednym while(coś) lastbtn=getchar(); ), poszukać trzeba

adf88
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 12 lat
0

Dupa Jaś, żaden dodatkowy wątek, nic on nie da. Po pierwsze nie można użyć getchar, ani nic podobnego. Trzeba odczytać wciskany klawisz, a nie tekst ze standardowego wejścia (ten drugi musi być wypluty w oknie konsoli i potwierdzony enterem, poza tym blokuje aplikacje pÓÓÓÓki tego enter nie wciśniemy).

Rozwiązanie jest takie (przy użyciu conio.h i windows.h):

Kopiuj
while(!koniec)
{
   Sleep(1000);
   while(kbhit()) kierunek = getch();
   switch(kierunek)
   {
      //...
   }
}
R0
  • Rejestracja:około 17 lat
  • Ostatnio:około 10 lat
0

A tak właściwie to co to jest to kbhit()?


R0
  • Rejestracja:około 17 lat
  • Ostatnio:około 10 lat
0

Ale w sumie to rozwiązanie mnie zszokowało ;) najpierw straszą jakimiś wątkami, a później widzę tylko jedną linijkę rozwiązania :-O Dzięki za odpowiedzi ;-)
Pozdrawiam radoslav


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.