Giochino c++

di il
62 risposte

62 Risposte - Pagina 2

  • Re: Giochino c++

    Ok grazie!!!
  • Re: Giochino c++

    Rieccomi...mi dispiace continuare a romperti le scatole, ma avrei bisogno di una mano: ho scritto il codice di battaglia navale e devo dire che funziona proprio bene (sono molto orgoglioso). Ho un unico problema: ci hanno detto di scrivere una funzione che disponga un tot di navi di lunghezza diversa e devo dire che non ho la più pallida idea di come scriverla. Se guardi il mio codice vedrai la funzione DisponiNavi() ma questa crea solamente venti punti true, invece dovrei creare delle striscie... Come al solito chiedo il tuo prezioso aiuto; il codice è questo:
    
    #include <iostream>
    #include <cstdlib>
    #include <ctime>
    #include <iomanip>
    using namespace std;
    
    bool griglia [9][9];
    char mat [9][9];
    
    void DisponiNavi() {
        srand(time(NULL));
        for (int i = 0; i < 10; ++i) {
            for(int j = 0; j < 10; ++j) {
                griglia[i][j] = false;
            }
        }
        int navi = 0;
        while (navi < 20) {
            griglia [rand()%9+1][rand()%9+1] = true;
            ++navi;
        }
    }
    
    void Crea() {
        for (int m = 1; m <= 9; ++m) {
            for (int n = 1; n <= 9; ++n) {
                mat[m][n] = '.';
            }
        }
    }
    
    void Stampa() {
        int capo = 0;
        for (int m = 1; m <= 9; ++m) {
            for (int n = 1; n <= 9; ++n) {
                cout<<setw(3)<<mat[m][n];
                ++capo;
                if (capo%9 == 0)
                    cout<<endl<<endl;
            }
        }
    }
    
    int main () {
        int TIRI = 10;
        int riga, colonna;
        Crea();
        Stampa();
        DisponiNavi();
        cout<<"Hai 10 tiri a disposizione"<<endl;
        for (int tiriFatti = 1; tiriFatti <= TIRI; ++tiriFatti) {
        cout<<"Inserisci la riga: ";
        cin>>riga;
        cout<<"Inserisci la colonna: ";
        cin>>colonna;
        if (griglia[riga][colonna]) {
            cout<<"Bravo"<<endl;
            ++TIRI;
            cout<<"Hai ancora "<<TIRI-tiriFatti<<" tiri a disposizione"<<endl;
            mat[riga][colonna] = 'X';
            Stampa();
        }
        else{
            cout<<"Acqua"<<endl;
            cout<<"Hai ancora "<<TIRI-tiriFatti<<" tiri a disposizione"<<endl;
            mat[riga][colonna] = 'O';
            Stampa();
            }
        }
        cout<<endl;
        system("PAUSE");
    }
    
    Grazie ancora skynet
  • Re: Giochino c++

    Ti faccio una domanda. Se io ti do una nave da piazzare di dimensione x e orientamento diciamo orizzontale tu sapresti fare la funzione che mi controlla se questa è in collisione con un altra? Pensaci e hai risolto metà del algoritmo.
  • Re: Giochino c++

    Controlla la funzione crea. Dovrebbe andarti in crash il programma in quanto vai a scrivere nella posizione 9 che è fuori dalla matrice. l'enumerazione inizia sempre da 0 e non da 1 per arrivare a 9-1.
  • Re: Giochino c++

    Per il problema della funzione Crea() ti dirò che il programma non mi è mai andato in crash, forse perchè faccio iniziare m e n da 1. Non lo so perchè ma finora non è mai successo niente di strano.
  • Re: Giochino c++

    Per quanto rigurada la tua domanda: ci penso e poi ti so dire. Comunque apprezzo molto il fatto che tu mi ci voglia far arrivare e non mi scriva solo il codice per farmi stare zitto. E' solo così che si impara davvero...
  • Re: Giochino c++

    minomic ha scritto:


    Per il problema della funzione Crea() ti dirò che il programma non mi è mai andato in crash, forse perchè faccio iniziare m e n da 1. Non lo so perchè ma finora non è mai successo niente di strano.
    Che non sia andato in crash non significa aver fatto bene la funzione. Quindi non dare mai niente x scontato. mat[9][9] non esite. Errore array out of bounds, almeno con Visual Studio. Quindi segui le regole e non pensare che non andando in crash il programma funziona bene.
  • Re: Giochino c++

    Allora dovrei cambiare anche questo
    
    int navi = 0;
        while (navi < 20) {
            griglia [rand()%9+1][rand()%9+1] = true;
            ++navi;
    
    e mettere rand()%8+1 ?
  • Re: Giochino c++

    Per forza. tutti gli contenitori iniziano dal zero per arrivare alla dimensione massima - 1. E' un dato di fatto.
  • Re: Giochino c++

    Capisco. in effetti lo sapevo, ma speravo di poter cominciare a contare da 1 facendo partire i,j,m,n da 1 in modo da escludere dal gioco le coordinate (0,0) (0,1) ecc che sono poco eleganti. non c'è alcun modo, vero?
  • Re: Giochino c++

    Secondo te così va bene?
    
    bool griglia [10][10];
    char mat [10][10];
    
    void DisponiNavi() {
        srand(time(NULL));
        for (int i = 1; i < 10; ++i) {
            for(int j = 1; j < 10; ++j) {
                griglia[i][j] = false;
            }
    
    cioè dichiarando la matrice 10x10 e facendo partire le numerazioni da 1 in modo che restino 9 caselle?
  • Re: Giochino c++

    Ma perche è cosi dificile partire da 0. Dovrebbe entrarti intesta che qualsiasi oggetto inizia da 0 come enumerazione. Così come hai scritto può anche andare bene ma devi sempre tener presente che l'enumerazione inizia da uno ecc. Non è facile per uno che guarda il tuo codice da esterno capire il perche tu non hai occupato le caselle con indice 0 per riga e per colonna e crede che stai faccendo un algoritmo sbagliato.
  • Re: Giochino c++

    skynet ha scritto:


    Ma perche è cosi dificile partire da 0
    non è affatto difficile, solo volevo evitare le coordinate (0,0) (0,1) ecc che in un normale gioco di battaglia navale non si sono mai viste, ecco tutto...
  • Re: Giochino c++

    
    cout << "Inserisci riga da 1 a 9";
    cin >> riga;
    cout << "Inserisci colonna 1 a 9";
    cin >> colonna;
    
    MettiBarca(riga - 1, colonna -1);
    
    ecco risolto. L'utente non sa che la matrice inizia da 0,0 ma crede che inizia da 1,1
  • Re: Giochino c++

    In effetti è vero...facciamo che prima provo a completarlo e poi, in fase di pulizia, sistemo queste cose. A proposito di completare, mi serve ancora il tuo aiuto. Ho scritto
    
    #include <iostream>
    #include <cstdlib>
    #include <ctime>
    #include <iomanip>
    using namespace std;
    
    bool griglia [9][9];
    char mat [9][9];
    
    void DisponiNavi() {
        srand(time(NULL));
        for (int i = 1; i < 10; ++i) {
            for(int j = 1; j < 10; ++j) {
                griglia[i][j] = false;
            }
        }
        int navi = 0;
        while (navi < 20) {
            griglia [rand()%9+1][rand()%9+1] = true;
            ++navi;
        }
    }
    
    void Crea() {
        for (int m = 1; m <= 9; ++m) {
            for (int n = 1; n <= 9; ++n) {
                mat[m][n] = '.';
            }
        }
    }
    
    void Stampa() {
        int capo = 0;
        for (int m = 1; m <= 9; ++m) {
            for (int n = 1; n <= 9; ++n) {
                cout<<setw(3)<<mat[m][n];
                ++capo;
                if (capo%9 == 0)
                    cout<<endl<<endl;
            }
        }
    }
    
    int main () {
        int TIRI = 10;
        int riga, colonna;
        Crea();
        Stampa();
        DisponiNavi();
        cout<<"Hai 10 tiri a disposizione"<<endl;
        for (int tiriFatti = 1; tiriFatti <= TIRI; ++tiriFatti) {
        cout<<"Inserisci la riga: ";
        cin>>riga;
        cout<<"Inserisci la colonna: ";
        cin>>colonna;
        if (griglia[riga][colonna]) {
            cout<<"Bravo"<<endl;
            ++TIRI;
            cout<<"Hai ancora "<<TIRI-tiriFatti<<" tiri a disposizione"<<endl;
            mat[riga][colonna] = 'X';
            Stampa();
        }
        else{
            cout<<"Acqua"<<endl;
            cout<<"Hai ancora "<<TIRI-tiriFatti<<" tiri a disposizione"<<endl;
            mat[riga][colonna] = 'O';
            Stampa();
            }
        }
        cout<<endl;
        system("PAUSE");
    }
    
    e poi ho provato ad aggiungere la bool MettiBarca e ho scritto
    
    bool MettiBarca (int dimensione) {
        dimensione = rand()%4+1;
        for (int i = 1; i < 10; ++i) {
            for(int j = 1; j < 10; ++j) {
                if (griglia [i][j] = true && j + dimensione <= 9) {
                    for (; j < j + dimensione; ++j) {
                        griglia [i][j] = true;
                    }
                }
            }
        }
    }
    
    ma mi sa che ha sbagliato qualcosa, o almeno mi sa che non faccia quello che voglio. A questo punto ti chiedo di darci una sistemata...il ragionamento non mi sembra sbagliato: se un punto è true sorteggia una dimensione tra 1 e 4 e, per j che va da quella del punto a j + dimensione, rendi true tutte le caselle adiacenti orizzontali...mah...
Devi accedere o registrarti per scrivere nel forum
62 risposte