Snake w JavaScript

0

Nie wiem czy to dobry dział na tego typu temat, ale chciałem się pochwalić własnoręcznie zrobioną, prostą grą (znany i lubiany Snake) w JavaScripcie.

Klawiszologia jest dość prosta: sterujemy strzałkami, <spacja> pauzuje/wznawia/rozpoczyna grę.

Nieźle nagłowiłem się także nad stworzeniem highscore'a (mogą być problemy z aktualizacją, gdyż dane [w postaci generowanego skryptu JS] zapisują się w cache przeglądarki, ale jako tako działa) :)
Mam nadzieję, że nie naruszam żadnego punktu regulaminu i że skrypt jest w pełni kompatybilny :)

Oto link: http://www.mm.pl/~pawel.s1/plansza.html

Miłej zabawy :)
PS.: Z góry proszę, nie cwaniakujcie, że udało wam się dodać do bazy jakiś miliardowy wynik, gdyż nie pracowałem jeszcze nad zabezpieczeniami i nie ma się praktycznie czym chwalić :) Poza tym, oszczędzicie mi pracy nad usuwaniem tego bałaganu.

0

Nie działa w FF 3.0

0

Czyżby nie działała obsługa klawiatury ?
Tu jest właśnie słaby punkt tego skryptu (nie mogę go rozgryźć)

Ogólnie zasada jest taka: pod zdarzenie onKeyDown podczepiana jest procedura snakeKeyboard która wygląda tak:

function snakeKeyboard()
   {
   d=p=0;
   if (typeof(Event)=='function') { //NN
      var kod=e.which;
      var shift=e.modifiers & Event.SHIFT_MASK;
      var alt=e.modifiers & Event.ALT_MASK;
      var ctrl=e.modifiers & Event.CONTROL_MASK;
      } else { //IE
      var kod=event.keyCode;
      var shift = event.shiftKey;
      var alt = event.altKey;
      var ctrl = event.ctrlKey;
      }
      if ((kod==38)&&(snakeTurn!=3))
      {
         snakeTurn=1;
      }
      if ((kod==39)&&(snakeTurn!=4))
      {
         snakeTurn=2;
      }      
      if ((kod==40)&&(snakeTurn!=1))
      {
         snakeTurn=3;
      }
      if ((kod==37)&&(snakeTurn!=2))
      {
         snakeTurn=4;
      }
      if (kod==32)
      {
         if ((snakePause==0)&&(gameEnd==0))
         {
            gamePauseOn();
            snakePause=1;
         } else
         if ((snakePause==1)&&(gameEnd==0))
         {
            gamePauseOff();
         } else
         if ((snakePause==1)&&(gameEnd==1))
         {
            gameRestart();
         }
      }
   }
//   ...
 document.onkeydown=snakeKeyboard;

Ale właśnie w Firefoxie coś nie chce to działać. [???]

0

Dzięki wielkie :) Tylko nie wiem czy prawidłowo to zaimplementowałem
Wrzuciłem to do tej funkcji obsługi zdarzenia:

var evtobj=window.event? event : e
var kod=evtobj.charCode? evtobj.charCode : evtobj.keyCode

... i oby teraz działało :) w IE śmiga :)

0

pod opera ok, tylko:
normalnie gdy sunie np w lewo nie moge zrobic w prawo zeby sie cofnal i zabił, ale moge dac w tej samej klatce czy cos góra, prawo - i sie zabije, choc nie przesunie sie do gory. raz zamiast sie zabic - zawrocil (dlugosc: 2). innym razem nie pojawil mi sie punkt do zjedzenia - okazało się ze byl sobie gdzies tam jak wjechalem w sciane.

edit: to znikniecie okazalo sie tym ze dolu planszy nie widac w operze - jest cala szara, dopoki sie nie zabije i nie widac punktacji

0
dzek69 napisał(a)

pod opera ok, tylko:
normalnie gdy sunie np w lewo nie moge zrobic w prawo zeby sie cofnal i zabił, ale moge dac w tej samej klatce czy cos góra, prawo - i sie zabije, choc nie przesunie sie do gory. raz zamiast sie zabic - zawrocil (dlugosc: 2). innym razem nie pojawil mi sie punkt do zjedzenia - okazało się ze byl sobie gdzies tam jak wjechalem w sciane.

edit: to znikniecie okazalo sie tym ze dolu planszy nie widac w operze - jest cala szara, dopoki sie nie zabije i nie widac punktacji

Faktycznie, jak szybko zmienisz kierunek na góra, prawo - wąż się ukąsi, gdyż jeszcze przed wykonaniem ruchu zmieniasz jego kierunek, a zabezpieczenie wtedy obejmuje tylko blokadę zmiany kierunku w dół. Musiałbym nad tym popracować.

Tylko ten brak dołu planszy mnie zastanawia. Mógłbyś dać screena jak to wygląda ?

0

Masz wideo:
http://upload.dzek.metal.info/pliki/vid.avi
nie wiem dlaczego teraz chce zebym sie na liste wpisywal nawet jak mam marny wynik..

0

Ponieważ ktoś ostatnio zrobił prosty atak, wpisując pusty ciąg jako wartość czasu i blokując tym samym skrypt. Już to uniemożliwiłem. Na 10 TOP miejsc, jest 9 wyników, stąd prosi Cię o wpisanie nicku :)

EDIT: Nie mam pojęcia dlaczego ci tak ucina. Zasada skryptu jest taka: tworzy tablicę 35x35, oznacza je odpowiednimi id i barwi tylko odpowiednie komórki.

EDIT2: Argh... zdałem sobie sprawę, że skorzystałem z przestarzałego document.write(). Być może wszystkiego przez to nie wpisuje (choć jest to mało prawdopodobne, bo wywaliłoby błąd w skrypcie, że obiekt o tym id nie istnieje, czy coś w ten deseń). A może to jakieś ograniczenia Opery ? Nie mam pojęcia, z tym document.write poprawię później :)

0

czy ty przepisujesz cala tablice co klatke? bo tak to wyglada (nie po kodzie js patrze tylko po tym co widze w opera dragonfly)?
mowiles ze barwi odpowiednie komorki, ale mi to jakos tak nie wyglada..

0

Nie, no co ty :)
Nawet wszystkich komórek nie barwię, tylko te co się zmieniają. JavaScript jest dość powolny w niektórych przeglądarkach, więc musiałem to jak najbardziej optymalizować.

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