• Regolamento Macrocategoria DEV
    Prima di aprire un topic nella Macrocategoria DEV, è bene leggerne il suo regolamento. Sei un'azienda o un hosting/provider? Qui sono anche contenute informazioni per collaborare con Sciax2 ed ottenere l'accredito nella nostra community!

Problema risolto Morra cinese (C++)

Samuelubellill

Utente Senior
Autore del topic
31 Maggio 2007
1.871
60
Miglior risposta
0
Allora, come da titolo, vorrei appunto "creare" una facile morra cinese. Ho già cominciato a fare qualcosa, ma le mie conoscenze, al momento, non mi fanno andare oltre.

Quello che chiedo è come salvare i risultati. So che potrebbe essere una cosa banale ma, ripeto, mi sto appena inoltrando in C++.

Molti di voi mi diranno di utilizzare uno switch case, ma vorrei provarlo prima con if, anche se son tante righe di codice.

[CPPS]#include <iostream>
#include <stdlib.h>
#include <windows.h>
using namespace std;
int main() {
SetConsoleTitle("Morra cinese");
int user, computer;
char tasto;
computer = rand()%2;
cout <<"Sasso = 0\tCarta = 1\t Forbici = 2\n";
cin >> user;
{ if (computer==user) {
cout <<"PARI!\n\n";
return main (); }
else if (computer==0&&user==2 || computer==1&&user==0 || computer==2&&user==1) {
cout <<"Il computer ha scelto " <<computer;
cout <<"\nIl computer vince! Per continuare, premere 'r', altrimenti premi 'q': ";
cin >> tasto;
if (tasto=='r' || tasto=='R') {
return main (); }
else {
if (tasto=='q' || tasto=='Q') {
return 0; }
else {
system ("cls");
cout <<"ERRORE! Programma riavviato!\n\n";
return main (); }
}
}
else if (user==0&&computer==2 || user==1&&computer==0 || user==2&&computer==1) {
cout <<"Il computer ha scelto " <<computer;
cout <<"\nVince l'utente! Per continuare, premere 'r', altrimenti premi 'q': ";
cin >> tasto;
if (tasto=='r' || tasto=='R') {
return main (); }
else {
if (tasto=='q' || tasto=='Q') {
return 0; }
else {
system ("cls");
cout <<"ERRORE! Programma riavviato!\n\n";
return main (); }
}
}
else {
cout <<"Il computer vince!";
cout <<"\nInserisci un numero valido!\n\n";
return main (); }
}
system ("pause");
}[/CPPS]
 
Ultima modifica:
Una prima cosa, profondamente sbagliata, è quel

return main();

Non si fa ripartire così il programma (probabilmente non sai quanti problemi crei nello stack), semmai usa un ciclo opportunamente implementato.

Per il problema del tuo post invece, quali risultati vuoi salvare e in quale parte di programma?
 
Vorrei tenere un semplice counter dei risultati.

E ora sarei curioso di sapere la scrittura corretta del codice di quel return main.
 
Allora, come da titolo, vorrei appunto "creare" una facile morra cinese. Ho già cominciato a fare qualcosa, ma le mie conoscenze, al momento, non mi fanno andare oltre.

Quello che chiedo è come salvare i risultati. So che potrebbe essere una cosa banale ma, ripeto, mi sto appena inoltrando in C++.

Molti di voi mi diranno di utilizzare uno switch case, ma vorrei provarlo prima con if, anche se son tante righe di codice.

[CPPS]#include <iostream>
#include <stdlib.h>
#include <windows.h>
using namespace std;
int main() {
SetConsoleTitle("Morra cinese");
int user, computer;
char tasto;
computer = rand()%2;
cout <<"Sasso = 0\tCarta = 1\t Forbici = 2\n";
cin >> user;
{ if (computer==user) {
cout <<"PARI!\n\n";
return main (); }
else if (computer==0&&user==2 || computer==1&&user==0 || computer==2&&user==1) {
cout <<"Il computer ha scelto " <<computer;
cout <<"\nIl computer vince! Per continuare, premere 'r', altrimenti premi 'q': ";
cin >> tasto;
if (tasto=='r' || tasto=='R') {
return main (); }
else {
if (tasto=='q' || tasto=='Q') {
return 0; }
else {
system ("cls");
cout <<"ERRORE! Programma riavviato!\n\n";
return main (); }
}
}
else if (user==0&&computer==2 || user==1&&computer==0 || user==2&&computer==1) {
cout <<"Il computer ha scelto " <<computer;
cout <<"\nVince l'utente! Per continuare, premere 'r', altrimenti premi 'q': ";
cin >> tasto;
if (tasto=='r' || tasto=='R') {
return main (); }
else {
if (tasto=='q' || tasto=='Q') {
return 0; }
else {
system ("cls");
cout <<"ERRORE! Programma riavviato!\n\n";
return main (); }
}
}
else {
cout <<"Il computer vince!";
cout <<"\nInserisci un numero valido!\n\n";
return main (); }
}
system ("pause");
}[/CPPS]

