PROBLEMA forza 4 in C

Pubblicità

abcdeeeeff

Utente Attivo
Messaggi
521
Reazioni
289
Punteggio
67
ciao a tutti
per il corso di informatica dell'università sto facendo come esercizio scrivere un programma per giocare a forza 4(se avete avuto un'infanzia triste e senza forza 4 cercate su google :P )

per il momento il mio codice è questo
Codice:
#include <stdio.h>#include <stdlib.h>
#include <string.h>


void inserimento (int w, int h, int *campo, int turno);
void stampa_campo (int h, int w, int campo[h][w]);


int main ()
{
    int w, h, i, j;
    int vittoria=0;


    printf("Di che dimensione deve essere il campo da gioco(WxH)?\n");
    scanf("%dx%d", &w, &h);


    int campo[h][w];            //ogni casella viene impostata come vuota
    for (i=0; i<h; i++)
    {
        for (j=0; i<w; i++)
        {
            campo[i][j] == 0;
        }
    }




    i=0;
    while(vittoria!=1)  //variabile ancora da implementare, per ora 0 = partita in corso, 1 = qualcuno ha vinto
    {
        i++;
        if (i%2==0)
        {
            printf("Tocca al primo giocatore\n");
        }
        else
        {
            printf("Tocca al secondo giocatore\n");
        }


        inserimento(w, h, &campo, i);
    }
    return 0;
}




void inserimento (int w, int h, int *campo, int turno)          //funzione per inserire il dischetto nella tabella/campo da gioco
{
    int colonna;
    int i, j;
    do
    {
        printf("In che colonna bisogna inserire il disco: ");
        scanf("%d", &colonna);
    } while (colonna>w);
    j=colonna;
    for (i=0; *(*(campo+i)+j) == 0; i++)            //ERRORE
    {


    }
    if ((turno%2)==0)
    {
        *(*(campo+i)+j)=1;                             //ERRORE
    }
    else
    {
        *(*(campo+i)+j)=2;                             //ERRORE
    }
}


void stampa_campo (int h, int w, int campo[h][w])        //funziona per stampare il campo da gioco
{
    int i,j;
    int current;
    system("cls");
    for (i=0; i<h; i++)
    {
        printf("|");
        for (j=0; j<w; j++)
        {
            current = campo[i][j];
            if( current == 0)
            {
                printf("   |");
            }
            else if( current == 1)
            {
                printf(" R |");
            }
            else if( current == 2)
            {
                printf(" G |");
            }
        }
        printf("\n");
    }
}

nelle 3 righe in cui c'è il commento ERRORE(nella funzione inserimento) il compilatore mi dà un'errore, di cui non riesco a spiegarmi il perchè
"invalid type argument of 'unary *' (have 'int')"

consigli?
 
Ultima modifica:
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


void inserimento (int w, int h, int *campo, int turno);
void stampa_campo (int h, int w, int campo[h][w]);


int main ()
{
    int w, h, i, j;
    int vittoria=0;


    printf("Di che dimensione deve essere il campo da gioco(WxH)?\n");
    scanf("%dx%d", &w, &h);


    int campo[h][w];            //ogni casella viene impostata come vuota
    for (i=0; i<h; i++)
    {
        for (j=0; i<w; i++)
        {
            [SIZE=3][B]campo[i][j] == 0;    //Qui c'è comunque un errore, se lo devi impostare a 0 devi scrivere "campo[i][j] = 0;" non con == [/B][/SIZE]
        }
    }




    i=0;
    while(vittoria!=1)  //variabile ancora da implementare, per ora 0 = partita in corso, 1 = qualcuno ha vinto
    {
        i++;
        if (i%2==0)
        {
            printf("Tocca al primo giocatore\n");
        }
        else
        {
            printf("Tocca al secondo giocatore\n");
        }


        inserimento(w, h, &campo, i);
    }
    return 0;
}




