-Ivan-
15-02-2005, 18:06
Sono alcuni giorni che tento di far funzionare questo programma ma non riesco proprio a capire quale possa essere il problema.
Tutto funziona ma dopo aver fatto le prime istruzioni si blocca e sono costretto a riavviare il pc perchè i tasti non funzionano più.
Riporto solo la parte di codice strettamente legata all'errore, tutte le funzioni usate sono corrette al di fuori dell'IA dove sembra che il programma si blocchi come se non riuscisse ad uscire da un ciclo, anche i comandi disegna sono parte di un motore grafico e fuinzionano bene.
Quello che non capisco è come faccia a crearsi un errore dopo aver chiamato la funzione IA (se non la chiamo il programma funziona) che non fa altro che fare calcoli matematici che al massimo potrebbero generare risultati non corretti e disegnare una immagine in un punto sbagliato dello schermo.
[...]
//questa funzione è contenuta in un while che viene ripetuto //all'infinito fino alla pressione di esc
void gestione_eventi(){
disegna(sfondo, 0, 0);
disegna(scacchiera, 100, 100);
conquiste_giocatore();
disegna(giocatore, coord_xg, coord_yg, 40, 40, 0, 0);
disegna(pc, coord_xp, coord_yp, 40, 40, 0, 0);
scegli_mossa();
if(turno==0)
{
if (i==0)
{
imput_tastiera();
}
fine_turno(); //imposta turno=1
}
if(turno==1)
{
turno=0;
IA();
}
}
[...]
////////////////////////////////////////////////////////////////////////////////
////////////////////////*INTELLIGENZAARTIFICIALE*///////////////////
void IA()
{
//Fase I INTELLIGENZA ARTIFICIALE
//Calcolo qual'è la casella più vicina da conquistare per il pc
for(k=1;k<11;k++)
{
dc[k]=caselle_da_conquistare[k]/10;
uc[k]=caselle_da_conquistare[k]-(dc[k]*10);
}
dp=pos/10;
up=pos-(dp*10);
//ciclo per il riempimento del vettore distanza
for(k=1;k<11;k++)
{
if(dc[k]>=dp){distanza[k]=dc[k]-dp;}
else
{distanza[k]=dp-dc[k];}
if(uc[k]>=up){distanza[k]=distanza[k]+(uc[k]-up);}
else
{distanza[k]=distanza[k]+(dp-dc[k]);}
}
//Ora ho 2 vettori di uguale dimensione, uno con tutte le caselle da conquistare
//ed uno con le distanze dalla posizione attuale
minimo=distanza[1];
obiettivo=1;
for(k=1;k<11;k++)
{
if(distanza[k]<minimo){obiettivo=k;minimo=distanza[k];}
}
//Obiettivo adesso contiene l'indice della casella che il pc
//deve tentare di conquistare al momento
// CICLI DI CONTROLLO IA
if(dc[obiettivo]<dp)
{
coord_yp=coord_yp-60;
}
if(dc[obiettivo]>dp)
{
coord_yp=coord_yp+60;
}
if(uc[obiettivo]<up)
{
coord_xp=coord_xp-60;
}
if(uc[obiettivo]>up)
{
coord_xp=coord_xp+60;
}
Sleep(150);
disegna(pc, coord_xp, coord_yp, 40, 40, 0, 0);
}
Tutto funziona ma dopo aver fatto le prime istruzioni si blocca e sono costretto a riavviare il pc perchè i tasti non funzionano più.
Riporto solo la parte di codice strettamente legata all'errore, tutte le funzioni usate sono corrette al di fuori dell'IA dove sembra che il programma si blocchi come se non riuscisse ad uscire da un ciclo, anche i comandi disegna sono parte di un motore grafico e fuinzionano bene.
Quello che non capisco è come faccia a crearsi un errore dopo aver chiamato la funzione IA (se non la chiamo il programma funziona) che non fa altro che fare calcoli matematici che al massimo potrebbero generare risultati non corretti e disegnare una immagine in un punto sbagliato dello schermo.
[...]
//questa funzione è contenuta in un while che viene ripetuto //all'infinito fino alla pressione di esc
void gestione_eventi(){
disegna(sfondo, 0, 0);
disegna(scacchiera, 100, 100);
conquiste_giocatore();
disegna(giocatore, coord_xg, coord_yg, 40, 40, 0, 0);
disegna(pc, coord_xp, coord_yp, 40, 40, 0, 0);
scegli_mossa();
if(turno==0)
{
if (i==0)
{
imput_tastiera();
}
fine_turno(); //imposta turno=1
}
if(turno==1)
{
turno=0;
IA();
}
}
[...]
////////////////////////////////////////////////////////////////////////////////
////////////////////////*INTELLIGENZAARTIFICIALE*///////////////////
void IA()
{
//Fase I INTELLIGENZA ARTIFICIALE
//Calcolo qual'è la casella più vicina da conquistare per il pc
for(k=1;k<11;k++)
{
dc[k]=caselle_da_conquistare[k]/10;
uc[k]=caselle_da_conquistare[k]-(dc[k]*10);
}
dp=pos/10;
up=pos-(dp*10);
//ciclo per il riempimento del vettore distanza
for(k=1;k<11;k++)
{
if(dc[k]>=dp){distanza[k]=dc[k]-dp;}
else
{distanza[k]=dp-dc[k];}
if(uc[k]>=up){distanza[k]=distanza[k]+(uc[k]-up);}
else
{distanza[k]=distanza[k]+(dp-dc[k]);}
}
//Ora ho 2 vettori di uguale dimensione, uno con tutte le caselle da conquistare
//ed uno con le distanze dalla posizione attuale
minimo=distanza[1];
obiettivo=1;
for(k=1;k<11;k++)
{
if(distanza[k]<minimo){obiettivo=k;minimo=distanza[k];}
}
//Obiettivo adesso contiene l'indice della casella che il pc
//deve tentare di conquistare al momento
// CICLI DI CONTROLLO IA
if(dc[obiettivo]<dp)
{
coord_yp=coord_yp-60;
}
if(dc[obiettivo]>dp)
{
coord_yp=coord_yp+60;
}
if(uc[obiettivo]<up)
{
coord_xp=coord_xp-60;
}
if(uc[obiettivo]>up)
{
coord_xp=coord_xp+60;
}
Sleep(150);
disegna(pc, coord_xp, coord_yp, 40, 40, 0, 0);
}