wiki.Colivre.net/Aurium/Games/ Esse site é Legal Demais para Internet Explorer

Aurium :: Games :: CaminhoJS

(function($){ 'use strict';

function dig2(num) { if( num < 10 ) return '0'+num; return ''+num; }

window.JogoCaminho = function JogoCaminho(local) { if(local) { if(typeof(local)=='string') this.local = $(local)[0]; else this.local = local; } else { this.local = document.body; } this.casaSelecionada = null; this.concluido = false; this.criaTabuleiro(); };

function eixoHTML(nome) { return '
'+nome+'
' }

JogoCaminho.prototype.criaTabuleiro = function() { var jogo = this; $(this.local).empty(); var ctrlBox = $('
').appendTo(this.local)[0]; $('G/P') .appendTo(ctrlBox)[0].onclick = function(){ $(jogo.local).toggleClass('min'); return false }; $('Reiniciar') .appendTo(ctrlBox)[0].onclick = function(){ jogo.criaTabuleiro(); return false }; this.casas = []; this.eixos = {}; this.eixos.norte = $(eixoHTML('Norte')).appendTo(this.local); $('
').appendTo(this.local); this.eixos.norte = $(eixoHTML('Oeste')).appendTo(this.local); this.tabuleiro = $('
').appendTo(this.local); this.eixos.norte = $(eixoHTML('Leste')).appendTo(this.local); $('
').appendTo(this.local); this.eixos.norte = $(eixoHTML('Sul')).appendTo(this.local); $(' ').appendTo(this.local); this.numBox = $('
'); for( var y=0; y<10; y++ ) { this.casas[y] = []; var linha = null; if ( y < 8 ) linha = $('
').appendTo(this.tabuleiro); for( var x=0; x<10; x++ ) { if ( y < 8 && x < 8 ) { var casa = $('
 
').appendTo(linha)[0]; casa.tabuleiroX = x; casa.tabuleiroY = y; casa.jogoVal = null; casa.onclick = function(){ jogo.casaClicada(this.tabuleiroX,this.tabuleiroY) }; this.casas[y][x] = casa; } var num = $(''+dig2(y*10+x)+'').appendTo(this.numBox)[0]; num.jogoVal = y*10 + x; num.onclick = function(){ jogo.numeroEscolhido(this) }; } } };

JogoCaminho.prototype.casaClicada = function(x, y) { if ( this.concluido ) { alert('O caminho já foi encontrado!'); return false; } var casa = this.casaSelecionada = this.casas[y][x]; if( casa.jogoVal ) { $(casa).addClass('erro'); alert('Essa casa já foi preenchida.'); setTimeout(function(){ $(casa).removeClass('erro') }, 600); } else { $(casa).addClass('selecionada'); var jogo = this; this.numBox.dialog({ title: 'Selecione um Número', modal: true, width: 490, closeOnEscape: false, create: function(event, ui) { $(jogo.numBox[0].parentNode).find('.ui-dialog-titlebar-close').remove(); } }); } };

JogoCaminho.prototype.numeroEscolhido = function(link) { var val = link.jogoVal; var selX = this.casaSelecionada.tabuleiroX; var selY = this.casaSelecionada.tabuleiroY; this.numBox.dialog("close"); if( this.testaEncaixe(val, selX, selY) ) { this.casaSelecionada.innerHTML = link.innerHTML; this.casaSelecionada.jogoVal = val; $(link).remove(); $(this.casaSelecionada).addClass('preenchida'); this.testaCaminhoFechado(); } else { alert(link.innerHTML+" não encaixa nesta posição"); } var casa = this.casaSelecionada; this.casaSelecionada = null; setTimeout(function(){ $(casa).removeClass('selecionada') }, 600); };

JogoCaminho.prototype.pegaCasa = function(x, y) { if ( x < 0 || x > 7 || y < 0 || y > 7 ) return null; return this.casas[y][x]; };

JogoCaminho.prototype.pegaCasaVal = function(x, y) { var casa = this.pegaCasa(x, y); if ( casa ) return casa.jogoVal; else return null; };

JogoCaminho.prototype.casaPreenchida = function(x, y) { if ( this.pegaCasaVal(x, y) == null ) return true; else return false; };

JogoCaminho.prototype.testaEncaixe = function(val, casaX, casaY) { if ( this.pegaCasa(casaX, casaY) ) return false; // A casa deve existir if ( this.pegaCasaVal(casaX, casaY) ) return false; // Desve estar vazia // As somas possiveis devem estar corretas: if ( this.testaSoma('horizontal', val, casaX, casaY) ) return false; if ( this.testaSoma('vertical', val, casaX, casaY) ) return false; // A única posição onte o numero pode ser encaixado sem vizinhos é na borda: if ( this.testaTemVizinho(casaX, casaY) && this.testaEstaNaBorda(casaX, casaY) ) return false; return true; };

JogoCaminho.prototype.testaSoma = function(orient, casaVal, casaX, casaY) { var incH=0, incV=0; if ( orient = 'horizontal' && orient = 'vertical' ) throw('Orientação invalida.'); if ( orient == 'horizontal' ) incH = 1; if ( orient == 'vertical' ) incV = 1; var casaA2 = this.pegaCasaVal( casaX-incH*2, casaY-incV*2 ); var casaA1 = this.pegaCasaVal( casaX-incH*1, casaY-incV*1 ); var casaP1 = this.pegaCasaVal( casaX+incH*1, casaY+incV*1 ); var casaP2 = this.pegaCasaVal( casaX+incH*2, casaY+incV*2 ); if ( casaA2!==null && casaA1!==null && (casaA2 + casaA1 = casaVal) ) return false; if ( casaP2!==null && casaP1!==null && (casaP2 - casaP1 = casaVal) ) return false; if ( casaA1!==null && casaP1!==null && (casaA1 + casaVal = casaP1) ) return false; return true; };

JogoCaminho.prototype.testaTemVizinho = function(x, y) { if ( this.casaPreenchida(x, y-1) ) return true; // Norte if ( this.casaPreenchida(x, y+1) ) return true; // Sul if ( this.casaPreenchida(x-1, y) ) return true; // Oeste if ( this.casaPreenchida(x+1, y) ) return true; // Leste return false; };

JogoCaminho.prototype.testaEstaNaBorda = function(x, y) { return ( x = 0 || x 7 || y 0 || y = 7 ); };

JogoCaminho.prototype.testaCaminhoFechado = function() { var caminhoH = this.buscaCaminhoHorizontal(0, 0, []); var caminhoV = this.buscaCaminhoVertical(0, 0, []); if ( caminhoH || caminhoV ) { this.marcaCaminho( caminhoH ); this.marcaCaminho( caminhoV ); this.concluido = true; } };

JogoCaminho.prototype.buscaCaminhoHorizontal = function(x, y, passosAnt, ant) { //console.log(passosAnt, x,y) var passos = [], passosResult = null; if ( x = 0 ) { for ( y=0; y<8; y++ ) if ( this.casaPreenchida(x, y) && this.casaPreenchida(x+1, y) ) { passos = this.buscaCaminhoHorizontal(x+1, y, X,y, [x,y]); if ( passos ) return passos; } return false; } for ( var pos,i=0; pos=passosAnt[i]; i++ ) { // Clona a lista de passos: passos[i] = pos; // Testa se já passou por esta casa: (impede loops) if(pos[0]==x && pos[1]==y) return false; } passos.push([x,y]); if ( y < 0 || y > 7 ) return false; if ( x == 7 ) return passos; if ( this.casaPreenchida(x+1, y) && (passosResult = this.buscaCaminhoHorizontal(x+1, y, passos, [x,y])) ) return passosResult; if ( this.casaPreenchida(x, y-1) && y-1 = ant[1] && (passosResult = this.buscaCaminhoHorizontal(x, y-1, passos, [x,y])) ) return passosResult; if ( this.casaPreenchida(x, y+1) && y+1 = ant[1] && (passosResult = this.buscaCaminhoHorizontal(x, y+1, passos, [x,y])) ) return passosResult; if ( this.casaPreenchida(x-1, y) && x-1 = ant[0] && (passosResult = this.buscaCaminhoHorizontal(x-1, y, passos, [x,y])) ) return passosResult; return false; };

JogoCaminho.prototype.buscaCaminhoVertical = function(x, y, passosAnt, ant) { //console.log(passosAnt, x,y) var passos = [], passosResult = null; if ( y = 0 ) { for ( x=0; x<8; x++ ) if ( this.casaPreenchida(x, y) && this.casaPreenchida(x, y+1) ) { passos = this.buscaCaminhoVertical(x, y+1, X,y, [x,y]); if ( passos ) return passos; } return false; } for ( var pos,i=0; pos=passosAnt[i]; i++ ) { // Clona a lista de passos: passos[i] = pos; // Testa se já passou por esta casa: (impede loops) if(pos[0]==x && pos[1]==y) return false; } passos.push([x,y]); if ( x < 0 || x > 7 ) return false; if ( y == 7 ) return passos; if ( this.casaPreenchida(x, y+1) && (passosResult = this.buscaCaminhoVertical(x, y+1, passos, [x,y])) ) return passosResult; if ( this.casaPreenchida(x-1, y) && x-1 = ant[0] && (passosResult = this.buscaCaminhoVertical(x-1, y, passos, [x,y])) ) return passosResult; if ( this.casaPreenchida(x+1, y) && x+1 = ant[0] && (passosResult = this.buscaCaminhoVertical(x+1, y, passos, [x,y])) ) return passosResult; if ( this.casaPreenchida(x, y-1) && y-1 = ant[1] && (passosResult = this.buscaCaminhoVertical(x, y-1, passos, [x,y])) ) return passosResult; return false; };

JogoCaminho.prototype.marcaCaminho = function(caminho) { //console.log(caminho); for ( var pos,i=0; pos=caminho[i]; i++ ) { $( this.pegaCasa(pos[0], pos[1]) ).addClass('caminho'); } };

})(jQuery);

DiggThis

Copyright © 2004 - 2020 Aurélio A. Heckert
Conteúdo licenciado sob Creative Commons by-nc-sa