PDA

Visualizza la versione completa : linguaggio c problema con finestre e ncurses.h


faustinix
20-04-2011, 16:10
sto programmando il giochino "pac-man" ma ogni tanto si verifica un problema,
sul terminale vengono stampati dei caratteri scatola definiti in ncurses.h
inizialmente il terminale riconosce questi caratteri ma dopo un po non li riconosce piu stampando altri caratteri,
da cosa puo dipendere?

alka
20-04-2011, 16:12
Senza vedere manco una riga di codice, sarÓ ben difficile aiutarti. :fagiano:

faustinix
20-04-2011, 16:36
void controllo ()
{
oggetto valore_letto,pacman,appoggio;
int id_fant[MAXFANT]={0};
ptr_oggetto iniz_nascondigli=NULL,app,primi_fant=NULL;
ptr_oggetto liste[4]={NULL,NULL,NULL,NULL};
int i; char c[40],n[]={" "};
liste[1]=lista('p',CH_PALL);
liste[3]=lista(' ',' ');
iniz_nascondigli=lista_nascondigli( liste[1] , NFANT);
stampa_lista(liste[1]);
do
{
valore_letto=leggi_oggetto();
refresh();
switch(valore_letto.type)
{
case PACMAN:
pacman=valore_letto;
app=pos_occupata(iniz_nascondigli,pacman.pos_prec) ;
if((app!=NULL)&&(!pos_uguali(pacman.pos_prec,pacman.posizione)))
{
i=libero(id_fant);
id_fant[i]=crea_fantasma(app->posizione,i);

iniz_nascondigli=togli(iniz_nascondigli,*app);
appoggio.id=id_fant[i];
primi_fant=add(primi_fant,appoggio);
}
collisioni_pacman(pacman,liste);

mvaddch(pacman.pos_prec.y,pacman.pos_prec.x,' ');
mvaddch(pacman.posizione.y,pacman.posizione.x,pacm an.c);
break;
case MISSILE:
collisioni_missile(valore_letto , liste, primi_fant, pacman, id_fant);
break;
case FANTASMA:
collisioni_fantasmi(valore_letto, liste, primi_fant, pacman, id_fant);
stampa(liste);
mvaddch(pacman.posizione.y,pacman.posizione.x,pacm an.c);
break;
}
sprintf(c,"PUNTEGGIO %d ",punteggio);
mvaddstr(2,55,n);
mvaddstr(2,55,c);
mvprintw(11,1," ");
mvprintw(11,1," ENERGIA %d0%% ",(energia-1)%ENERG_A_VITA+1);
for(i=1;i<(energia-1)%ENERG_A_VITA+1;i++)
{
mvaddch(12,2+i*2,ACS_CKBOARD|COLOR_PAIR(COLOR_GREE N));
mvaddch(12,2+1+i*2,ACS_CKBOARD|COLOR_PAIR(COLOR_GR EEN));
}
mvprintw(9,1," "); mvprintw(9,1," VITE %d",energia/ENERG_A_VITA);
mvprintw(10,1," ");
for(i=1;i<=(energia/ENERG_A_VITA);i++)
mvaddch(10,2+i*2,'O'|COLOR_PAIR(COLOR_YELLOW));
refresh();
} while ((conta_elementi(liste[1])!=0)&&(energia>0)); /*finche non ci saranno 0 palline da mangiare o finche pacman avrÓ finito l'energia*/

for(i=0;i<2;i++) /*per tutte le liste*/
{
app=liste[i*2];
while(app!=NULL) /*e per tutti gli elementi della lista*/
{
termina(app->id); /*termina il processo che ha generato l'elemento*/
app=app->next;
}
}
}

faustinix
20-04-2011, 17:11
questa Ŕ la funzione che gestisce le collisioni dei missili:



void collisioni_missile(oggetto missile , ptr_oggetto list[],ptr_oggetto primi_f,oggetto pacman,int id_f[])
{
ptr_oggetto app; int i;
//mvaddch(0,0,CH_MISSILE);
//refresh();
list[2]=aggiorna_lista(list[2],missile); /*aggiorna la lista dei missili*/
if(pos_uguali(missile.posizione,pacman.posizione)) /*se il missile colpisce pacman*/
{
termina(missile.id); /*termino il processo che ha creato il missile*/
list[2]=togli(list[2],missile); /*tolgo il missile dalla lista dei missili*/
energia=energia-1; /*tolgo energia a pacman*/ } app=collisione(list[0],missile);
if(app!=NULL) /*se il missile colpisce un fantasma*/ {
i=indice(*app,id_f); /*ottengo la indice dell'array in qui viene memorizato il pid del fantasma */
termina(missile.id); /*termino il processo del missile*/
termina(app->id); /*termino il fantasma colpito*/
id_f[i]=0; /*azzero il pid del fantasma nell'array dei pid dei fantasmi*/
id_f[i]=crea_fantasma(pos_box[i],i); /*creo un fantasma nella box dei fantasmi*/
if(cerca(primi_f,*app)!=NULL) /*se il fantasma Ŕ uno dei primi fantasmi, cioe si puo sdoppiare*/
{
i=libero(id_f); /*trovo una posizione libera nell'array dei pid dei fantasmi*/
id_f[i]=crea_fantasma(pos_box[i],i);
primi_f=togli(primi_f,*app); /*tolgo il fantasma colpito dalla lista dei primi fantasmi*/
}
list[0]=togli(list[0],*app); /*tolgo il fantasma dalla lista dei fantasmi*/
list[2]=togli(list[2],missile); /*tolgo il missile dalla lista dei missili*/
}
app=collisione(list[1],missile);
if(app!=NULL) /*se il missile colpisce una pallina */
{
termina(missile.id); /*termina il processo che ha creato il missile*/
list[2]=togli(list[2],missile); /*tolgo il la pallina dalla lista delle palline*/
} app=collisione(list[2],missile);
if (app!=NULL) /*se il missile colpisce un'altro missile*/
{
termina(missile.id); /*termino il processo che ha generato il missile*/
list[2]=togli(list[2],missile); /*tolgo il missile dalla lista dei missili*/
if(app->direzione!=missile.direzione) /*se i due missili hanno direzioni diverse*/
{
termina(app->id); /*termina anche il processo che ha generato l'altro missile*/
list[2]=togli(list[2],*app); /*togli anche l'altro missile dalla lista dei missili*/
}
}
if(pos_occupata(list[1],missile.posizione)==NULL)
mvaddch(missile.posizione.y,missile.posizione.x,mi ssile.c);
if(pos_occupata(list[2],missile.pos_prec)!=NULL)
mvaddch(missile.pos_prec.y,missile.pos_prec.x,miss ile.c);
else
if(pos_occupata(list[0],missile.pos_prec)!=NULL)
mvaddch(missile.pos_prec.y,missile.pos_prec.x,CH_F ANTASMA);
else
mvaddch(missile.pos_prec.y,missile.pos_prec.x,' ');
mvaddch(pacman.posizione.y,pacman.posizione.x,pacm an.c);
}

faustinix
20-04-2011, 17:20
questa Ŕ la funzione che gestisce le collisioni deli fantasmi,
grazie per l'auito


void collisioni_fantasmi(oggetto fantasma, ptr_oggetto list[],ptr_oggetto primi_f,oggetto pacman,int id_f[])
{
ptr_oggetto app;
oggetto appoggio;
int i;
mvaddch(0,0,' ');
list[0]=aggiorna_lista(list[0],fantasma); /*aggiorna la lista dei fantasmi*/
app=collisione(list[0],fantasma);
if(app!=NULL) /*se un fantasma colpisce un'altro fantasma*/
{
fantasma=inverti_dir(fantasma); /*inverto la direzione del fantasma*/
scrivi_fantasma(fantasma,indice(fantasma,id_f)); /*mando il fantasma invertito al processo che l'ha generato*/
if((app->direzione!=FERMO)&&(app->direzione!=fantasma.direzione))
{
appoggio=inverti_dir(*app); /*inverto il fantasma colpito*/
scrivi_fantasma(appoggio,indice(appoggio,id_f));
}
}
else
{
app=collisione(list[2],fantasma);
if(app!=NULL)
{
termina(fantasma.id); /*termino il processo del fantasma*/
termina(app->id); /*termino il missile colpito*/
i=indice(fantasma,id_f); /*ottengo la indice dell'array in qui viene memorizato il pid del fantasma*/
id_f[i]=0; /*azzero il pid del fantasma nell'array dei pid dei fantasmi*/
id_f[i]=crea_fantasma(pos_box[i],i); /*creo un fantasma nella box dei fantasmi*/
if(cerca(primi_f,fantasma)!=NULL) /*se il fantasma Ŕ uno dei primi fantasmi, cioe si puo sdoppiare*/
{
i=libero(id_f); /*trovo una posizione libera nell'array dei pid dei fantasmi*/
id_f[i]=crea_fantasma(pos_box[i],i);
primi_f=togli(primi_f,fantasma); /*tolgo il fantasma colpito dalla lista dei primi fantasmi*/
}
list[0]=togli(list[0],fantasma); /*tolgo il fantasma dalla lista dei fantasmi*/
list[2]=togli(list[2],*app); /*tolgo il missile dalla lista dei missili*/
}
if(pos_uguali(pacman.posizione,fantasma.posizione) ) /*se il fantasma colpisce pacman*/
energia=energia-10; /*togli 10 di energia cioe 1 vita a pacman*/
}
}

Loading