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.2
Wersja 1.3
Wersja 1.4

Zmiany (1.2):
-sterowanie przeniesione z W,S,A,D na strzałki,
-wąż i owoce w postaci graficznej

Zmiany (1.3):
-buforowanie wszystkich pól
-zwiększenie hermetycznosci

Zmiany (1.4):
-usunięcie niejawnego eval() z setTimeout()
-uproszczenie związane z klasą css

  1. <script type="text/javascript" src="jquery-1.4.1.min.js"></script>
  2. <script type="text/javascript">
  3. <!--
  4.  
  5. function Snake(nazwa,rozmiar/*planszy*/,szybkosc,maxOwocow)
  6. {
  7. /* Snake by Pawel 'lord_T' Maruszczyk
  8. * Silesia, February 2010, version 1.4
  9. * License MIT
  10. */
  11.  
  12. var ileOwoc=0;
  13. var maxOwoc=(maxOwocow-1||2);
  14. var dlugosc=2; //glowa + ogon
  15. var ogon=[];
  16. var ruch=true;
  17. var i;
  18. var j;
  19. var macierz;
  20. var ths=this;
  21.  
  22. this.kierunek='d';//'u','r','l'
  23. this.niemozliwy=40;//w dol - kierunek niemozliwy do wybrania (kod klawisza)
  24.  
  25.  
  26. //aktualizacja ogona
  27. this.addTail=function(a,b){
  28.  
  29. var tmpK=null;
  30. if(ogon[0])
  31. switch(ogon[0].uklad.p){
  32. case 'l': tmpK='r'; break;
  33. case 'r': tmpK='l'; break;
  34. case 'u': tmpK='d'; break;
  35. default: tmpK='u';
  36. }
  37.  
  38. ogon.unshift({i:a, j:b, uklad:{p/*oczatek*/:this.kierunek, k/*oniec*/:tmpK} });
  39.  
  40. if( (ogon.length+1) >dlugosc ){
  41. var usuniety=ogon.pop();
  42. macierz[usuniety.i][usuniety.j].removeClass();
  43. }
  44. }
  45.  
  46. //sprawdzanie kolizji glowy z ogonem i owocami
  47. this.checkCol/*isions*/=function(i,j){
  48.  
  49. var count=ogon.length;
  50. for(var k=1;k<count;++k)
  51. if(ogon[k].i==i && ogon[k].j==j){
  52. ruch=false;
  53. break;
  54. }
  55.  
  56. if(macierz[i][j].hasClass('owoc')){
  57. ++dlugosc;
  58. --ileOwoc;
  59. macierz[i][j].removeClass().addClass('glowa'+this.kierunek);
  60. }
  61. }
  62.  
  63. //kolorowanie glowy i sprawdzenie kolizji
  64. this.putHead=function(a,b){
  65.  
  66. macierz[a][b].addClass('glowa'+this.kierunek);
  67. this.checkCol(a,b);
  68. i=a;
  69. j=b;
  70. }
  71.  
  72. //kolorowanie ogona
  73. this.moveTail=function(){
  74.  
  75. for(var k=0;k<ogon.length;++k)
  76. {
  77. //budowanie nazwy klasy
  78. var tmp='ogon'+ogon[k].uklad.p;
  79.  
  80. if(k<ogon.length-1)
  81. tmp+= ogon[k].uklad.k;
  82.  
  83. macierz[ogon[k].i][ogon[k].j].removeClass().addClass(tmp);
  84. }
  85. }
  86.  
  87. //ruch glowy w wybranym kierunku i aktualizacja ogona
  88. this.moveHead=function(){
  89.  
  90. this.addTail(i,j);
  91. switch(this.kierunek){
  92. case 'd': this.niemozliwy=38; ++i; i%=rozmiar;break;
  93. case 'u': this.niemozliwy=40; i+=(rozmiar-1); i%=rozmiar;break;
  94. case 'l': this.niemozliwy=39; j+=(rozmiar-1); j%=rozmiar;break;
  95. case 'r': this.niemozliwy=37; ++j; j%=rozmiar; break;
  96. }
  97. this.putHead(i,j);
  98. }
  99.  
  100. //wstawianie owocow na plansze
  101. this.putFruit=function(){
  102.  
  103. if(ileOwoc <= maxOwoc){
  104. var losI=Math.floor(Math.random() * rozmiar);
  105. var losJ=Math.floor(Math.random() * rozmiar);
  106. var wolne=true;
  107.  
  108. if(i==losI && j==losJ) wolne=false;
  109.  
  110. if(wolne){
  111. var count=ogon.length;
  112. for(var k=0;k<count;++k)
  113. if(ogon[k].i==losI && ogon[k].j==losJ){
  114. wolne=false;
  115. break;
  116. }
  117. }
  118.  
  119. if(wolne){
  120. macierz[losI][losJ].addClass('owoc');
  121. ++ileOwoc;
  122. }
  123. }
  124.  
  125. nastOwoc=Math.floor(Math.random())+8.5*szybkosc;
  126. setTimeout(ths.putFruit,nastOwoc);
  127. }
  128.  
  129. //petla czasu - rusza wezem
  130. this.timeLoop=function(){
  131.  
  132. ths.moveHead();
  133. ths.moveTail();
  134. if(ruch)
  135. setTimeout(ths.timeLoop,szybkosc);
  136. else{
  137. $('#waz div').css('background','#ccc');
  138. $('#waz').after($('<div id="gameover">KONIEC GRY<br />Zdobyte punkty: '+Math.round((1+(rozmiar*rozmiar))/20*dlugosc)+'<input type="button" value="Nowa gra" onclick="window.location.reload()"></div>'));// ((1+r*r)*n/2)/10=suma c.arytm/10
  139. }
  140. }
  141.  
  142. //przygotowanie planszy
  143. this.makeSnakesPlace=function(){
  144.  
  145. macierz=new Array(rozmiar);
  146. var tabelaPola=$('<table id="waz"></table>');
  147. for(var i=0;i<rozmiar;++i){
  148. macierz[i]=new Array(rozmiar);
  149. var wiersz=$('<tr>');
  150. for(var j=0;j<rozmiar;++j){
  151. macierz[i][j]=$('<div>').appendTo($('<td>').appendTo(wiersz));
  152. }
  153.  
  154. tabelaPola.append(wiersz);
  155. }
  156.  
  157. $('body').append(tabelaPola);
  158.  
  159. $(document).keydown(function(e){
  160. var key=(e||window.event).keyCode;
  161. if(key!=ths.niemozliwy)
  162. switch(key){
  163. case 40:ths.kierunek='d'; break;
  164. case 38:ths.kierunek='u'; break;
  165. case 37:ths.kierunek='l'; break;
  166. case 39:ths.kierunek='r'; break;
  167. }
  168. });
  169.  
  170. this.putHead(0,2);
  171. this.putFruit();
  172. this.timeLoop();
  173.  
  174. }//make
  175.  
  176. this.makeSnakesPlace();
  177. }//objekt snake
  178.  
  179. $('document').ready(function(){
  180. Waz=new Snake('Waz',10,300);
  181. });
  182. //-->
  183.  
  184. <style type="text/css">
  185. /* <![CDATA[ */
  186. div{
  187. height:20px;
  188. width:20px;
  189. }
  190.  
  191. div.owoc{background-image:url('fruit.png');}
  192.  
  193. div.glowar{background-image:url('head-r.png');}
  194. div.glowal{background-image:url('head-l.png');}
  195. div.glowad{background-image:url('head-d.png');}
  196. div.glowau{background-image:url('head-u.png');}
  197.  
  198. div.ogonl{background-image:url('tail-l.png');}
  199. div.ogonr{background-image:url('tail-r.png');}
  200. div.ogonu{background-image:url('tail-u.png');}
  201. div.ogond{background-image:url('tail-d.png');}
  202.  
  203. div.ogonll,
  204. div.ogonrr,
  205. div.ogonrl,
  206. div.ogonlr{background-image:url('r-l.png');}
  207.  
  208. div.ogonud,
  209. div.ogonuu,
  210. div.ogondd,
  211. div.ogondu{background-image:url('u-d.png');}
  212.  
  213. div.ogonru,
  214. div.ogonur{background-image:url('u-r.png');}
  215.  
  216. div.ogonlu,
  217. div.ogonul{background-image:url('u-l.png');}
  218.  
  219. div.ogonrd,
  220. div.ogondr{background-image:url('d-r.png');}
  221.  
  222. div.ogonld,
  223. div.ogondl{background-image:url('d-l.png');}
  224.  
  225. table#waz,#gameover{
  226. margin:20px auto;
  227. padding:0;
  228. border-spacing:0px;
  229. }
  230.  
  231. table#waz div{
  232. background-color:#217F25;
  233. }
  234.  
  235. #gameover{
  236. width:200px;
  237. text-align:center;
  238. }
  239.  
  240. td,tr{
  241. padding:0;
  242. margin:0;
  243. border:0;
  244. }
  245.  
  246. input{margin:10px;}
  247. /* ]]> */


Ten post edytował lord_t 5.02.2010, 12:09:41
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
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 11.10.2025 - 18:03