Visualizzazione dei risultati da 1 a 10 su 10

Visualizzazione discussione

  1. #1

    [C++] Controllo vincoli gioco non funzionante

    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; };
    };
    Ultima modifica di lello82nap; 13-12-2013 a 21:14

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.