Non trovo l'errore (C)

di il
4 risposte

Non trovo l'errore (C)

Buongiorno a tutti,
sto provando a creare un programma che mi permetta di giocare a briscola.
premetto che devo ancora fare la parte in cui inizia per primo il giocatore reale ma comunque ciò che ho scritto fin ora non funziona correttamente (ho verificato facendomi mostrare la mano del computer)

Probabilmente ho commesso qualche errore logico o dimenticato qualcosa nelle funzioni ma non riesco a capire cosa
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
//record vari//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct carta{
       char nome[20];
       int seme; // 0 spade,1 bastoni,2 denari,3 coppe
       int id; // 0-9 spade,10-19 bastoni,20-29 denari,30-39 coppe
       int briscola; // 0 no, 1 sì
       int carta_sotto; // 0 no, 1 sì
       int valore_strozzo; // asso=10,tre=9,re=8,cavallo=7,fante=6,sette=5,sei=5,cinque=4,quattro=3,due=2
       int status; // 0 non pescata, 1 pescata o carta sotto
       int punti;        //punti che vale la carta
};
struct giocatore{
       int turno; // 1 gioca per primo, 0 gioca per secondo
       struct carta mano[3]; //la mano del giocatore
       int punteggio; //punteggio totalizzato
};
//funzioni///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loading(struct carta mazzo[]);
void preparazione(struct carta mazzo[],struct giocatore umano[],struct giocatore ia[]);//da le carte, estrae la carta sotto e imposta la briscola
void gioca_prima_ia_mani_1_a_17(struct carta mazzo[],struct giocatore umano[],struct giocatore ia[]);
struct carta pescata(struct carta mazzo[]);//da usare per tutte le pescate tranne l'ultima che è la carta sotto
//main////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int main(int argc, char*argv[]){
//variabili(aggiungere man mano)
       int i;
       struct carta mazzo[40];
       struct giocatore umano[1], ia[1];
       //dati iniziali (il computer fa sempre le carte ed inizia prima il giocatore reale [riga 32])
       printf("Ciao.\nTi va di giocare?\n\n\n");
       umano[0].punteggio=0;
       umano[0].turno=0;
//programma(soprattutto con chiamate varie)        
       loading(mazzo);
       preparazione(mazzo, umano, ia);
//prime 17 mani        
       for(i=0;i<17;i++){
               printf("La tua mano:\n");  
               printf("1\t%s\n",umano[0].mano[0].nome);
               printf("2\t%s\n",umano[0].mano[1].nome);
               printf("3\t%s\n",umano[0].mano[2].nome);
               if(umano[0].turno==0){
                       //gioca prima la ia
                       gioca_prima_ia_mani_1_a_17(mazzo, umano, ia);
               }
               else{
                       //gioca prima il giocatore
               }
               
       }
       
       system("PAUSE");
