Qual'è l'errore??? non posiziona le mine.. come mai? dev c++

di il
10 risposte

Qual'è l'errore??? non posiziona le mine.. come mai? dev c++

/* gioco del prato fiorito. Il contenuto di ogni mina è indicato con:
- 1000 la casella è ancora coperta
- 100 c'è una mina
- 0 non ci sono mine vicino
- 1 c'è una mina vicino
- 2 ci sono due mine vicino
- ...
*/

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

#define dim 4 /* dimensione della griglia di gioco */
#define num_mine 4 /* numero di mine da piazzare */

/* matrice che memorizza le mine e le informazioni su dove sono */
int prato[dim][dim];
/* matrice visualizata */
int pratov[dim][dim];
/* variabili */
int r,c,i,j,gameover,non_mine,cont,fatto;

/* è quando si fa click su una casella per scoprirla */
void Click(int r, int c);
/* visualizza il prato momentaneamente scoperto */
void VisualizzaPrato();
/* disponi le mine */
void DisponiMine();
/* metti informazioni sulle mine */
void CalcolaVicinanze();
/* griglia da visualizzare tutta coperta */
void InizializzaGriglia();


main()
{
/* azioni iniziali */
InizializzaGriglia();
DisponiMine();
CalcolaVicinanze();
non_mine = dim*dim-num_mine;

/* gioca */
gameover = 0;
cont = 0;
while (gameover==0)
{
/* visualizza prato fiorito */
system("cls");
VisualizzaPrato();
/* scegli casella da scoprire */
printf("\nquale casella vuoi scoprire?\n");
printf("riga: ");
scanf("%d", &i);
printf("colonna: ");
scanf("%d", &j);
/* scopri casella */
Click(i,j);
if (cont==non_mine) /* se le abbiamo scoperte tutte... */
{
printf("WOW! hai vinto\n");
gameover = 1;
}
}
system("pause");
}

/* tutte le caselle sono coperte all'inizio */
void InizializzaGriglia()
{
for(i=0;i<dim;i++)
for(j=0;j<dim;j++)
pratov[j]=1000;
}

/* scopri una casella */
void Click(int r, int c)
{
/* se mina... */
if (prato[r][c]==100)
{
printf("BUM! hai perso\n");
gameover = 1;
}
else /* altrimenti scopri la casella */
{
pratov[r][c]=prato[r][c];
cont++;
}
}

void VisualizzaPrato()
{
for(i=0;i<dim;i++)
{
for(j=0;j<dim;j++)
printf("%5d", pratov[j]); /* mette i numeri a distanza di 5 caratteri l'uno dall'altro */
printf("\n");
}
}

/* disponi le mine sulla griglia */
void DisponiMine()
{
cont = 0;
printf("sto posizionando le navi\n\n");
while(cont<num_mine)
{
srand(time(NULL));
r=rand()%dim;
Sleep(5);
srand(time(NULL));
c=rand()%dim;
if(prato[j]==1000)
{
prato[j]=100;
cont++;
}
}
}

