Giochino c++

di il
62 risposte

Giochino c++

Ciao a tutti! Devo scrivere un programma C++ che risolva il classico giochino della Torre di Hanoi con 5 dischi.
Io vorrei fare una cosa simile: visualizzare
--54321
--
--
e poi i vari passaggi:
--5432
--1
--
poi
--543
--1
--2
eccetera fino ad arrivare a
--
--
--54321
solo che non ho neanche idea di come partire. Avete qualche suggerimento?

62 Risposte

  • Re: Giochino c++

    Da Wikipedia
    
    La soluzione base del gioco della torre di Hanoi si formula in modo ricorsivo.
    
    Siano i paletti etichettati con A, B e C, e i dischi numerati da 1 (il più piccolo) a n (il più grande). L'algoritmo si esprime come segue:
    
       1. Sposta i primi n-1 dischi da A a B. (Questo lascia il disco n da solo sul paletto A)
       2. Sposta il disco n da A a C
       3. Sposta n-1 dischi da B a C
    
    Per spostare n dischi si richiede di compiere un'operazione elementare (spostamento di un singolo disco) ed una complessa, ossia lo spostamento di n-1 dischi. Tuttavia anche questa operazione si risolve nello stesso modo, richiedendo come operazione complessa lo spostamento di n-2 dischi. Iterando questo ragionamento si riduce il processo complesso ad uno elementare, ovvero lo spostamento di n-(n-1)=1 disco.
    
  • Re: Giochino c++

    Incredibile...stavo giusto leggendo questo articolo e pensando che forse potevo farcela da solo
    cmq grazie. proverò e se non capisco qualcosa torno a chiedere (come al solito...)
  • Re: Giochino c++

    Lo so che puoi farcela da solo. Ormai stai diventando un pro.
  • Re: Giochino c++

    Certo...
    cmq grazie della fiducia
  • Re: Giochino c++

    Rieccomi, ma con un altro gioco: battaglia navale. Allora... io ho scritto questo
    
    #include <iostream>
    #include <cstdlib>
    #include <stdlib.h>
    #include <iomanip>
    #include <ctime>
    using namespace std;
    
    int boat, y, z, w;
    
    void CreaNumero () {
        srand ((unsigned)time(NULL));;
        boat = rand()%81+1;
    }
    
    void StampaMatrice () {
        const int RIGHE = 5, COLONNE = 10;
        int i, j, n = 0, capo = 0;
        int mat [15][15];
        for (i = 1 ; i <= COLONNE ; ++i) {
            for (j = 1 ; j <= RIGHE ; ++j) {
                ++n;
                mat[i][j] = n;
            }
        }
        for (i = 1 ; i <= COLONNE ; ++i) {
            for (j = 1 ; j <= RIGHE ; ++j) {
                cout<<setw(3)<<mat[i][j];
                ++capo;
                if (capo%10 == 0) {
                    cout<<endl<<endl;
                }
            }
        }
        cout<<endl;
    }
    
    cioè ho creato un numero pseudo-casuale e ho stampato una matrice (il campo da gioco) fatto di numeri (che fanno un po' da coordinate). Adesso non so cosa fare. Cioè...dovrei tipo scrivere delle funzioni che controllino la disponibilità di celle (tipo di non uscire dal campo) e che dispongano le navi. Mi puoi dare qualche idea, tipo una serie di passaggi?
    Come al solito grazie infinite!!!
  • Re: Giochino c++

    
    const int RIGHE = 5, COLONNE = 10;
    int mat [15][15];
    
    c'è qualcosa che non torna. Non ti facio neanche la domanda tanto lo capisci dalle righe scritte.
    Quel boat = rad()%81 + 1 cosa significa?
  • Re: Giochino c++

    Sì certo!!! è che ho appena modificato il codice introducendo le const e mi sono scordato di togliere i due 15. comunque boat sarebbe (nella mia mente malata) la posizione della barca e ho chiesto al pc di generare un numero tra 1 e 81 (perchè prima la scacchiera era 9x9). Il problema è che così avrei solo un punto, mentre io vorrei che ogni barca occupasse più di una casella...
  • Re: Giochino c++

    Puoi fare una funzione dove li passi il punto iniziale e la dimensione della barca. La funzione può essere così:
    
    bool mettiBarca(int riga, int colonna, int dimensione, bool horizontale)
    
    bool perche può tornare true se è riuscito a piazzare la barca oppure false se c'è una collisione con un altra barca oppure le dimensioni sono + grandi dello spazio. Io di solito la matrice la faccevo con i puntini x le celle vuote e con gli * per le celle piene. poi vedi tu.
  • Re: Giochino c++

    Immaginavo che ci volesse bool...e poi dentro al bool dovrei metterci roba tipo
    
    if(riga<MAXRIGHE && colonna<MAXCOLONNA)
    
    eccetera, vero?
    un'altra cosa: come faccio a fargli posizionare più di una barca? gli faccio generare più di un numero casuale?
  • Re: Giochino c++

    Giusto. Se è in verticale ti sposterai di colonne x verificare se nella celle c'è un * prima di poszionare la barca. Se orizzontale ti sposterai di righe.
    la prima cosa da fare è:
    
    if(orizzontale)
    {
       if(riga + dimensione > MAX_RIGHE)
          return false;
    }
    else
    {
       if(colonna + dimensione > MAX_COLONNE)
          return false;
    }
    
    dopo aver verificato questo puoi vedere se c'è un collisione e tornare true o false a seconda del caso.
  • Re: Giochino c++

    Capisco. e dimensione sarebbe la dimensione della barca, vero?
    ok ma il problema è sempre quello: io ad esempio creo due numeri casuali boat1 e boat2. poi come faccio? devo chiamare il bool due volte con i parametri per le due barche? cioè devo scrivere tipo
    
    bool (boat1, boat2)
    
    questo punto non mi è chiaro...
  • Re: Giochino c++

    Dipende quante barche vuoi generare.Puoi creare un for con un contatore
    
    for(i = 0; i < non_so, i++)
    {
    do
    {
     boat = rand() % 81 + 1;
    genera riga e colonna dal boat tipo:
    colonna = boat / 10;
    riga = boat % 10;
    }while(!mettiBarca(riga,colonna,dimensione_a_scelta, verticale));
       i++;
    }
    
    questo è solo un esempio. Il programma genera dei punti finche la barca non viene piazzata poi incrementa e passa alla prossima barca. Ovviamente ci sarà un limite che dovreai preffissare tu. non puoi mettere 10 barche da 10 in una matrice 9x9.
  • Re: Giochino c++

    Ah...adesso mi sembra molto più chiaro. lo so che ti rompo molto ma !mettiBarca vuol dire finchè mettiBarca è true o false?
  • Re: Giochino c++

    False
Devi accedere o registrarti per scrivere nel forum
62 risposte