Visualizzazione dei risultati da 1 a 5 su 5

Discussione: [C++] Ciclo ripetuto

  1. #1
    Utente di HTML.it
    Registrato dal
    May 2017
    Messaggi
    14

    [C++] Ciclo ripetuto

    Salve a tutti, sono nuovo del forum.
    Studio Informatica all' universit� al primo anno e per esercitarmi sto ho pensato di creare il gioco "DUBITO".
    Nella compilazione del codice � sorto un problemino: sto implementando la funzione che gestisce il cambio turno dei vari giocatori, in pratica l'idea sarebbe quella di memorizzare in un vettore i giocatori della partita, con un ciclo for scorrere gli indici e una volta che il vettore � terminato ripartire da capo. Il problema sta proprio nel riportare la i al punto iniziale per ricominciare il giro.
    Ringrazio anticipatamente chi riuscisse ad aiutarmi.

    #include <iostream>
    #include <cstdlib>
    #include <string>
    using namespace std;

    int main(){

    string giocatori[4] = {"luca", "max", "tommy", "piero"};

    bool victory = false; // condizone di uscita dal gioco se diventa true
    int i, cont;
    int iniziale=2, vincitore; // � un numero casuale con cui viene decretato il giocatore iniziale, lo ho ottenuto con la funzione srand ma per semplicit� lo fisso ad un certo indice

    while(!victory){ // ciclo nel quale si svilupper� il gioco

    for (i=iniziale;;i++){ // in questo modo diventa infinito lo so, per� teoricamente dovrebbe essere infinito fino a quando victory non cambia valore. Alternativamente ho pensato a queste condizioni: i=iniziale;victory != true;i++)
    cout << "tocca a: " << giocatori[i] << endl;
    if (i+1 == sizeof(giocatori){
    cout << "sei arrivato alla fine" << endl;
    vincitore = giocatore[i];
    i= iniziale; // un altro problema che ho riscontrato � che il gioco parte da un valore casuale ma se lo faccio ripartire da quel valore salta tutti i giocatori prima ex se iniziale = 2 l' ordine di gioco sar� 2 - 3- 4 ma poi ritorner� a 2
    }
    else {
    // qui si eseguirebbero le funzioni del gioco che per semplicit� sono sostituite da un incremento di un contatore
    cont++;
    }

    }
    // fuori dal for
    if (cont==10){
    vistory = true;
    cout << "ha vinto: " << vincitore << endl;

    }
    }



    }

    Scusate se sono stato un pochino prolisso ma ho preferito spendere due parole in pi� su ogni pezzo per cercare di farvi capire come ho pensato il codice.
    PS: potrebbero esserci parentesi sbagliate in quanto ho riscritto il codice a mano.
    grazie a tutti in anticipo per l' aiuto.

  2. #2
    Per quanto riguarda il ritornare al giocatore 1 dopo il 4 basta realizzare l'incremento nel for con l'operatore modulo, affinché la variabile resti sempre fra uno e la lunghezza del tuo array-1.
    Una cosa del tipo
    codice:
    i = (i+1)%4
    Per fare le cose più pulite puoi quindi dichiarare una costante per la lunghezza e usare quella.
    Attenzione che il sizeof in quel modo ti restituisce la lunghezza in byte dell'array e quindi il confronto non ha senso.
    Inoltre, a meno di non prevedere un break nel for interno, la condizione su victory non è mai controllata e il programma non terminerà mai.
    La varaibile cont poi cosa rappresenterebbe?

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2017
    Messaggi
    14

    Grazie, funziona ;)

    Quote Originariamente inviata da scimmiaparlante Visualizza il messaggio
    Per quanto riguarda il ritornare al giocatore 1 dopo il 4 basta realizzare l'incremento nel for con l'operatore modulo, affinché la variabile resti sempre fra uno e la lunghezza del tuo array-1.
    Una cosa del tipo
    codice:
    i = (i+1)%4
    Per fare le cose più pulite puoi quindi dichiarare una costante per la lunghezza e usare quella.
    Attenzione che il sizeof in quel modo ti restituisce la lunghezza in byte dell'array e quindi il confronto non ha senso.
    Inoltre, a meno di non prevedere un break nel for interno, la condizione su victory non è mai controllata e il programma non terminerà mai.
    La varaibile cont poi cosa rappresenterebbe?

    Grazie infinite, ho cambiato l' impostazione e ora funziona però non ho ben capito come si comporta la divisione del valore assoluto.
    Cioè i=(i+1)%N con N=4 al primo giro i= 2, al secondo dovrebbe essere i=(2+1)%4 --> che valore ritorna?
    cont++ serve perchè essendo un pezzo o meglio una funzione del gioco la parte del gioco effettivo non è ancora stata fatta, ora ho sistemato la parte che indica quale giocatore deve iniziare il turno.
    Ora che il codice funziona vorrei esportarlo in una funzione in modo che quando chiamata restituisca il valore del giocatore che deve giocare. Ho pensato ad una cosa del genere:
    ma secondo me non e corretta o meglio non vorrei che quando la chiamo si impalli nel ciclo.
    Dovrebbe essere svincolata dalle istruzioni del turno che ancora devo scrivere.


    #include <iostream>
    #include <cstdlib>
    #include <string>
    using namespace std;






    //string chi_deve_giocare(int iniziale, int dim_vet, string vet[]) {
    // int i;
    // for (i = iniziale;; i = (i + 1) % dim_vet) {
    // cout << "tocca a: " << vet[i] << endl;
    // }
    // return vet[i];
    //}
    //




    void stampa_stringa_vincitore(string stringa_da_stampare) {


    cout << "ha vinto: " << stringa_da_stampare << endl;
    }


    int main() {


    string giocatori[4] = { "luca", "max", "tommy", "alle" };


    bool victory = false; // condizone di uscita dal gioco se diventa true
    int i, cont = 0, dim = 4;
    int iniziale = 2, vincitore;


    while (!victory) { // ciclo nel quale si svilupperà il gioco






    for (i = iniziale;; i = (i + 1) % dim) {
    cout << "tocca a: " << giocatori[i] << endl;
    // {-------ISTRUZIONI DEL TURNO
    cont++;
    if (cont == 10) { // COTNTROLLO SULLA CONDIZIONE DI VITTORIA
    string vincente;
    victory = true;
    vincente = giocatori[i];
    stampa_stringa_vincitore(vincente);
    break;


    }
    // }-----FINE TURNO, TOCCA AL SUCCESSIVO
    }
    }


    }

  4. #4
    A%B ritorna il resto della divisione intera di A per B
    quindi (2+1)%4 fa 3
    Nel ciclo per forza si impalla, non essendoci una condizione di uscita; non ha neanche molto senso un ciclo in quella funzione poichè messa così non ha modo di sapere a che turno si è. Dovresti passare come parametro quantomeno la i del ciclo nel main e fare nella funzione una semplice stampa dal vettore.
    A quel punto devi scegliere se fare il modulo nella funzione, lasciando il contatore libero di avanzare, oppure direttamente nel ciclo.
    Anche il while esterno così non ha molto senso, siccome quando vai a controllare la condizione conosci già il risultato.

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2017
    Messaggi
    14
    Quote Originariamente inviata da scimmiaparlante Visualizza il messaggio
    A%B ritorna il resto della divisione intera di A per B
    quindi (2+1)%4 fa 3
    Nel ciclo per forza si impalla, non essendoci una condizione di uscita; non ha neanche molto senso un ciclo in quella funzione poichè messa così non ha modo di sapere a che turno si è. Dovresti passare come parametro quantomeno la i del ciclo nel main e fare nella funzione una semplice stampa dal vettore.
    A quel punto devi scegliere se fare il modulo nella funzione, lasciando il contatore libero di avanzare, oppure direttamente nel ciclo.
    Anche il while esterno così non ha molto senso, siccome quando vai a controllare la condizione conosci già il risultato.

    grazie mille.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.