|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Nov 2008
Messaggi: 64
|
[Javascript] Ricorsione metodo
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: ![]() 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). Codice:
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"
Vi ringrazio per le eventuali risposte...ciao |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Ciao,
non ho letto il codice, ma se il tuo problema è legato al concetto di metodo ricorsivo e di come si struttura un metodo ricorsivo forse questo thread di qualche giorno fa può esserti utile. Prova a seguire il metodo illustrato da Cionci e vedi se ti torna il discorso
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Nov 2008
Messaggi: 64
|
Ho risolto...ho impiegato 2 ore :S
Cmq posto il codice...magari potrebbe interessare a qualcuno che sta facendo una cosa del genere. checkMove() è il metodo che viene richiamando ogni volta che l'utente clicca una cella della tabella,passandogli l'id della pallina selezionata: Codice:
this.checkMove = function(id_pedina)
{
if(pedine[id_pedina].getStato()==0)
{
this.controllo(id_pedina,pedine[id_pedina].getColore());
this.aggiorna_score();
}
else { alert("già conquistata"); }
}
// 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();
//imposto lo stato della pedina ad 1,cioè conquistata!
this.pedine[id_pedina].setStato(1);
this.pedine[id_pedina].setColore(7);
conto++;
//richiamo il metodo che disegna la tabella
//per aggiornarla a video in base alle conquiste appena fatte
this.initGameBoard(pedine);
}
this.controllo=function(id_pedina,colore)
{
//se la pedina è stata già conquistata,esce!
if(this.pedine[id_pedina].getStato()==1){
return;
}
else{
//this.pedine[id_pedina].setStato(1);
this.conquista(id_pedina);
var colorPalScelta=colore;
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.controllo(pedTop_id,colore);
//controllo SOTTO
if(pedUnder_id<100 && this.pedine[pedUnder_id].getStato!=1 && this.pedine[pedUnder_id].getColore()==colorPalScelta)
this.controllo(pedUnder_id,colore);
//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.controllo(pedLeft_id,colore);
//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.controllo(pedRight_id,colore);
}
}
//Metodo che mi ritorna il punteggio e lo manda a video
this.aggiorna_score=function()
{
st="Score Utente: "+ conto;
document.getElementById("punteggi").innerHTML=st;
}
}//fine classe "gameboard"
Ultima modifica di divincodin : 19-06-2009 alle 09:56. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:28.




















