"Gioco TRIS" che crasha [C]

di il
21 risposte

"Gioco TRIS" che crasha [C]

Sono nuovo nel C.
Lo sto studiando da un anno a scuola, quindi ho cercato di sfornare questo programmino.
Allego il codice. Il programma è sicuramente poco comprensibile e mooooooooolto "incasinato", per questo mi affido a voi.
Il programma funziona alla perfezione, solo che ogni tanto, su windows, crasha.
Come posso risolvere?

#include<stdio.h>
#include<time.h>

int stampa(int x,int y);
int inserimento(void);
int controllo(void);
int x,y;
int contatore=0;



int main(void)
{
    if(controllo()==1)
    {
       printf("VITTORIA!\n");
       system("pause");
    }
    
    
    
    
    if(contatore%2)
    {
       inserimento();
       stampa(x,y);
    }
   
    
    printf("\n\nInserisci la x e la y separate da uno spazio ");
    scanf("%d %d",&x,&y);
    
    if(x>2 || y>2)
    {
      printf("COORDINATE SBAGLIATE!");
      main();
    }
    
    switch(x)
    {
        case 0:
            break;
        case 1:
            x=2;
            break;
        case  2:
            x=4;
            break;
        
    }
    
    switch(y)
    {
        case 0:
            break;
        case 1:
            y=2;
            break;
        case  2:
            y=4;
            break;
    }
    
    
    
    contatore++;
    stampa(x,y);
    
    
    


   return 0;
}





char tris[5][7];

int stampa(x,y)
{
    FILE *fp;
    
    
    int v=0,o=0;
    
    
    fp=fopen("tris.txt","r");
    
    
    
    
    
    
    if((tris[x][y]=='X' || tris[x][y]=='O') && contatore%2)
    { 
        printf("Casella gia' occupata!");
        contatore--;
        main();
    }
    else
    {
        if(contatore%2)
        tris[x][y]='X';
        else
        tris[x][y]='O';
    }
    
    
    while(v<5)
    {
         while(o<6)
        {
            
            
            
            
            if(tris[v][o]=='X' || tris[v][o]=='O')
            {
              printf("%c",tris[v][o]);
              o++;
              tris[v][o]=fgetc(fp);
            }
            
            else
            {
                tris[v][o]=fgetc(fp);
                printf("%c",tris[v][o]);
                o++;
            }
            
            
            
            
            
            
       }
    o=0;
    v++;
    }
    
    
    
    
    
    
    fclose(fp);
    printf("\n\n");
    
    controllo();
    main();    
}







int xa[3]={0,2,4};
int ya[3]={0,2,4};
int inserimento(void)
{
    int i=0;
    
    srand(time(NULL));
    x=xa[rand()%3];
    y=ya[rand()%3];
    
    if(tris[x][y]!='O' && tris[x][y]!='X')
    tris[x][y]='O';
    
    else
    inserimento();
    
    contatore++;
    stampa(x,y);
    



}
    


int controllo()

{
    
    
    if((tris[0][0]==tris[0][2] && tris[0][2]==tris[0][4]) && (tris[0][0]=='X' || tris[0][0]=='O') )
    {
       printf("TRIS!\n");
       return 1;
    }
    
    if((tris[2][0]==tris[2][2] && tris[2][2]==tris[2][4]) && (tris[2][0]=='X' || tris[2][0]=='O') )
    {
       printf("TRIS!");
       return 1;
    }
    
    if((tris[4][0]==tris[4][2] && tris[4][2]==tris[4][4]) && (tris[4][0]=='X' || tris[4][0]=='O') )
    {
       printf("TRIS!");
       return 1;
    }
    
    if((tris[0][0]==tris[2][0] && tris[2][0]==tris[4][0]) && (tris[0][0]=='X' || tris[0][0]=='O') )
    {
       printf("TRIS!");
       return 1;
    }
    
    if((tris[0][2]==tris[2][2] && tris[2][2]==tris[4][2]) && (tris[0][2]=='X' || tris[0][2]=='O') )
    {
       printf("TRIS!");
       return 1;
    }
    
    if((tris[0][4]==tris[2][4] && tris[2][4]==tris[4][4]) && (tris[0][4]=='X' || tris[0][4]=='O') )
    {
       printf("TRIS!");
       return 1;
    }
    
    if((tris[0][0]==tris[2][2] && tris[2][2]==tris[4][4]) && (tris[0][0]=='X' || tris[0][0]=='O') )
    {
       printf("TRIS!");
       return 1;
    }
    
    if((tris[0][4]==tris[2][2] && tris[2][2]==tris[4][0]) && (tris[0][4]=='X' || tris[0][4]=='O') )
    {
       printf("TRIS!");
       return 1;
    }

   
    if((tris[0][0]==tris[0][1]==tris[0][2]==tris[1][0]==tris[1][2]==tris[1][4]==tris[2][0]==tris[2][2]==tris[2][4]) && (tris[0][0]!='X' && tris[0][0]!='O'))
    {
        printf("PATTA");
        system("PAUSE");
    }
}

