PDA

Visualizza la versione completa : [C++] Ciclo ripetuto


Luke96
27-05-2017, 15:02
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.

scimmiaparlante
27-05-2017, 17:53
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


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?

Luke96
27-05-2017, 19:14
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


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
}
}


}

scimmiaparlante
27-05-2017, 19:38
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.

Luke96
27-05-2017, 19:50
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.:love::love::love:

Loading