Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [jQuery] Snake, Wężyk z prostą grafą.
lord_t
post
Post #1





Grupa: Zarejestrowani
Postów: 603
Pomógł: 131
Dołączył: 24.07.2007
Skąd: Górny Śląsk

Ostrzeżenie: (0%)
-----


W ramach ćwiczenia się w js i jQuery(wersja: 1.2.3) postanowiłem popełnić Snake'a, który w praktyce wygląda tak: SNAKE

Info:
-sterowanie na klawiszach W,S,A,D
-jestem świadom, że odznaczenie inputa sprawia, że gra nie działa.

Kody:

jQuery:
  1. <script type="text/javascript" src="jquery-1.2.3.min.js"></script>
  2. <script type="text/javascript">
  3. <!--
  4.  
  5. function Snake(nazwa_,rozmiarPlanszy_,szybkosc_,maxOwocow_)
  6. {
  7. /* Snake by Pawel 'lord_T' Maruszczyk
  8. * Silesia, July 2008, version 1.0
  9. * License MIT
  10. */
  11.  
  12. this.rozmiar=rozmiarPlanszy_;
  13. this.ileOwoc=0;
  14. this.maxOwoc=maxOwocow_|2;
  15. this.dlugosc=2; //glowa + ogon
  16. this.ogon=[];
  17. this.szybkosc=szybkosc_;
  18. this.nazwa=nazwa_;
  19. this.ruch=true;
  20. this.i;
  21. this.j;
  22. this.macierz;
  23. this.kierunek='down';//'up','right','left'
  24. this.niemozliwy='s';//kierunek niemozliwy do wybrania (ktory klawisz)
  25. var ths=this;
  26.  
  27. //aktualizacja ogona
  28. this.addTail=function(a,b)
  29. {
  30. this.ogon.unshift({i:a,j:b});
  31. if( (this.ogon.length+1) >this.dlugosc )
  32. {
  33. var usuniety=this.ogon.pop();
  34. $('#'+usuniety.i+'_'+usuniety.j).removeClass().addClass('pole');
  35. }
  36. }
  37.  
  38. //sprawdzanie kolizji glowy z ogonem i owocami
  39. this.checkCol/*isions*/=function(i,j)
  40. {
  41. var count=this.ogon.length;
  42. for(var k=1;k<count;++k)
  43. if(this.ogon[k].i==i && this.ogon[k].j==j){
  44. this.ruch=false;
  45. break;
  46. }
  47. if($('#'+i+'_'+j).hasClass('owoc')){
  48. ++this.dlugosc;
  49. --this.ileOwoc;
  50. $('#'+i+'_'+j).removeClass().addClass('glowa');
  51. }
  52. }
  53.  
  54. //kolorowanie glowy i sprawdzenie kolizji
  55. this.putHead=function(i,j)
  56. {
  57. $('#'+i+'_'+j).addClass('glowa');
  58. this.checkCol(i,j);
  59. this.i=i;
  60. this.j=j;
  61. }
  62.  
  63. //kolorowanie ogona
  64. this.moveTail=function()
  65. {
  66. for(var k=0;k<this.ogon.length;++k)
  67. $('#'+this.ogon[k].i+'_'+this.ogon[k].j).addClass('ogon');
  68. }
  69.  
  70. //ruch glowy w wybranym kierunku i aktualizacja ogona
  71. this.moveHead=function()
  72. {
  73. this.addTail(this.i,this.j);
  74. switch(ths.kierunek)
  75. {
  76. case 'down': ths.niemozliwy='w';++this.i;this.i%=this.rozmiar;break;
  77. case 'up' : ths.niemozliwy='s';this.i+=(this.rozmiar-1);this.i%=this.rozmiar;break;
  78. case 'left': ths.niemozliwy='d';this.j+=(this.rozmiar-1);this.j%=this.rozmiar;break;
  79. case 'right':ths.niemozliwy='a';++this.j;this.j%=this.rozmiar; break;
  80. }
  81. this.putHead(this.i,this.j);
  82. }
  83.  
  84. //wstawianie owocow na plansze
  85. this.putFruit=function()
  86. {
  87. if(this.ileOwoc<=this.maxOwoc){
  88. var losI=Math.floor(Math.random() * this.rozmiar);
  89. var losJ=Math.floor(Math.random() * this.rozmiar);
  90. var wolne=true;
  91.  
  92. if(this.i==losI && this.j==losJ) wolne=false;
  93. if(wolne){
  94. var count=this.ogon.length;
  95. for(var k=0;k<count;++k)
  96. if(this.ogon[k].i==losI && this.ogon[k].j==losJ){
  97. wolne=false;
  98. break;
  99. }
  100. }
  101. if(wolne){
  102. $('#'+losI+'_'+losJ).addClass('owoc');
  103. ++this.ileOwoc;
  104. }
  105. }
  106.  
  107. nastOwoc=Math.floor(Math.random())+8.5*ths.szybkosc;
  108. setTimeout(ths.nazwa+".putFruit()",nastOwoc);
  109. }
  110.  
  111. //petla czasu - rusza wezem
  112. this.timeLoop=function()
  113. {
  114. this.moveHead();
  115. this.moveTail();
  116. if(this.ruch)
  117. setTimeout(ths.nazwa+".timeLoop()",ths.szybkosc);
  118. else{
  119. $('.waz div').css('background','#ccc');
  120. $('.waz').after($('<div id="gameover">GAME OVER</div>'));
  121. }
  122. }
  123.  
  124. //przygotowanie planszy
  125. this.makeSnakesPlace=function()
  126. {
  127. n=this.rozmiar;
  128. this.macierz=new Array(n);
  129. var tabelaPola=$('<table class="waz"></table>');
  130. for(var i=0;i<this.rozmiar;++i)
  131. {
  132. this.macierz[i]=new Array(n);
  133. var wiersz=$('<tr></tr>');
  134. for(var j=0;j<this.rozmiar;++j)
  135. {
  136. this.macierz[i][j]=0;
  137. wiersz.append($('<td><div class="pole" id="'+i+'_'+j+'"></div></td>'));
  138. }
  139. tabelaPola.append(wiersz);
  140. }
  141. $('body').append(tabelaPola).append('<input style="width:0;color:white" type="text" id="czytnik"/>');
  142. $('#czytnik').focus();
  143.  
  144. $('#czytnik').keypress(function(e){
  145. $(this).val('');
  146. var key=String.fromCharCode(e.which);
  147. if(key!=ths.niemozliwy)
  148. switch(key){
  149. case 's':ths.kierunek='down'; break;
  150. case 'w':ths.kierunek='up'; break;
  151. case 'a':ths.kierunek='left'; break;
  152. case 'd':ths.kierunek='right'; break;
  153. }
  154. });
  155. this.putHead(0,2);
  156. this.putFruit();
  157. this.timeLoop();
  158. }//make
  159.  
  160. this.makeSnakesPlace();
  161. }//objekt snake
  162.  
  163. $('document').ready(function(){
  164. Waz=new Snake('Waz',10,300);
  165. });
  166. //-->