oltre quello che ha già detto nothing , migliorerei anche la struttura del codice dividendolo in funzioni , tra l'altro quando chiedi di riprovare semplifica tutto con un ciclo ... per avere un contatore del punteggio crea due variabili che incrementi 1 quando vinci tu e quando vince il computer incrementi di uno la seconda variabile. Ogni fine match ,poi visualizzi il punteggio.


Sposto in assistenza Tecnica :soso:
 
Per le mie conoscenze al momento, non riesco ad andare oltre l'if else in c++

Per quanto le variabili che incremento, l'ho implementato e ho compreso il funzionamento.

Che ciclo mi dite che sia migliore usare?
 
@Samuelubellill

tra l'altro il rand è sbagliato in primis perché "dovrebbe" genera numeri da 0 a 1 e a te serve da 0 a 2 inoltre in quel modo non generi nessun numero casuale il risultato sarà sempre lo stesso dato che non inizializzi il seme . Per farlo devi fare così :

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

l'istruzione
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Che ciclo mi dite che sia migliore usare?

dipende da come modificherai il codice :soso:
 
Allora direi che è meglio andare avanti con lo studio teorico prima di scrivere programmi che necessitino di cicli ...

If-Else non è un ciclo, infatti. Se non sei qui per dare assistenza, ma soltanto per spam, puoi anche andartene dal thread.

@Samuelubellill

tra l'altro il rand è sbagliato in primis perché "dovrebbe" genera numeri da 0 a 1 e a te serve da 0 a 2 inoltre in quel modo non generi nessun numero casuale il risultato sarà sempre lo stesso dato che non inizializzi il seme . Per farlo devi fare così :

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

l'istruzione
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

dipende da come modificherai il codice :soso:

Grazie per i consigli.

Ho provato a farlo con un ciclo do-while, come mi ha consigliato System32, però ho un problema di loop e sto cercando di risolvere.
 
If-Else non è un ciclo, infatti. Se non sei qui per dare assistenza, ma soltanto per spam, puoi anche andartene dal thread.

Intendeva dire che il programma che vuoi scrivere necessita della conoscenza dei cicli e non solo delle istruzioni if-else, inoltre cosa c'entra lo spam ?

Ho provato a farlo con un ciclo do-while, come mi ha consigliato System32, però ho un problema di loop e sto cercando di risolvere.

In caso posta come hai strutturato il ciclo, potrebbe esserci un errore logico.
 
Intendeva dire che il programma che vuoi scrivere necessita della conoscenza dei cicli e non solo delle istruzioni if-else, inoltre cosa c'entra lo spam ?
Io per spam intendo una risposta non utile ai fini del thread, ma lasciando perdere...

In caso posta come hai strutturato il ciclo, potrebbe esserci un errore logico.

[CPPS]#include <iostream>
#include <stdlib.h>
#include <windows.h>
using namespace std;
int main() {
SetConsoleTitle("Morra cinese");
int user, computer, x, y;
x = 0;
y = 0;
cout <<"Sasso = 0\tCarta = 1\t Forbici = 2\n";
do {
computer = rand()%3;
cin >> user;
if (computer==user) {
cout <<"PARI!\n\n";
x++;
y++; }
if (computer==0&&user==2 || computer==1&&user==0 || computer==2&&user==1) {
cout <<"Il computer ha scelto " <<computer;
cout <<"\nIl computer vince!\n";
x++; }
if (user==0&&computer==2 || user==1&&computer==0 || user==2&&computer==1) {
cout <<"Il computer ha scelto " <<computer;
cout <<"\nVince l'utente!\n";
y++; }
} while (x<3||y<3);
cout <<"\n" <<x <<"\t" <<y <<"\n";
}[/CPPS]

Ho un errore di risultati
 
Ultima modifica:
Spiegami il ragionamento che deve seguire il programma perché apparentemente sembra corretta la stesura del codice, dipende cosa deve accadere.

PS1: perché il do-while viene eseguito finché x è minore di 3 oppure y è minore di 3 ?
PS2: si è parlato di utilizzo del do-while perchè il tuo codice implementa un'istruzione che causa problemi di memoria al programma, ovvero return main(). E' lì che va implementato il do-while perché le istruzioni che devono essere eseguite verranno eseguite finché accade la condizione all'interno del while.
 
Spiegami il ragionamento che deve seguire il programma perché apparentemente sembra corretta la stesura del codice, dipende cosa deve accadere.

