Salve a tutti, sono nuovo su questo forum. Mi sono iscritto perchè mi capita spesso di rimanere bloccato con alcuni programmi in c++. Ve ne pongo ora uno, si tratta del gioco mastermind. Mastermind è un gioco da tavolo astratto di crittoanalisi per due giocatori, in cui un giocatore, il "decodificatore", deve indovinare il codice segreto composto dal suo avversario, detto "codificatore". Nella versione originale di Mastermind, il codice segreto è di quattro cifre e il codificatore ha a disposizione, per comporlo, le dieci cifre del sistema decimale standard (0,1,2,3,4,5,6,7,8,9). Dopo che il codificatore ha composto il codice, il decodificatore fa il suo primo tentativo, cercando di indovinare il codice. Il codificatore, appena il suo avversario ha completato il tentativo, fornisce degli aiuti comunicando:
- Il numero di cifre giuste al posto giusto, cioè le cifre del tentativo che sono effettivamente presenti nel codice al posto tentato, con pioli neri.
- Il numero di cifre giuste al posto sbagliato, cioè le cifre del tentativo che sono effettivamente presenti nel codice, ma non al posto tentato, con pioli bianchi.
Di seguito metto il codice del programma. Come logica mi sembra giusta, ma non riesco a capire perchè non mi da i giusti risultati... Non sembra ci sia una logica in quello che stampa il compilatore. Grazie a tutti
#include <iostream> //standard
#include <string> //standard
#include <math.h> //serve per potenza
#include <windows.h> //serve per gotoxy
#include <conio.h> //serve per gotoxy
#include <process.h> //serve per gotoxy
#include <time.h> //serve per rand()
void gotoxy(short x, short y) {
COORD pos = {x, y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
using namespace std;
int main()
{
int random;
int vector_lenght; //stabilisce la lunghezza della stinga di numeri da indovinare
int right_place=0; //per sapere se oltre ad essere giusta la cifra, è anche al posto giusto
int right_number=0;
int done=0;
int l=0;
int num=0;
double numbers;
double transp;
int tries; //numero tentativi (scelta dal menù)
//Dichiarazione variabili per movimento
int muovi;
int coordX, coordY;
//SCELTA CON QUANTE CIFRE GIOCARE
cout << "Select the number of figures you want to play with: " << endl;
cout << " > ONE (simplier)" << endl;
cout << " Two" << endl;
cout << " Three" << endl;
cout << " Four (suggested)" << endl;
cout << " Five" << endl;
cout << " Six" << endl;
cout << " Seven" << endl;
cout << " Eight" << endl;
cout << " Nine" << endl;
cout << " TEN (harder)" << endl;
muovi=0;
coordX=2; coordY=1;
do
{
muovi=_getch();
if((int)muovi==80 && coordY<10)
{
gotoxy(coordX,coordY);
cout << " ";
coordY++;
gotoxy(coordX,coordY);
cout << ">";
}
if ((int)muovi==72 && coordY>1)
{
gotoxy(coordX,coordY);
cout << " ";
coordY--;
gotoxy(coordX,coordY);
cout << ">";
}
}
while (muovi!=13);
//FINE MENù di SCELTA
for (int i=1; i<=coordY; i++)
{
if (muovi==13 && coordY==i)
{
vector_lenght=i;
tries=(vector_lenght*10)/2;
}
}
int mastermind[vector_lenght]; //dichiara il vettore mastermind con lunghezza vector_lenght, questo conterrà i numeri da indovinare
int control[vector_lenght]; //dichiare vettore che servirà per controllare se il numero inserito è giusto.
//INIZIO PROGRAMMA
system("cls");
srand(time(NULL));
for (int i=0; i<vector_lenght; i++)
{
random=(rand()%9)+1; //sceglie (vector_lenght) numeri random e li inserisce nel vettore mastermind
while (random==mastermind[i]) //per non avere cifre uguali
{
random=(rand()%9)+1;
}
mastermind[i]=random;
cout << mastermind[i]; //togliere le barrette per verificare casualità dei numeri
}
cout << endl;
control[0]=0;
for (int i=tries; i>=0; i--)
{
right_place=0;
right_number=0;
for (int m=0; m<vector_lenght; m++)
{
control[m]=0;
cout << mastermind[m];
}
cout << "Insert " << vector_lenght << " numbers (not zero): ";
cin >> numbers; //Inserisci il numero tramite normale input, così facendo, li ho sulla stessa riga senza cliccare invio
cout << "You still have " << i << " tries." << endl;
for (double x=vector_lenght-1; x>=0; x--)
{
transp=numbers/(pow(10.0, x)); //dato num 568 metto in control[l] soltanto 5 (che è il risultato di 568/10^x e siccome x è uguale alla lunghezza del vettore -1, sarà 568/10^2 e quindi 5
control[l]=(int)transp; //metto soltanto la parte intera di transp (tolgo la virgola)
control[l]=control[l]-(num*10); //Se continuassi così, control conterebbe questi valori: 5-56-568 ma io voglio che conti 5-6-8 allora metto la variabile num che è uguale a il valore di transp. Ossia, num sarebbe 56, control sarebbe 568 ma voglio metterci 8 così divido per num moltiplicato per 10
num=int(transp);
l++;
}
int x=0;
for (x=0; x<vector_lenght; x++)
{
for (int j=0; j<vector_lenght; j++)
{
if (control[j]==mastermind[x]) //Inizialmente verifica se c'è un numero uguale in qualsiasi posizione
{
cout << "CONTROL[j] " <<control[j] << endl;
cout << "mastermind[x] " <<mastermind[x] << endl;
cout << "j " << j << endl;
cout << "x " << x << endl;
if (j==x) right_place++; // se gli indici dei numeri uguali trovati corrispondono, significa che sono nella stessa posizione, aumento variabile posizione giusta
else right_number++; //altrimenti aumento variabile posizione sbagliata
}
}
}
for (int i=0; i<right_number; i++)
{
cout << "X"; //Stampa una X se il numero è giusto ma nel posto sbagliato
}
for (int i=0; i<right_place; i++)
{
cout << "O"; //stampa una O se il numero è giusto e nel posto giusto
}
cout << endl;
if (right_place==vector_lenght)
{
cout << "WIN"; //se il numero di O (numeri giusti al posto giusto) è uguale al numero di cifre, significa che sono state indovinate tutte le cifre
return 0;
}
}
}