css:
Kod
<style type="text/css">
/* <![CDATA[ */
div{
height:20px;
width:20px;
}

div.pole{
background:#217F25;
}

div.glowa{
background:yellow;
}

div.ogon{
background:red;
}

div.owoc{
background:blue;
}

table.waz,#gameover
{
margin:20px auto;
padding:0;
}

#gameover{
width:100px;
}

td,tr{
    padding:0;
    margin:0;
    border:0;
}
/* ]]> */
</style>


Trochę mi ten kod przycięło do lewej, no ale tak działa forum na tabulacje;) Ładniejszy w źródle strony:)

Ten post edytował lord_t 18.07.2008, 21:19:39
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
lord_t
post
Post #2





Grupa: Zarejestrowani
Postów: 603
Pomógł: 131
Dołączył: 24.07.2007
Skąd: Górny Śląsk

Ostrzeżenie: (0%)
-----


Wersja 1.5

Zmiany (1.5):
-grafika (w pełnym tego słowa znaczeniu)
-pauza (spacja)
-Snake() zwraca uchwyt do gry
-preload obrazów(owoce, części węża)
-restartowanie (bez odświeżania strony)

P.S. Byłbym wdzięczny na sprawdzenie wyglądu w IE7 i ewentualnie jakiś zrzut ekranu w przypadku błędu.
P.S.2. @ShadowD: jeśli rozwinę to pomyślę nad tymi przeszkodami:)

  1. <script type="text/javascript" src="jquery-1.4.1.min.js"></script>
  2. <script type="text/javascript" src="DD_belatedPNG.js"></script>
  3. <script type="text/javascript">
  4. <!--
  5.  
  6. function Snake(rozmiar/*planszy*/,szybkosc,maxOwocow)
  7. {
  8. /* Snake by Pawel 'lord_T' Maruszczyk
  9. * Silesia, February 2010, version 1.5
  10. * License MIT
  11. */
  12.  
  13. var ileOwoc;
  14. var maxOwoc;
  15. var dlugosc;
  16. var ogon;
  17. var ruch;
  18. var i;
  19. var j;
  20. var macierz;
  21. var kierunek;
  22. var niemozliwy;
  23. var rama;
  24. var stOwoce; //st = setTimout
  25. var stRuch;
  26. var pauza;
  27. var padding;
  28.  
  29. //ustawienie parametrow poczatkowych
  30. var setParams=function(){
  31.  
  32. ileOwoc=0;
  33. maxOwoc=(maxOwocow||3);
  34. dlugosc=2;//glowa + ogon
  35. ogon=[];
  36. ruch=true;
  37. kierunek='d';//'u','r','l'
  38. niemozliwy=40;//w dol - kierunek niemozliwy do wybrania (kod klawisza)
  39. padding=Math.floor((rozmiar-1)/2)*20;
  40. }
  41.  
  42.  
  43. //aktualizacja ogona
  44. var addTail=function(a,b){
  45.  
  46. var tmpK=null;
  47. if(ogon[0])
  48. switch(ogon[0].uklad.p){
  49. case 'l': tmpK='r'; break;
  50. case 'r': tmpK='l'; break;
  51. case 'u': tmpK='d'; break;
  52. default: tmpK='u';
  53. }
  54.  
  55. ogon.unshift({i:a, j:b, uklad:{p/*oczatek*/:kierunek, k/*oniec*/:tmpK} });
  56.  
  57. if( (ogon.length+1) >dlugosc ){
  58. var usuniety=ogon.pop();
  59. macierz[usuniety.i][usuniety.j].removeClass();
  60. }
  61. }
  62.  
  63. //sprawdzanie kolizji glowy z ogonem i owocami
  64. var checkCol/*isions*/=function(i,j){
  65.  
  66. var count=ogon.length;
  67. for(var k=1;k<count;++k)
  68. if(ogon[k].i==i && ogon[k].j==j){
  69. ruch=false;
  70. break;
  71. }
  72.  
  73. if(macierz[i][j].hasClass('owoc')){
  74. ++dlugosc;
  75. --ileOwoc;
  76. macierz[i][j].removeClass().addClass('glowa'+kierunek);
  77. }
  78. }
  79.  
  80. //kolorowanie glowy i sprawdzenie kolizji
  81. var putHead=function(a,b){
  82.  
  83. macierz[a][b].addClass('glowa'+kierunek);
  84. checkCol(a,b);
  85. i=a;
  86. j=b;
  87. }
  88.  
  89. //kolorowanie ogona
  90. var moveTail=function(){
  91.  
  92. for(var k=0;k<ogon.length;++k)
  93. {
  94. //budowanie nazwy klasy
  95. var tmp='ogon'+ogon[k].uklad.p;
  96.  
  97. if(k<ogon.length-1)
  98. tmp+= ogon[k].uklad.k;
  99.  
  100. macierz[ogon[k].i][ogon[k].j].removeClass().addClass(tmp);
  101. }
  102. }
  103.  
  104. //ruch glowy w wybranym kierunku i aktualizacja ogona
  105. var moveHead=function(){
  106.  
  107. addTail(i,j);
  108. switch(kierunek){
  109. case 'd': niemozliwy=38; ++i; i%=rozmiar;break;
  110. case 'u': niemozliwy=40; i+=(rozmiar-1); i%=rozmiar;break;
  111. case 'l': niemozliwy=39; j+=(rozmiar-1); j%=rozmiar;break;
  112. case 'r': niemozliwy=37; ++j; j%=rozmiar; break;
  113. }
  114. putHead(i,j);
  115. }
  116.  
  117. //wstawianie owocow na plansze
  118. var putFruit=function(){
  119.  
  120. if(ileOwoc < maxOwoc){
  121. var losI=Math.floor(Math.random() * rozmiar);
  122. var losJ=Math.floor(Math.random() * rozmiar);
  123. var wolne=true;
  124.  
  125. if(i==losI && j==losJ) wolne=false;
  126.  
  127. if(wolne){
  128. var count=ogon.length;
  129. for(var k=0;k<count;++k)
  130. if(ogon[k].i==losI && ogon[k].j==losJ){
  131. wolne=false;
  132. break;
  133. }
  134. }
  135.  
  136. if(wolne && !macierz[losI][losJ].hasClass('owoc') ){
  137. macierz[losI][losJ].addClass('owoc owoc'+Math.floor(Math.random()*3));
  138. ++ileOwoc;
  139. }
  140.  
  141. }
  142.  
  143. var nastOwoc=Math.floor(Math.random())+8.5*szybkosc;
  144. stOwoce=setTimeout(putFruit,nastOwoc);
  145. }
  146.  
  147. //petla czasu - rusza wezem
  148. var timeLoop=function(){
  149.  
  150. moveHead();
  151. moveTail();
  152. if(ruch)
  153. stRuch=setTimeout(timeLoop,szybkosc);
  154. else{
  155. var rest=$('<div>Nowa gra</div>').click(function(){makeSnakesPlace(1);});
  156. var govr=$('<div id="gameover">KONIEC GRY<br>Zdobyte punkty: '+Math.round((1+(rozmiar*rozmiar))/20*dlugosc)+'</div>');
  157. govr.width(rozmiar*20).height(rozmiar*20-padding).css('padding-top',padding).append(rest);
  158.  
  159. $('table#waz').replaceWith(govr);
  160. }
  161. }
  162.  
  163. //wlacza/wylacza pauze
  164. var togglePause=function(){
  165.  
  166. if(stRuch!=null && ruch){
  167. clearTimeout(stOwoce);
  168. clearTimeout(stRuch);
  169. stRuch=null;
  170. pauza.css({display:'block',zIndex:1001});
  171. }
  172. else{
  173. putFruit();
  174. timeLoop();
  175. pauza.css({display:'none',zIndex:0});
  176. }
  177. }
  178.  
  179. //wczytuje do pamieci wszystkie obrazki i wspomaga png w IE
  180. var preloadImages=function(){
  181.  
  182. var klasy=['owoc0','owoc1','owoc2','glowar','glowal','glowad','glowau','ogonr','ogonl','ogond','ogonu','ogonlr','ogondu','ogonur','ogonul','ogondl','ogondr'];
  183. for(var p in klasy)
  184. $('body').append($('<div class="cache">').addClass(klasy[p]));
  185.  
  186. //tylko IE
  187. if($.browser.msie){
  188. DD_belatedPNG.fix('div#t, div#b,div#l, div#r,div#tl,div#tr,div#bl,div#br');
  189.  
  190. var png=['div.owoc0','div.owoc1','div.owoc2','div.glowar','div.glowal','div.glowad','div.glowau','div.ogonl','div.ogonr','div.ogonu','div.ogond','div.ogonll', 'div.ogonrr','div.ogonrl','div.ogonlr','div.ogonud','div.ogonuu','div.ogondd','div.ogondu','div.ogonru','div.ogonur','div.ogonlu','div.ogonul','div.ogonrd', 'div.ogondr','div.ogonld','div.ogondl'];
  191.  
  192. for(var i=0;i<document.styleSheets.length;++i){
  193. var css=document.styleSheets[i].rules;
  194.  
  195. if (document.styleSheets[i].title=="waz"){
  196. for(var j=0;j<css.length && png.length>0;++j){
  197. var r=css[j];
  198.  
  199. for(var k=0;k<png.length;++k){
  200. if(r.selectorText.toLowerCase()==png[k]){
  201.  
  202. var src=r.style.backgroundImage.toString();
  203. src=src.substring(4,src.lastIndexOf(')'))
  204.  
  205. r.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"',sizingMethod='crop');";
  206. r.style.background='none';
  207.  
  208. png.splice(k,1);
  209. k=100;//zakonczy biezaca petle
  210. }
  211. }
  212. }
  213.  
  214. break;
  215. }
  216. }
  217. }
  218. }
  219.  
  220. //przygotowanie planszy
  221. var makeSnakesPlace=function(restart){
  222.  
  223. setParams();
  224.  
  225. macierz=new Array(rozmiar);
  226. var tabelaPola=$('<table id="waz"></table>');
  227. for(var i=0;i<rozmiar;++i){
  228. macierz[i]=new Array(rozmiar);
  229. var wiersz=$('<tr>');
  230. for(var j=0;j<rozmiar;++j){
  231. macierz[i][j]=$('<div>').appendTo($('<td>').appendTo(wiersz));
  232. }
  233.  
  234. tabelaPola.append(wiersz);
  235. }
  236.  
  237.  
  238. if(restart)
  239. rama.find('#gameover').replaceWith(tabelaPola);
  240. else{
  241. //budowa obramowania i pauzy
  242. var szerokosc=rozmiar*20;
  243. pauza =$('<div id="pause"><div style="padding-top:'+padding+'px">PAUZA</div></div>').css({width:szerokosc,height:szerokosc,opacity:'0.7'});
  244. var boki =$('<div id="b"></div><div id="t"></div>').width(szerokosc);
  245. var brzegi=$('<div id="r"></div><div id="l"></div>').height(szerokosc);
  246. rama =$('<div id="rama"><div id="tl"></div><div id="tr"></div><div id="bl"></div><div id="br"></div></div>');
  247. rama.width(szerokosc+20).height(szerokosc+20).append(pauza).append(boki).append(brzegi).append(tabelaPola);
  248.  
  249. $('body').append(rama);
  250. }
  251.  
  252. $(document).keydown(function(e){
  253. var key=(e||window.event).keyCode;
  254. if(key==32)
  255. togglePause(); //pauzowanie na spacji
  256. else if(key!=niemozliwy && stRuch!=null)
  257. switch(key){
  258. case 40:kierunek='d'; break;
  259. case 38:kierunek='u'; break;
  260. case 37:kierunek='l'; break;
  261. case 39:kierunek='r'; break;
  262. }
  263. });
  264.  
  265. putHead(0,2);
  266. putFruit();
  267. timeLoop();
  268.  
  269. return rama;//uchwyt do weza
  270. }//make
  271.  
  272. preloadImages();
  273. return makeSnakesPlace();
  274. }//objekt snake
  275.  
  276. $('document').ready(function(){
  277. var waz=Snake(12,230);
  278. //$('#srodek').prepend(waz); //przykład wklejenia węża w div o id "srodek"
  279.  
  280. });
  281.  
  282.  
  283. //-->
  284.  
  285.  
  286.  
  287. <style type="text/css" title="waz">
  288. /* <![CDATA[ */
  289.  
  290. /*css dostępny pod linkiem z grą - forum nie pozwoliło mi dać tak długiego postu, więc wyciąłem. */