return 0;
}
//esecuzione funzioni//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loading(struct carta mazzo[]){
       int i;  //ti manca da inserire la parte riguardante punti e valore strozzo (briscola e carta sotto in altra funz)
       for(i=0;i<40;i++){
               mazzo[i].id=i;
               if(i<10)
               mazzo[i].seme=0;
               if(i>=10 && i<20)
               mazzo[i].seme=1;
               if(i>=20 && i<30)
               mazzo[i].seme=2;
               if(i>=30 && i<40)
               mazzo[i].seme=3;
               mazzo[i].status=0;//cambia in altre funz
               mazzo[i].briscola=0;//cambia in altre funz
       }
       strcpy(mazzo[0].nome,"asso di spade");
       strcpy(mazzo[1].nome,"2 di spade");
       strcpy(mazzo[2].nome,"3 di spade");
       strcpy(mazzo[3].nome,"4 di spade");
       strcpy(mazzo[4].nome,"5 di spade");
       strcpy(mazzo[5].nome,"6 di spade");
       strcpy(mazzo[6].nome,"7 di spade");
       strcpy(mazzo[7].nome,"fante di spade");
       strcpy(mazzo[8].nome,"cavallo di spade");
       strcpy(mazzo[9].nome,"re di spade");
       strcpy(mazzo[10].nome,"asso di bastoni");
       strcpy(mazzo[20].nome,"asso di denari");
       strcpy(mazzo[30].nome,"asso di coppe");
       strcpy(mazzo[11].nome,"2 di bastoni");
       strcpy(mazzo[12].nome,"3 di bastoni");
       strcpy(mazzo[13].nome,"4 di bastoni");
       strcpy(mazzo[14].nome,"5 di bastoni");
       strcpy(mazzo[15].nome,"6 di bastoni");
       strcpy(mazzo[16].nome,"7 di bastoni");
       strcpy(mazzo[17].nome,"fante di bastoni");
       strcpy(mazzo[18].nome,"cavallo di bastoni");
       strcpy(mazzo[19].nome,"re di bastoni");
       strcpy(mazzo[21].nome,"2 di denari");
       strcpy(mazzo[22].nome,"3 di denari");
       strcpy(mazzo[23].nome,"4 di denari");
       strcpy(mazzo[24].nome,"5 di denari");
       strcpy(mazzo[25].nome,"6 di denari");
       strcpy(mazzo[26].nome,"7 di denari");
       strcpy(mazzo[27].nome,"fante di denari");
       strcpy(mazzo[28].nome,"cavallo di denari");
       strcpy(mazzo[29].nome,"re di denari");
       strcpy(mazzo[31].nome,"2 di coppe");
       strcpy(mazzo[32].nome,"3 di coppe");
       strcpy(mazzo[33].nome,"4 di coppe");
       strcpy(mazzo[34].nome,"5 di coppe");
       strcpy(mazzo[35].nome,"6 di coppe");
       strcpy(mazzo[36].nome,"7 di coppe");
       strcpy(mazzo[37].nome,"fante di coppe");
       strcpy(mazzo[38].nome,"cavallo di coppe");
       strcpy(mazzo[39].nome,"re di coppe");
}
void preparazione(struct carta mazzo[],struct giocatore umano[],struct giocatore ia[]){
       int i,j;
       srand(time(NULL));
       for(i=0;i<3;i++){
               do{        
               j=rand()%40;
               }while(mazzo[j].status==1);
               mazzo[j].status=1;        
               umano[0].mano[i]=mazzo[j];
       }
               for(i=0;i<3;i++){
               do{        
               j=rand()%40;
               }while(mazzo[j].status==1);
               mazzo[j].status=1;        
               ia[0].mano[i]=mazzo[j];
       }
       do{        
               j=rand()%40;
       }while(mazzo[j].status==1);
       mazzo[j].carta_sotto=1;
       printf("carta sotto:\n");
       printf("%s\n\n\n",mazzo[j].nome);
       for(i=0;i<40;i++){
               if(mazzo[j].seme==mazzo[i].seme)
               mazzo[i].briscola=1;
       }
               
}
struct carta pescata(struct carta mazzo[]){
       int j;
       srand(time(NULL));
       do{        
               j=rand()%40;
               }while(mazzo[j].status==1);
       return mazzo[j];        
}
void gioca_prima_ia_mani_1_a_17(struct carta mazzo[],struct giocatore umano[],struct giocatore ia[]){
       struct carta l,giocata,decisa;
       int scelta,controllo,i,j;
       controllo=0;
       for(i=0;i<2;i++){
               for(j=i+1;j<3;j++){
                       if(ia[0].mano[j].valore_strozzo<ia[0].mano[i].valore_strozzo){
                               l=ia[0].mano[j];
                               ia[0].mano[j]=ia[0].mano[i];
                               ia[0].mano[i]=l;
                       }
               }
       }
       for(i=0;i<3 && controllo==0;i++){
               if(ia[0].mano[i].briscola==0){
                       giocata=ia[0].mano[i];
                       controllo=1;
                       ia[0].mano[i]=pescata(mazzo);
               }
       }
       if(controllo==0){
               giocata=ia[0].mano[0];
               ia[0].mano[0]=pescata(mazzo);
       }
       
       printf("giocata ia: %s\n",giocata.nome);
       printf("seleziona che carta giocare\n");
       scanf("%d",&scelta);
       scelta--;
       decisa=umano[0].mano[scelta];
       umano[0].mano[scelta]=pescata(mazzo);
       if(decisa.briscola==0 && giocata.briscola==1){
               printf("prende la ia\n");
               }
               
       if(decisa.briscola==1 && giocata.briscola==0){
               printf("prendi tu\n");
               umano[0].turno=1;
               umano[0].punteggio=umano[0].punteggio+decisa.punti+giocata.punti;
       }
       if(decisa.briscola==1 && giocata.briscola==1){
               if(decisa.valore_strozzo>giocata.valore_strozzo){
               printf("prendi tu\n");
               umano[0].turno=1;
               umano[0].punteggio=umano[0].punteggio+decisa.punti+giocata.punti;        
               }
               else
               {
               printf("prende la ia\n");        
               }
       }
       if(decisa.briscola==0 && giocata.briscola==0){
               if(decisa.seme!=giocata.seme){
                       printf("prende la ia\n");
               }
               else{
                       if(decisa.valore_strozzo>giocata.valore_strozzo){
                       printf("prendi tu\n");
                       umano[0].turno=1;
                       umano[0].punteggio=umano[0].punteggio+decisa.punti+giocata.punti;        
                       }
                       else
                       {
                       printf("prende la ia\n");        
                       }
                       
               }
       }        
       
}
grazie per l'aiuto

4 Risposte

  • Re: Non trovo l'errore (C)

    Premesso che non conosco la briscola e quindi non credo di poterti aiutare, ti consiglio di spiegare quale problema riscontri se vuoi che qualcuno ti dia una mano.
  • Re: Non trovo l'errore (C)

    L'errore non l'ho cercato neppure io, però vorrei suggerirti un modo per ridurre parecchio la "verbosità" della funzione loading():
    void loading(struct carta mazzo[]){
        const char *pt[] = {"asso","2","3","4","5","6","7","fante","cavallo","re"};
        const char *sm[] = {"spade","bastoni","denari","coppe"};
        int i;
        
        for(i=0;i<40;i++){
            mazzo[i].id=i;
            mazzo[i].seme=i/10;
            mazzo[i].status=0;//cambia in altre funz
            mazzo[i].briscola=0;//cambia in altre funz
            sprintf(mazzo[i].nome,"%s di %s",pt[i%10],sm[i/10]);
        }
    }
    Non l'ho verificato, ma dovrebbe funzionare.
  • Re: Non trovo l'errore (C)

    Non si capisce quale sia il malfunzionamento. Avresti dovuto essere più chiaro nel tuo post.

    Comunque, non comprendo perché ti complichi la vita con

    umano[1], ia[1]

    e non utilizzi semplicemente

    umano, ia
  • Re: Non trovo l'errore (C)

    Ho posto umano[1] e ia[1] perchè più avanti vorrei fare in modo più avanti ad avere più giocatori (guidati dal computer) così da avere i vettori e doverli solo cambiare ed aggiungere qualche ciclo.

    il malfunzionamento consiste nel fatto che non mi funzionano correttamente gli if(dandomi sempre che prende l'ia) e dandomi carte che non dovrebbe darmi perchè hanno status=1(quindi già pescate o eventualmente carta sotto
    )
Devi accedere o registrarti per scrivere nel forum
4 risposte