21 Risposte

  • Re: "Gioco TRIS" che crasha [C]

    Anche se semplice, proprio perché "incasinato", è abbastanza difficile esaminarlo tutto senza impiegare molto tempo e pochi lo faranno per risponderti. Quindi, se vuoi proprio un aiuto, dai maggiori indicazioni sul "crash" perché, se ci fai caso, potrai dirci con maggiore precisione in quali condizioni si verifica. In questo modo si potrà dare un'occhiata mirata e impiegando meno tempo ...

    Una cosa è certa (e puoi cominciare a modificarla ...) ... il main non si richiama dal main come fai nel tuo codice. Quando chiami il main, richiami una funzione come le altre e poi questa dovrà restituire il controllo al chiamante creando sicuramente problemi. Se vuoi ripartire ad eseguire parti di main già eseguite dovrai impostare un ciclo.
  • Re: "Gioco TRIS" che crasha [C]

    Un'altro aiuto che ti possiamo dare è DISINSTALLARE devc++ e usare un ide piu aggiornato con relativo compilatore sempre aggiornato.L'alternativa piu simile e decisamente migliore è Code::Block.
    Compilandolo nuovamente scoprirai qualche errorino.
    Fatte queste modifiche riposta il codice un pò piu pulito e vedremo di aiutarti.
  • Re: "Gioco TRIS" che crasha [C]

    L'errore che mi da è questo:
    "program received signal sigsegv segmentation fault"

    Non saprei proprio come impostare il ciclo al posto dei richiami al Main...
    Che poi non ho capito una cosa, visto che le funzioni le ho imparate "alla cavolo" perchè a scuola ancora non le abbiamo fatte e non trovo niente che possa spiegarle in modo chiaro, almeno per me, qual è il problema che potrebbe nascere dal richiamo della main?
  • Re: "Gioco TRIS" che crasha [C]

    bebbo203 ha scritto:


    L'errore che mi da è questo:
    Non saprei proprio come impostare il ciclo al posto dei richiami al Main...
    Studia i cicli do oppure i while ...
    qual è il problema che potrebbe nascere dal richiamo della main?
    E' poco prevedibile ma anche quello che hai tu, per vari motivi adesso complicati da spiegarti, potrebbe saltare fuori ...

    Addirittura ho visto che chiami la main alla fine della funzione stampa, quasi come se fosse un "goto" ... e la funzione stampa non termina mai incasinando lo stack in maniera indicibile ...

    Se non metti a posto tutte queste chiamate a main, non serve controllare altro ...
  • Re: "Gioco TRIS" che crasha [C]

    Dimenticavo: Grazie per le risposte!

    I cicli while e i do while li conosco, conosco anche i for, i cicli tutti diciamo, però non saprei come "implementarli"
  • Re: "Gioco TRIS" che crasha [C]

    Beh ... provaci e ne parliamo ...

    Addirittura in alcuni casi non c'è neanche bisogno. Se una funzione è chiamata dal main, quando termina torna al main senza bisogno di chiamare la main appositamente (anzi, è pure sbagliato)
  • Re: "Gioco TRIS" che crasha [C]

    Ok... ora ci provo.. Per il resto non ci sono soluzioni per rendere il codice più abbordabile, o almeno consigli?
  • Re: "Gioco TRIS" che crasha [C]

    bebbo203 ha scritto:


    Ok... ora ci provo.. Per il resto non ci sono soluzioni per rendere il codice più abbordabile, o almeno consigli?
    Beh, ci sono tante cose in quel codice che non vanno (ad esempio, se fai un controllo e scrivi "VITTORIA" comunque il programma continua e non penso vada bene ...) ... ma prima correggi tutte le chiamate a main e poi se ne parla.
  • Re: "Gioco TRIS" che crasha [C]

    Avevo messo una system("PAUSE"); per fallo bloccare, ora sistemo quei richiami. GRAZIE!
  • Re: "Gioco TRIS" che crasha [C]

    La system("PAUSE") (a parte il fatto che è sconsigliata) serve solamente ad attendere un tasto per sospendere il programma ma dopo il programma prosegue comunque ...
  • Re: "Gioco TRIS" che crasha [C]

    Ah ok... Allora ricomincio a farlo dall'inizio sulla falsa riga di quell'altro.


    EDIT:
    Scusa se continuo a fare domande, ma l'utilizzo delle altre funzioni in quel modo può essere valido o è meglio non utilizzarle?
  • Re: "Gioco TRIS" che crasha [C]

    Usare le funzioni per suddividere il programma va bene ma devi sempre sapere cosa fai ...

    Ad esempio tu crei funzioni di tipo int ma non restituisci alcun valore ... a cosa serve allora che la funzione sia di tipo int?
  • Re: "Gioco TRIS" che crasha [C]

    E come la creo? Void?
  • Re: "Gioco TRIS" che crasha [C]

    Se non restituisce nulla allora deve essere void.

    Questo lo devi decidere tu quando progetti il programma e le varie funzioni.
Devi accedere o registrarti per scrivere nel forum
21 risposte