Ten post edytował lord_t 21.02.2010, 17:53:00
Go to the top of the page
+Quote Post

Posty w temacie
- lord_t   [jQuery] Snake   18.07.2008, 21:17:51
- - bim2   zamiast $('#czytnik').keypress daj ...   21.07.2008, 23:55:04
- - lord_t   $(document).key... pomogło, thx. Jak zrobię ...   22.07.2008, 11:31:37
- - Szunaj85   Gierka nawet całkiem całkiem, ale według mnie: - p...   7.08.2008, 18:47:23
- - .radex   Jest ok, ale nic specjalnego. Można powiedzieć, że...   7.08.2008, 21:07:57
- - Миха   Gra bardzo fajna, oceniam na 8/10. Zamiast kolorow...   11.08.2008, 16:25:39
- - tiraeth   Widzę kilka literówek w kodzie, np. ths.niemozliwy...   11.08.2008, 17:27:41
- - Crozin   @tiraeth: autor wcześniej zrobiłKodvar ths=this;Ni...   11.08.2008, 17:50:01
- - Babcia@Stefa   Kodu nie oceniam (nie mam czasu przegląda...   11.08.2008, 19:19:05
- - lord_t   Najpierw trochę odpowiem: @tiraeth: to nie literów...   11.08.2008, 23:21:24
|- - zegarek84   ogólnie dobrze napisana aplikacja - na głębsze prz...   4.02.2010, 20:55:38
- - vokiel   Sterowanie w Operze wreszcie działa, aż się skusił...   12.08.2008, 07:51:42
- - snovvy   Straciłem na tej grze około 10 min świetna sprawa...   13.08.2008, 11:47:18
- - lord_t   RE: [jQuery] Snake   4.02.2010, 19:27:44
- - lord_t   Dzięki za konstruktywny komentarz - Twoje rady uwz...   5.02.2010, 01:49:25
- - zegarek84   teraz jadę w pociągu i deczo się "znieczuliłe...   5.02.2010, 10:47:50
- - lord_t   eval: bingo! Uważam, że nie ma sensu już nic ...   5.02.2010, 12:18:01
- - ShadowD   318, nie było już za bardzo gdzie się zmieścić, po...   5.02.2010, 12:37:02
- - lord_t   RE: [jQuery] Snake   21.02.2010, 17:50:47
- - darko   Kozackie! Tylko brakuje mi liczenia punktów z...   21.02.2010, 17:58:39
- - koderrr   swietne ! przydalaby sie jedynie lista graczy...   21.02.2010, 18:13:56
- - thomson89   Świetna gierka, a i postępy znakomite. Jak patrzę ...   21.02.2010, 22:00:02
- - frytek92   Naprawdę super jeszcze lepiej by było jak bym widz...   21.02.2010, 22:20:30


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 8.10.2025 - 10:07