10 Risposte

  • Re: Qual'è l'errore??? non posiziona le mine.. come mai? dev c++

    Ciao, ho fatto qualche correzione:
    - srand va chiamato una volta sola
    - nella funzione di inizializzazione non mettevi a 1000 anche le caselle di prato, ma solo quelle di pratov. Quindi l'if della funzione DisponiMine era sempre falso
    - nella DisponiMine "sorteggiavi" r e c ma poi usavi i e j come indici della matrice. Invece devi usare proprio r e c.

    Codice:
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <windows.h>
    
    #define dim 4 /* dimensione della griglia di gioco */
    #define num_mine 4 /* numero di mine da piazzare */
    
    /* matrice che memorizza le mine e le informazioni su dove sono */
    int prato[dim][dim];
    /* matrice visualizata */
    int pratov[dim][dim];
    /* variabili */
    int r,c,i,j,gameover,non_mine,cont,fatto;
    
    /* è quando si fa click su una casella per scoprirla */
    void Click(int r, int c);
    /* visualizza il prato momentaneamente scoperto */
    void VisualizzaPrato();
    /* disponi le mine */
    void DisponiMine();
    /* griglia da visualizzare tutta coperta */
    void InizializzaGriglia();
    
    
    int main()
    {
        srand(time(NULL));
        /* azioni iniziali */
        InizializzaGriglia();
        DisponiMine();
        non_mine = dim*dim-num_mine;
    
        /* gioca */
        gameover = 0;
        cont = 0;
        while (gameover==0)
        {
            /* visualizza prato fiorito */
            system("cls");
            VisualizzaPrato();
            /* scegli casella da scoprire */
            printf("\nquale casella vuoi scoprire?\n");
            printf("riga: ");
            scanf("%d", &i);
            printf("colonna: ");
            scanf("%d", &j);
            /* scopri casella */
            Click(i,j);
            if (cont==non_mine) /* se le abbiamo scoperte tutte... */
            {
                printf("WOW! hai vinto\n");
                gameover = 1;
            }
        }
        system("pause");
        return 0;
    }
    
    /* tutte le caselle sono coperte all'inizio */
    void InizializzaGriglia()
    {
        for(i=0; i<dim; i++)
        {
            for(j=0; j<dim; j++)
            {
                pratov[i][j]=1000;
                prato[i][j] = 1000;
            }
        }
    }
    
    /* scopri una casella */
    void Click(int r, int c)
    {
        /* se mina... */
        if (prato[r][c]==100)
        {
            printf("BUM! hai perso\n");
            gameover = 1;
        }
        else /* altrimenti scopri la casella */
        {
            pratov[r][c]=prato[r][c];
            cont++;
        }
    }
    
    void VisualizzaPrato()
    {
        for(i=0; i<dim; i++)
        {
            for(j=0; j<dim; j++)
                printf("%5d", pratov[i][j]); /* mette i numeri a distanza di 5 caratteri l'uno dall'altro */
            printf("\n");
        }
    }
    
    /* disponi le mine sulla griglia */
    void DisponiMine()
    {
        cont = 0;
        printf("sto posizionando le navi\n\n");
        while(cont<num_mine)
        {
            printf("%d\n", cont);
            r=rand()%dim;
            c=rand()%dim;
            if(prato[r][c]==1000)
            {
                prato[r][c]=100;
                cont++;
            }
        }
    }
    
    Credo ci siano comunque altri errori: prova a proseguire tu.

    PS. La prossima volta ricordati di postare il codice nei tag CODE.

  • Re: Qual'è l'errore??? non posiziona le mine.. come mai? dev c++

    Dev-c++
  • Re: Qual'è l'errore??? non posiziona le mine.. come mai? dev c++

    vbextreme ha scritto:


    dev-c++
    Quoto! Eppure è incredibile come molti docenti (anche universitari, e parlo per esperienza) continuino a far utilizzare questo software obsoleto e mediocre. Quando esistono IDE come CodeBlocks che sono nettamente migliori!

    P.S. Da notare come alcuni utenti addirittura scrivano "programmo in Dev C++", pensando che quello sia il nome del linguaggio. Non mi riferisco a Elii ma è una cosa che mi è capitato di vedere...
  • Re: Qual'è l'errore??? non posiziona le mine.. come mai? dev c++

    Ora funziona il disponi mine.. ma c'è un problema.. quando gioco e metto le coordinare resta sempre tutto 1000, ma dovrebbe mettere
    - 0 non ci sono mine vicino
    - 1 c'è una mina vicino
    - 2 ci sono due mine vicino
    le mine le mette infatti, perchè continuando mi dice che ho perso ( ma io non posso vedere nulla... resta tutto 1000)

    ho continuato dopo la funzione disponi mine
    void CalcolaVicinanze()
    {
    for(i=0;i<dim;i++)
    for(j=0;j<dim;j++)
    {
    cont = 0;
    if (prato[j]!=100) /* se non è una mina */
    {
    /* angolo superiore sinistro */
    if(i==0 && j==0)
    {
    if(prato[1][0]==100)
    cont++;
    if(prato[0][1]==100)
    cont++;
    if(prato[1][1]==100)
    cont++;
    }
    /* angolo superiore destro */
    if(i==0 && j==dim-1)
    {
    if(prato[0][dim-2]==100)
    cont++;
    if(prato[1][dim-2]==100)
    cont++;
    if(prato[1][dim-1]==100)
    cont++;
    }
    /* angolo inferiore sinistro */
    if(i==dim-1 && j==0)
    {
    if(prato[dim-2][0]==100)
    cont++;
    if(prato[dim-2][1]==100)
    cont++;
    if(prato[dim-1][1]==100)
    cont++;
    }
    /* angolo inferiore destro */
    if(i==dim-1 && j==dim-1)
    {
    if(prato[dim-2][dim-1]==100)
    cont++;
    if(prato[dim-2][dim-2]==100)
    cont++;
    if(prato[dim-1][dim-2]==100)
    cont++;
    }
    /* colonna 0 (tranne gli angoli) */
    if (j==0 && i>0 && i<dim-1)
    {
    if(prato[i-1][0]==100)
    cont++;
    if(prato[i-1][1]==100)
    cont++;
    if(prato[1]==100)
    cont++;
    if(prato[i+1][1]==100)
    cont++;
    if(prato[i+1][0]==100)
    cont++;
    }
    /* colonna dim-1 (tranne gli angoli) */
    if (j==dim-1 && i>0 && i<dim-1)
    {
    if(prato[i-1][dim-1]==100)
    cont++;
    if(prato[i-1][dim-2]==100)
    cont++;
    if(prato[dim-2]==100)
    cont++;
    if(prato[i+1][dim-2]==100)
    cont++;
    if(prato[i+1][dim-1]==100)
    cont++;
    }
    /* riga 0 (tranne gli angoli) */
    if (i==0 && j>0 && j<dim-1)
    {
    if(prato[j-1]==100)
    cont++;
    if(prato[i+1][j-1]==100)
    cont++;
    if(prato[i+1][j]==100)
    cont++;
    if(prato[i+1][j+1]==100)
    cont++;
    if(prato[j+1]==100)
    cont++;
    }
    /* riga dim-1 (tranne gli angoli) */
    if (i==dim-1 && j>0 && j<dim-1)
    {
    if(prato[j-1]==100)
    cont++;
    if(prato[i-1][j-1]==100)
    cont++;
    if(prato[i-1][j]==100)
    cont++;
    if(prato[i-1][j+1]==100)
    cont++;
    if(prato[j+1]==100)
    cont++;
    }
    /* tutti gli altri casi */
    if(i>0 && i<dim-1 && j>0 && j<dim-1)
    {
    if(prato[i-1][j-1]==100)
    cont++;
    if(prato[j-1]==100)
    cont++;
    if(prato[i+1][j-1]==100)
    cont++;
    if(prato[i-1][j+1]==100)
    cont++;
    if(prato[j+1]==100)
    cont++;
    if(prato[i+1][j+1]==100)
    cont++;
    if(prato[i-1][j]==100)
    cont++;
    if(prato[i+1][j]==100)
    cont++;
    }
    prato[j]=cont;
    }
    }
    }


    ma come si mettono i tag code??
  • Re: Qual'è l'errore??? non posiziona le mine.. come mai? dev c++

    Lo vedi un pulsante con scritto

    Code

    ?
  • Re: Qual'è l'errore??? non posiziona le mine.. come mai? dev c++

    Si poi?
  • Re: Qual'è l'errore??? non posiziona le mine.. come mai? dev c++

    Se provi ad usarlo non esplode nulla ...
  • Re: Qual'è l'errore??? non posiziona le mine.. come mai? dev c++

    Chi non caga muore gonfio
  • Re: Qual'è l'errore??? non posiziona le mine.. come mai? dev c++

    vbextreme ha scritto:


    chi non caga muore gonfio
    Questa è una perla che non conoscevo! Da tenere a mente...
  • Re: Qual'è l'errore??? non posiziona le mine.. come mai? dev c++

    Ci son riuscitaa
Devi accedere o registrarti per scrivere nel forum
10 risposte