buonasera,
ho un problema con un programma che non restituisce un output corretto, anche se gira.
in pratica devo realizzare un "s u d o k u" particolare, nel senso che puo avere anche una matrice 2x2 3x3 ed anche piu' grande della classica 9x9.
Io sono riuscito a creare la matrice generica con una classe Tabella, che contiene un vector di vector-puntatori di oggetti puntatori "Casella", che rappresentano le caselle del gioco con i seguenti attributi.
-numero (valore che si puo dare alla casella)
-indice di riga
-indice di colonna
-fisso (booleano, true se è un numero fisso cioè una delle caselle iniziali del gioco, false se è vuoto)
in questo modo riesco a generare una matrice di numeri 0 se la casella e vuota, o con un numero random da 1 fino ad arrivare alla grandezza del size. poi visualizzo la matrice vector di vector.
IL PROBLEMA E' QUESTO: Nel mio gioco un numero non si puo ripetere sulla stessa riga, nè sulla stessa colonna. MA A ME COMPAIONO ANCORA VALORI RIPETUTI!!!!
Non so da che dipende, nel costruttore di Tabella cerco di dare dei valori random per generare gli indici e il valore delle Caselle Fisse (Quelle iniziali presenti nel gioco come aiuto), poi applico un metodo booleano
controllaVincoli(Casella * casellaDaControllare), che fino ad ora dovrebbe controllare solo i vincoli per i quali i numeri su stessa riga e colonna non si possono ripete. Il metodo dovrebbe restituire true se fra la casella generata e quella, ma non funziona bene, è come se non riconoscesse tutti i numeri ripetuti generati.
Posto solo parte del codice, quella che non funziona.
STO IMPAZZENDO su questa imperfezione, VI PREGO AIUTATEMI, GRAZIE!!!!
codice:
class Tabella
{
private:
int sizeTabella;
int sizeRegione;
int livelloDifficolta;
std::vector<std::vector<Casella*>*> *tabella = new std::vector<std::vector<Casella*>*>();
public:
Tabella(int sizeRegione, int livello); /*Crea Tabella di Default a 0*/
~Tabella();
bool controllaVincoli(Casella* casellaDaControllare);
....
....
....
};
....
....
....
....
....
....
/*Crea Tabella di Inizio */
Tabella::Tabella(int sizeRegione, int livelloDifficolta)
{
this->livelloDifficolta = livelloDifficolta;
this->sizeRegione = sizeRegione;
this->sizeTabella = sizeRegione*sizeRegione;
int quantitaNumeriFissi = this->sizeTabella*this->sizeTabella; //inizializiamo la quantità di fissi alla quantità di numeri in totale in tabella
//per calcolare su di essa in seguito la percentuale di numeri fissi tramite lo
//costrutto Switch - Case
switch (this->livelloDifficolta)
{
case 3:
quantitaNumeriFissi = (int)floor((quantitaNumeriFissi * 5) / 100);
break;
case 2:
quantitaNumeriFissi = (int)floor((quantitaNumeriFissi * 25) / 100);
break;
case 1:
quantitaNumeriFissi = (int)floor((quantitaNumeriFissi * 50) / 100);
break;
}
/**** INIZIO CREAZIONE STRUTTURA MATRICIALE ****/
//Creo un vector di puntatori vector di puntatori Caselle di Default (valore=0).
//Simulo così una matrice di 0
for (int i = 0; i < this->sizeTabella; i++)
{
std::vector<Casella*> *vec = new std::vector<Casella*>;
this->tabella->push_back(vec);
for (int j = 0; j < this->sizeTabella; j++)
{
Casella *casella = new Casella(i,j); //Il Costruttore di Default di Casella, genera numero=0 e fisso=false
tabella->at(i)->push_back(casella); //sull'i-esimo vettore di vettore inseriamo in coda una Casella di valore 0
//std::cout << "inserita casella " << casella->getRiga() <<" "<<casella->getColonna()<< std::endl;
}
}
/**** INIZIO INSERIMENTO NUMERI FISSI IN TABELLA ****/
int riga = 0; int colonna = 0; int valore = 0;
srand((unsigned)time(NULL));
for (int i = 0; i < quantitaNumeriFissi; i++)
{
riga = (rand() % (this->sizeTabella));
colonna = (rand() % (this->sizeTabella));
valore = (rand() % (this->sizeTabella)) + 1;
std::cout << "rand 1 =" << valore << std::endl;
Casella *casella = new Casella(valore,riga, colonna);
if (this->tabella->at(riga)->at(colonna)->getNumero() == 0 && this->controllaVincoli(casella) == true) //se quel valore è gia presente in riga, colonna o regione
{
valore = (rand() % (this->sizeTabella)) + 1; //calcola un valore diverso
std::cout << "rand 2 =" << valore<<std::endl;
}
this->tabella->at(riga)->at(colonna)->setNumero(valore);
this->tabella->at(riga)->at(colonna)->setFisso(true);
}
/************FINE INSERIMENTO NUMERI FISSI ******************/
};
.
.
.
.
.
bool Tabella::controllaVincoli(Casella* casellaDaControllare)
{
bool esistenza=false;
//CONTROLLO PRIMO VINCOLO - ESISTENZA SU STESSA RIGA
int ii = casellaDaControllare->getRiga();
int jj = 0;
while (jj <this->sizeTabella && this->tabella->at(ii)->at(jj)->getNumero()!=casellaDaControllare->getNumero())
jj++;
if (jj == this->sizeTabella)
esistenza = false;
else
esistenza = true;
//CONTROLLO SECONDO VINCOLO - ESISTENZA SU STESSA COLONNA
ii = 0;
jj = casellaDaControllare->getColonna();
while (ii <this->sizeTabella && this->tabella->at(ii)->at(jj)->getNumero() != casellaDaControllare->getNumero())
ii++;
if (ii == this->sizeTabella)
esistenza = esistenza && false;
else
esistenza = esistenza && true;
std::cout << "esistenza = " << esistenza << std::endl;
return esistenza;
};
/*** FINE CONTROLLO VINCOLI ***/
codice:
class Casella {
private:
int numero;
int riga;
int colonna;
bool fisso; //Se è Numero Fisso = TRUE, se Numero Non Fisso = FALSE
public:
Casella(int riga, int colonna);
Casella(int numero, int riga, int colonna);
Casella(int numero, int riga, int colonna, bool fisso);
~Casella();
void setNumero(int numero){ this->numero = numero; };
void setRiga(bool fisso){ this->fisso = fisso; };
void setColonna(int colonna){ this->colonna = colonna; };
void setFisso(bool fisso){ this->fisso = fisso; };
int getNumero(){ return this->numero; };
int getRiga(){ return this->riga; };
int getColonna(){ return this->colonna; };
bool getFisso(){ return this->fisso; };
};