divincodin
18-06-2009, 12:05
Ciao ragazzi,sto provando a fare un gioco in php e javascript.
In sostanza ho una scacchiera con tante palline colorate...e ai 2 angoli (superiore sinistro ed inferiore destro ci sono le palline del pc e dell'utente).
Quando l'utente clicca su di una pallina,tutte le palline vicine dello stesso colore,devono essere conquistate e diventare nere (colore dell'utente).Fino ad ora,attraverso 2 metodi,ho fatto il controllo a partire dalla pallina selezionata,su tutte le 4 palline che la circondano (supra,destra,sotto e sinistra).Ma non riesco a chiamare ricorsivamente il metodo per il controllo.Questa è l'immagine di un gioco molto simile (anche se qui non ci sn 2 giocatori come sto facendo io).In questo caso,cliccando su di una delle palline gialle presenti nella parte centrale,tutte le altre vicine sarebbero dovute diventare nere perchè conquistate:
http://media.giantbomb.com/uploads/1/15278/426822-jawbreaker1_large.jpg
Posto il codice dei 2 metodi che ho creato. id_pedina è un valore numerico che indica l'indice della pallina che ho cliccato.
Quindi una volta conquistata una delle palline attorno,su questa dovrei richiamare ricorsivamente il metodo checkMove() passandogli,questa volta, come indice quello della pallina appena conquistata.Quindi effettuare su questa il controllo delle 4 palline che la circondano e così via ricorsivamente....
Se vedete,nel primo controllo (quello SOPRA),ho provato a chiamarlo ricorsivamente,passando come indice il valore della pallina di sopra appena conquistata....ma non funziona (adesso l'ho commentato visto che non funziona).
this.checkMove = function(id_pedina)
{
var colorPalScelta=pedine[id_pedina].getColore();
var pedTop_id=parseInt(id_pedina)-10;
var pedUnder_id=parseInt(id_pedina)+10;
var pedLeft_id=parseInt(id_pedina)-1;
var pedRight_id=parseInt(id_pedina)+1;
//controllo SOPRA
if(pedTop_id>0 && pedTop_id<99 && this.pedine[pedTop_id].getStato!=1 && this.pedine[pedTop_id].getColore()==colorPalScelta)
{
this.conquista(pedTop_id);
//this.checkMove(pedTop_id);
}
else
this.conquista(id_pedina);
//controllo SOTTO
if(pedUnder_id>0 && pedUnder_id<99 && this.pedine[pedUnder_id].getStato!=1 && this.pedine[pedUnder_id].getColore()==colorPalScelta)
this.conquista(pedUnder_id);
else
this.conquista(id_pedina);
//controllo SINISTRA (ho aggiunto "+1" x portare il valore da 9,19,29...a 10,20,30 e poter usare il modulo x non far conquistare
//un'eventuale pallina dello stesso colore presente nell'ultima posizione della riga precedente.
if(pedLeft_id>0 && pedLeft_id<99 && this.pedine[pedLeft_id].getStato!=1 && this.pedine[pedLeft_id].getColore()==colorPalScelta && (pedLeft_id+1)%10!=0)
this.conquista(pedLeft_id);
else
this.conquista(id_pedina);
//controllo DESTRA
if(pedRight_id>0 && pedRight_id<99 && this.pedine[pedRight_id].getStato!=1 && this.pedine[pedRight_id].getColore()==colorPalScelta && pedRight_id%10!=0)
this.conquista(pedRight_id);
else
this.conquista(id_pedina);
}
// questa funzione setta a conquistato lo stato della pallina ed
// cambiandone il colore in base a chi la conquista.
this.conquista = function (id_pedina)
{
//alert("entrato");
var pedina_selez = this.pedine[id_pedina];
x=pedina_selez.getPositionX();
y=pedina_selez.getPositionY();
//scorro tutto l'array di oggetti pedine,trovato quello che ho selezionato (id_pedina)
//setto lo stato ad 1 !!!!
for (i=0;i<this.pedine.length;i++)
{
if (this.pedine[i].getPositionX() == x && this.pedine[i].getPositionY() == y)
{
//if(this.pedine[i].getStato()!=1)
//{
this.pedine[i].setStato(1);
this.pedine[i].setColore(7);
//}
//else
//document.write("Pallina già conquistata!");
}
}
}
this.initGameBoard(pedine);
}//fine classe "gameboard"
Alla fine è una cosa di programmazione generale...e non solo di Javascript.
Vi ringrazio per le eventuali risposte...ciao :)
In sostanza ho una scacchiera con tante palline colorate...e ai 2 angoli (superiore sinistro ed inferiore destro ci sono le palline del pc e dell'utente).
Quando l'utente clicca su di una pallina,tutte le palline vicine dello stesso colore,devono essere conquistate e diventare nere (colore dell'utente).Fino ad ora,attraverso 2 metodi,ho fatto il controllo a partire dalla pallina selezionata,su tutte le 4 palline che la circondano (supra,destra,sotto e sinistra).Ma non riesco a chiamare ricorsivamente il metodo per il controllo.Questa è l'immagine di un gioco molto simile (anche se qui non ci sn 2 giocatori come sto facendo io).In questo caso,cliccando su di una delle palline gialle presenti nella parte centrale,tutte le altre vicine sarebbero dovute diventare nere perchè conquistate:
http://media.giantbomb.com/uploads/1/15278/426822-jawbreaker1_large.jpg
Posto il codice dei 2 metodi che ho creato. id_pedina è un valore numerico che indica l'indice della pallina che ho cliccato.
Quindi una volta conquistata una delle palline attorno,su questa dovrei richiamare ricorsivamente il metodo checkMove() passandogli,questa volta, come indice quello della pallina appena conquistata.Quindi effettuare su questa il controllo delle 4 palline che la circondano e così via ricorsivamente....
Se vedete,nel primo controllo (quello SOPRA),ho provato a chiamarlo ricorsivamente,passando come indice il valore della pallina di sopra appena conquistata....ma non funziona (adesso l'ho commentato visto che non funziona).
this.checkMove = function(id_pedina)
{
var colorPalScelta=pedine[id_pedina].getColore();
var pedTop_id=parseInt(id_pedina)-10;
var pedUnder_id=parseInt(id_pedina)+10;
var pedLeft_id=parseInt(id_pedina)-1;
var pedRight_id=parseInt(id_pedina)+1;
//controllo SOPRA
if(pedTop_id>0 && pedTop_id<99 && this.pedine[pedTop_id].getStato!=1 && this.pedine[pedTop_id].getColore()==colorPalScelta)
{
this.conquista(pedTop_id);
//this.checkMove(pedTop_id);
}
else
this.conquista(id_pedina);
//controllo SOTTO
if(pedUnder_id>0 && pedUnder_id<99 && this.pedine[pedUnder_id].getStato!=1 && this.pedine[pedUnder_id].getColore()==colorPalScelta)
this.conquista(pedUnder_id);
else
this.conquista(id_pedina);
//controllo SINISTRA (ho aggiunto "+1" x portare il valore da 9,19,29...a 10,20,30 e poter usare il modulo x non far conquistare
//un'eventuale pallina dello stesso colore presente nell'ultima posizione della riga precedente.
if(pedLeft_id>0 && pedLeft_id<99 && this.pedine[pedLeft_id].getStato!=1 && this.pedine[pedLeft_id].getColore()==colorPalScelta && (pedLeft_id+1)%10!=0)
this.conquista(pedLeft_id);
else
this.conquista(id_pedina);
//controllo DESTRA
if(pedRight_id>0 && pedRight_id<99 && this.pedine[pedRight_id].getStato!=1 && this.pedine[pedRight_id].getColore()==colorPalScelta && pedRight_id%10!=0)
this.conquista(pedRight_id);
else
this.conquista(id_pedina);
}
// questa funzione setta a conquistato lo stato della pallina ed
// cambiandone il colore in base a chi la conquista.
this.conquista = function (id_pedina)
{
//alert("entrato");
var pedina_selez = this.pedine[id_pedina];
x=pedina_selez.getPositionX();
y=pedina_selez.getPositionY();
//scorro tutto l'array di oggetti pedine,trovato quello che ho selezionato (id_pedina)
//setto lo stato ad 1 !!!!
for (i=0;i<this.pedine.length;i++)
{
if (this.pedine[i].getPositionX() == x && this.pedine[i].getPositionY() == y)
{
//if(this.pedine[i].getStato()!=1)
//{
this.pedine[i].setStato(1);
this.pedine[i].setColore(7);
//}
//else
//document.write("Pallina già conquistata!");
}
}
}
this.initGameBoard(pedine);
}//fine classe "gameboard"
Alla fine è una cosa di programmazione generale...e non solo di Javascript.
Vi ringrazio per le eventuali risposte...ciao :)