PS1: perché il do-while viene eseguito finché x è minore di 3 oppure y è minore di 3 ?
PS2: si è parlato di utilizzo del do-while perchè il tuo codice implementa un'istruzione che causa problemi di memoria al programma, ovvero return main(). E' lì che va implementato il do-while perché le istruzioni che devono essere eseguite verranno eseguite finché accade la condizione all'interno del while.

Perché vorrei che una volta giunto a tre si concluda il il ciclo. Però ho un errore di risultato che mi porta ad andare oltre il 3
 
Perché vorrei che una volta giunto a tre si concluda il il ciclo.

Sì ma perché il ciclo deve essere ripetuto 3 volte ? Quelle istruzioni dentro il do-while devono essere ripetute finché è soddisfatta la condizione del while altrimenti verranno eseguite una volta sola perché si uscirà dal ciclo. Che bisogno hai di ripetere il ciclo 3 volte ? Non capisco l'utilità delle variabili x e y.

NB: se vuoi eseguire un'istruzione TOT volte non si usa il do-while ma il for.

Però ho un errore di risultato che mi porta ad andare oltre il 3

Certo, questo perché incrementi la x e la y sia quando il risultato è pari che quanto il computer vince.

PS: quando generi casualmente la scelta del computer rand non hai letto quello che ti ha scritto @TBH a proposito, devi utilizzare srand(time(NULL));
 
Ultima modifica:
Le variabili mi servono per stabilire un vincitore.

Deve essere ripetuta tre volte perché sto supponendo che si vinca una volta raggiunto il numero 3, un po' come una sfida tra "amici".
 
Le variabili mi servono per stabilire un vincitore.

Deve essere ripetuta tre volte perché sto supponendo che si vinca una volta raggiunto il numero 3, un po' come una sfida tra "amici".

Ah ok. Comunque non ti serve aggiungere questa condizione nel do-while. Ho scritto il programma ma non ti incollo il codice perché devi essere tu a scriverlo, sappi che, a livello logico, il do-while che ho scritto io è strutturato così :

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Il codice deve essere eseguito finché si ha un pareggio, se l'utente scegliere di continuare e se la scelta dell'utente è maggiore di 2, ovvero nel caso in cui l'utente sceglie ad esempio 4 e non 0, 1 o 2.
 
Ho provato a ragionarci su, ma io vorrei che il tutto sia eseguito fino a quando uno dei due parametri raggiunga 3, valore massimo delle variabili.

Infatti, ho provato a cambiare, ma comunque non si stoppa a 3, bensì continua.

[CPPS]#include <iostream>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
using namespace std;
int main() {
SetConsoleTitle("Morra cinese");
int user, computer, x=0, y=0;
do {
cout <<"\nSasso = 0\tCarta = 1\t Forbici = 2\n";
cout <<"Attualmente il risultato e': User " <<x <<" - " <<y <<" Computer";
cout <<"\nFai la tua mossa: ";
srand(time(NULL));
computer = rand()%3;
cin >> user;
if (computer==0&&user==2 || computer==1&&user==0 || computer==2&&user==1) {
system ("cls");
cout <<"Il computer ha scelto: " <<computer <<". Vince il computer!\n\n";
y++; }
if (user==0&&computer==2 || user==1&&computer==0 || user==2&&computer==1) {
system ("cls");
cout <<"Il computer ha scelto: " <<computer <<". Vince l'utente!\n\n";
x++; }
} while ((computer==user) || (x<3 or y<3)) ;
}[/CPPS]
 
Ultima modifica:
Capisco. Io invece chiedo all'utente se vuole continuare a giocare. Comunque il problema del tuo codice sta nel fatto che quando si ha un pareggio vengono incrementate entrambe le variabili e questo non ha senso perché se le incrementi in caso di pareggio e dopo il computer vince allora la x, per esempio, varrà 2 e non 1. Capisci ? Altra cosa : se vuoi che venga eseguito 3 volte perché nel while hai scritto < 3 ? Dovresti scrivere while( (x==3) || (y==3) ).
 
Perché sai meglio di me che se metto (x==3 or y==3) il ciclo non si ripete, ma si ripeterebbe solo se le due variabili valessero 3.

Infatti la parte del pareggio l'ho inserita come condizione nel while, perché prima non avevo capito che potevo inserirla come condizione.
 
Perché sai meglio di me che se metto (x==3 or y==3) il ciclo non si ripete, ma si ripeterebbe solo se le due variabili valessero 3.

Ti stai confondendo con l'AND logico, in quel caso il ciclo si ripeterebbe solo se entrambe le variabili valgono 3. Con l'OR logico invece basta che una delle due variabili valga 3.