Wersja 1.5Zmiany (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:)
<script type="text/javascript" src="jquery-1.4.1.min.js"></script> <script type="text/javascript" src="DD_belatedPNG.js"></script> <script type="text/javascript"> <!--
function Snake(rozmiar/*planszy*/,szybkosc,maxOwocow)
{
/* Snake by Pawel 'lord_T' Maruszczyk
* Silesia, February 2010, version 1.5
* License MIT
*/
var ileOwoc;
var maxOwoc;
var dlugosc;
var ogon;
var ruch;
var i;
var j;
var macierz;
var kierunek;
var niemozliwy;
var rama;
var stOwoce; //st = setTimout
var stRuch;
var pauza;
var padding;
//ustawienie parametrow poczatkowych
var setParams=function(){
ileOwoc=0;
maxOwoc=(maxOwocow||3);
dlugosc=2;//glowa + ogon
ogon=[];
ruch=true;
kierunek='d';//'u','r','l'
niemozliwy=40;//w dol - kierunek niemozliwy do wybrania (kod klawisza)
padding=Math.floor((rozmiar-1)/2)*20;
}
//aktualizacja ogona
var addTail=function(a,b){
var tmpK=null;
if(ogon[0])
switch(ogon[0].uklad.p){
case 'l': tmpK='r'; break;
case 'r': tmpK='l'; break;
case 'u': tmpK='d'; break;
default: tmpK='u';
}
ogon.unshift({i:a, j:b, uklad:{p/*oczatek*/:kierunek, k/*oniec*/:tmpK} });
if( (ogon.length+1) >dlugosc ){
var usuniety=ogon.pop();
macierz[usuniety.i][usuniety.j].removeClass();
}
}
//sprawdzanie kolizji glowy z ogonem i owocami
var checkCol/*isions*/=function(i,j){
var count=ogon.length;
for(var k=1;k<count;++k)
if(ogon[k].i==i && ogon[k].j==j){
ruch=false;
break;
}
if(macierz[i][j].hasClass('owoc')){
++dlugosc;
--ileOwoc;
macierz[i][j].removeClass().addClass('glowa'+kierunek);
}
}
//kolorowanie glowy i sprawdzenie kolizji
var putHead=function(a,b){
macierz[a][b].addClass('glowa'+kierunek);
checkCol(a,b);
i=a;
j=b;
}
//kolorowanie ogona
var moveTail=function(){
for(var k=0;k<ogon.length;++k)
{
//budowanie nazwy klasy
var tmp='ogon'+ogon[k].uklad.p;
if(k<ogon.length-1)
tmp+= ogon[k].uklad.k;
macierz[ogon[k].i][ogon[k].j].removeClass().addClass(tmp);
}
}
//ruch glowy w wybranym kierunku i aktualizacja ogona
var moveHead=function(){
addTail(i,j);
switch(kierunek){
case 'd': niemozliwy=38; ++i; i%=rozmiar;break;
case 'u': niemozliwy=40; i+=(rozmiar-1); i%=rozmiar;break;
case 'l': niemozliwy=39; j+=(rozmiar-1); j%=rozmiar;break;
case 'r': niemozliwy=37; ++j; j%=rozmiar; break;
}
putHead(i,j);
}
//wstawianie owocow na plansze
var putFruit=function(){
if(ileOwoc < maxOwoc){
var losI=Math.floor(Math.random() * rozmiar);
var losJ=Math.floor(Math.random() * rozmiar);
var wolne=true;
if(i==losI && j==losJ) wolne=false;
if(wolne){
var count=ogon.length;
for(var k=0;k<count;++k)
if(ogon[k].i==losI && ogon[k].j==losJ){
wolne=false;
break;
}
}
if(wolne && !macierz[losI][losJ].hasClass('owoc') ){
macierz[losI][losJ].addClass('owoc owoc'+Math.floor(Math.random()*3));
++ileOwoc;
}
}
var nastOwoc=Math.floor(Math.random())+8.5*szybkosc;
stOwoce=setTimeout(putFruit,nastOwoc);
}
//petla czasu - rusza wezem
var timeLoop=function(){
moveHead();
moveTail();
if(ruch)
stRuch=setTimeout(timeLoop,szybkosc);
else{
var rest=$('<div>Nowa gra</div>').click(function(){makeSnakesPlace(1);});
var govr=$('<div id="gameover">KONIEC GRY<br>Zdobyte punkty: '+Math.round((1+(rozmiar*rozmiar))/20*dlugosc)+'</div>');
govr.width(rozmiar*20).height(rozmiar*20-padding).css('padding-top',padding).append(rest);
$('table#waz').replaceWith(govr);
}
}
//wlacza/wylacza pauze
var togglePause=function(){
if(stRuch!=null && ruch){
clearTimeout(stOwoce);
clearTimeout(stRuch);
stRuch=null;
pauza.css({display:'block',zIndex:1001});
}
else{
putFruit();
timeLoop();
pauza.css({display:'none',zIndex:0});
}
}
//wczytuje do pamieci wszystkie obrazki i wspomaga png w IE
var preloadImages=function(){
var klasy=['owoc0','owoc1','owoc2','glowar','glowal','glowad','glowau','ogonr','ogonl','ogond','ogonu','ogonlr','ogondu','ogonur','ogonul','ogondl','ogondr'];
for(var p in klasy)
$('body').append($('<div class="cache">').addClass(klasy[p]));
//tylko IE
if($.browser.msie){
DD_belatedPNG.fix('div#t, div#b,div#l, div#r,div#tl,div#tr,div#bl,div#br');
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'];
for(var i=0;i<document.styleSheets.length;++i){
var css=document.styleSheets[i].rules;
if (document.styleSheets[i].title=="waz"){
for(var j=0;j<css.length && png.length>0;++j){
var r=css[j];
for(var k=0;k<png.length;++k){
if(r.selectorText.toLowerCase()==png[k]){
var src=r.style.backgroundImage.toString();
src=src.substring(4,src.lastIndexOf(')'))
r.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"',sizingMethod='crop');";
r.style.background='none';
png.splice(k,1);
k=100;//zakonczy biezaca petle
}
}
}
break;
}
}
}
}
//przygotowanie planszy
var makeSnakesPlace=function(restart){
setParams();
macierz=new Array(rozmiar);
var tabelaPola=$('<table id="waz"></table>');
for(var i=0;i<rozmiar;++i){
macierz[i]=new Array(rozmiar);
var wiersz=$('<tr>');
for(var j=0;j<rozmiar;++j){
macierz[i][j]=$('<div>').appendTo($('<td>').appendTo(wiersz));
}
tabelaPola.append(wiersz);
}
if(restart)
rama.find('#gameover').replaceWith(tabelaPola);
else{
//budowa obramowania i pauzy
var szerokosc=rozmiar*20;
pauza =$('<div id="pause"><div style="padding-top:'+padding+'px">PAUZA</div></div>').css({width:szerokosc,height:szerokosc,opacity:'0.7'});
var boki =$('<div id="b"></div><div id="t"></div>').width(szerokosc);
var brzegi=$('<div id="r"></div><div id="l"></div>').height(szerokosc);
rama =$('<div id="rama"><div id="tl"></div><div id="tr"></div><div id="bl"></div><div id="br"></div></div>');
rama.width(szerokosc+20).height(szerokosc+20).append(pauza).append(boki).append(brzegi).append(tabelaPola);
$('body').append(rama);
}
$(document).keydown(function(e){
var key=(e||window.event).keyCode;
if(key==32)
togglePause(); //pauzowanie na spacji
else if(key!=niemozliwy && stRuch!=null)
switch(key){
case 40:kierunek='d'; break;
case 38:kierunek='u'; break;
case 37:kierunek='l'; break;
case 39:kierunek='r'; break;
}
});
putHead(0,2);
putFruit();
timeLoop();
return rama;//uchwyt do weza
}//make
preloadImages();
return makeSnakesPlace();
}//objekt snake
$('document').ready(function(){
var waz=Snake(12,230);
//$('#srodek').prepend(waz); //przykład wklejenia węża w div o id "srodek"
});
//-->
<style type="text/css" title="waz"> /* <![CDATA[ */
/*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