void inserimento (int w, int h, [B]int *campo[/B], int turno)        [SIZE=3][B]//L'errore è qui, il campo è di tipo int** non int*[/B][/SIZE]
{
    int colonna;
    int i, j;
    do
    {
        printf("In che colonna bisogna inserire il disco: ");
        scanf("%d", &colonna);
    } while (colonna>w);
    j=colonna;
    for (i=0; *( *( campo + i ) +j) == 0; i++)            //ERRORE
    {


    }
    if ((turno%2)==0)
    {
        *(*(campo+i)+j)=1;                             //ERRORE
    }
    else
    {
        *(*(campo+i)+j)=2;                             //ERRORE
    }
}


void stampa_campo (int h, int w, int campo[h][w])        //funziona per stampare il campo da gioco
{
    int i,j;
    int current;
    system("cls");
    for (i=0; i<h; i++)
    {
        printf("|");
        for (j=0; j<w; j++)
        {
            current = campo[i][j];
            if( current == 0)
            {
                printf("   |");
            }
            else if( current == 1)
            {
                printf(" R |");
            }
            else if( current == 2)
            {
                printf(" G |");
            }
        }
        printf("\n");
    }
}

Vedi se così funzia ;)
 
le due notazioni(la mia o la tua) sono perfettamente equivalenti, infatti non cambia nulla

Alcuni compilatori interpretano la seconda variabile come una sorta di "variant" quindi dipende, era solo una verifica.

a lezione non ci avevano spiegato che in questo caso di usava il tipo int**, negli esempi mettevano solo un *

Occhio che questo non c'entra con il doppio =
 
Ultima modifica da un moderatore:
se una funzione prende in ingresso un parametro di tipo int **, come glielo passo l'indirizzo, così?

(esempio)
int funzione (int ** boh);

int main()
{
int array[10][10];
...
funzione(&array);
}


facendo così il compilatore mi dà un warning del tipo

warning: passing argument 1 of 'funzione' from incompatible pointer type
note: expected 'int **' but argument is of type 'int *'
 
se una funzione prende in ingresso un parametro di tipo int **, come glielo passo l'indirizzo, così?

(esempio)
int funzione (int ** boh);

int main()
{
int array[10][10];
...
funzione(&array);
}


facendo così il compilatore mi dà un warning del tipo

warning: passing argument 1 of 'funzione' from incompatible pointer type
note: expected 'int **' but argument is of type 'int *'

Poiché la matrice è statica (ovvero conosci già le dimensioni) devi fare una cosa del genere:
Codice:
void funzione(int[10][10] matrice);

void main()
{

int[10][10] mat;

funzione(mat);

}

void funzione (int[10][10] matrice)
{
    //Fa qualcosa sulla matrice.
}
 
la matrice viene poi utilizzata da altre funzioni, quindi è dichiarata nel main. se la passo per valori nel main mi rimane non modificata

Ma hai provato a compilare e eseguire seguendo quello che ti ho detto?
Io ho provato a modificare una matrice usando una funzione scritta in quel modo e la matrice viene modificata.
Il fatto è che devi distinguere le matrici allocate staticamente (come la tua) e quelle dinamiche (con malloc):
Se proprio vuoi utilizzare come parametro formale int** nelle funzioni allora devi allocare la matrice con la malloc.
 
Ma hai provato a compilare e eseguire seguendo quello che ti ho detto?
Io ho provato a modificare una matrice usando una funzione scritta in quel modo e la matrice viene modificata.
Il fatto è che devi distinguere le matrici allocate staticamente (come la tua) e quelle dinamiche (con malloc):
Se proprio vuoi utilizzare come parametro formale int** nelle funzioni allora devi allocare la matrice con la malloc.


mmh ok allora proverò, grazie(mi sa che avevo frainteso un pezzo della spiegazione sui puntatori)
 
Pubblicità
Pubblicità
Indietro
Top