Mastermind! Sono bloccato

di il
1 risposte

Mastermind! Sono bloccato

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

1 Risposte

  • Re: Mastermind! Sono bloccato

    Non lasciare il compito agli utenti del forum perché difficilmente ti risponderò qualcuno.

    Dai maggiori informazioni, un esempio di svolgimento del gioco, risultati attesi e risultati (sbagliati) ottenuti.
    Indica quali sono le parti del codice e le funzioni che svolgono il compito di "scelta" della risposta ...

    Spiega meglio il codice insomma ...
Devi accedere o registrarti per scrivere nel forum
1 risposte