Ciao a tutti!! scrivo qua per non aprire un'altro topic visto che anch'io devo fare sto maledetto SUDOKU per l'università. Al momento il mio programma è ancora incompleto e ho finito da poco la funzione adibita ai controlli, sulla riga, sulla colonna e nei quadrati latini... I numeri da inserire nella tabella per il momento lo faccio tramte input, ma appena cerco di inserirne uno, a qualunque indirizzo della tabella decida di metterlo, mi viene fuori un "range error" e il programma termina prematuramente.
PS: utilizzo una classe table fornita dal professore basata sui vector... se volete la posto per darci un'occhiata...
HEADER FILE con la classe sudoku:
#include "tab.h"
#include "std_lib_facilities.h"
enum Error {OK, FAIL, RIGA, COL, QUAD}; //codici di errore
class Sudoku{
table<int>gametable(3); //crea tabella nxn
public:
Sudoku();
Error game_start(int);
Error ctrl_game(int, int, int);
void filler();
void print_table();
~Sudoku();
};
File.cpp con le funzioni:
#include "sudoku.h"
#define Q1 sqrt(gametable.rows()) //
#define Q2 sqrt(gametable.rows())*2 //
#define Q3 sqrt(gametable.rows())*3 //Servono per delimitare i quadrati latini della tabella
#define Q4 sqrt(gametable.rows())*4 //
#define Q5 sqrt(gametable.rows())*5 //
Sudoku::Sudoku(){ table<int> gametable(3);}
Sudoku::~Sudoku(){gametable.resize(0,0);}
/**********************************FUNZIONI*********************************/
Error Sudoku::game_start(int dim){
int n;
switch(dim){
case '1': {n=9; gametable.resize(n,n);};
case '2': {n=16; gametable.resize(n,n);};
case '3': {n=25; gametable.resize(n,n);};
}
filler();
return OK;
}
/***************************************************************************/
void Sudoku::print_table(){
cout<<" 0 1 2 3 4 5 6 7 8\n";
for(int y=0; y<gametable.cols(); y++){
for(int x=0; x<gametable.rows(); x++){
cout<<"| "<<gametable.at(x,y)<<" |";
}
cout<<" "<<y<<endl;
}
return;
}
/***************************************************************************/
Error Sudoku:: ctrl_game(int a, int cx, int cy){
//controllo colonna
for (int y=0 ; y<gametable.cols(); y++){
if (y!=cy) if(gametable.at(cx,y)==a) return COL;
}
//controllo riga
for (int x=0; x<gametable.rows(); x++){
if (x!=cx) if(gametable.at(x,cy)) return RIGA;
}
//controlli quadrati latini...
if (cy>=0 && cy<Q1){
if (cx>=0 && cx<Q1){
for (int x=0; x<Q1; x++){
for (int y=0; y<Q1; y++){
if(x!=cx && y!=cy){ if(gametable.at(x,y)==a) return QUAD;}
}
}
}
else if (cx>=Q1 && cx<Q2){
for (int x=Q1; x<Q2; x++){
for (int y=0; y<Q1; y++){
if(x!=cx && y!=cy){ if(gametable.at(x,y)==a) return QUAD;}
}
}
}
else if (cx>=Q2 && cx<Q3){
for (int x=Q2; x<Q3; x++){
for (int y=0; y<Q1; y++){
if(x!=cx && y!=cy){ if(gametable.at(x,y)==a) return QUAD;}
}
}
}
if(gametable.rows()>9){
if (cx>=Q3 && cx<Q4){
for (int x=Q3; x<Q4; x++){
for (int y=0; y<Q1; y++){
if(x!=cx && y!=cy){ if(gametable.at(x,y)==a) return QUAD;}
}
}
}
}
if(gametable.rows()==25){
if (cx>=Q4 && cx<Q5){
for (int x=Q2; x<Q3; x++){
for (int y=0; y<Q1; y++){
if(x!=cx && y!=cy){ if(gametable.at(x,y)==a) return QUAD;}
}
}
}
}
}
else if (cy>=Q1 && cy<Q2){
if (cx>=0 && cx<Q1){
for (int x=0; x<Q1; x++){
for (int y=Q1; y<Q2; y++){
if(x!=cx && y!=cy){ if(gametable.at(x,y)==a) return QUAD;}
}
}
}
else if (cx>=Q1 && cx<Q2){
for (int x=Q1; x<Q2; x++){
for (int y=Q1; y<Q2; y++){
if(x!=cx && y!=cy){ if(gametable.at(x,y)==a) return QUAD;}
}
}
}
else if (cx>=Q2 && cx<Q3){
for (int x=Q2; x<Q3; x++){
for (int y=Q1; y<Q2; y++){
if(x!=cx && y!=cy){ if(gametable.at(x,y)==a) return QUAD;}
}
}
}
if(gametable.rows()>9){
if (cx>=Q3 && cx<Q4){
for (int x=Q3; x<Q4; x++){
for (int y=Q1; y<Q2; y++){
if(x!=cx && y!=cy){ if(gametable.at(x,y)==a) return QUAD;}
}
}
}
}
if(gametable.rows()==25){
if (cx>=Q4 && cx<Q5){
for (int x=Q4; x<Q5; x++){
for (int y=Q1; y<Q2; y++){
if(x!=cx && y!=cy){ if(gametable.at(x,y)==a) return QUAD;}
}
}
}
}
}
else if (cy>=Q2 && cy<Q3){
if (cx>=0 && cx<Q1){
for (int x=0; x<Q1; x++){
for (int y=Q2; y<Q3; y++){
if(x!=cx && y!=cy){ if(gametable.at(x,y)==a) return QUAD;}
}
}
}
else if (cx>=Q1 && cx<Q2){
for (int x=Q1; x<Q2; x++){
for (int y=Q2; y<Q3; y++){
if(x!=cx && y!=cy){ if(gametable.at(x,y)==a) return QUAD;}
}
}
}
else if (cx>=Q2 && cx<Q3){
for (int x=Q2; x<Q3; x++){
for (int y=Q2; y<Q3; y++){
if(x!=cx && y!=cy){ if(gametable.at(x,y)==a) return QUAD;}
}
}
}
if(gametable.rows()>9){
if (cx>=Q3 && cx<Q4){
for (int x=Q3; x<Q4; x++){
for (int y=Q2; y<Q3; y++){
if(x!=cx && y!=cy){ if(gametable.at(x,y)==a) return QUAD;}
}
}
}
}
if(gametable.rows()==25){
if (cx>=Q4 && cx<Q5){
for (int x=Q4; x<Q5; x++){
for (int y=Q2; y<Q3; y++){
if(x!=cx && y!=cy){ if(gametable.at(x,y)==a) return QUAD;}
}
}
}
}
}
if(gametable.rows()>9){
if (cy>=Q3 && cy<Q4){
if (cx>=0 && cx<Q1){
for (int x=0; x<Q1; x++){
for (int y=Q3; y<Q4; y++){
if(x!=cx && y!=cy){ if(gametable.at(x,y)==a) return QUAD;}
}
}
}
else if (cx>=Q1 && cx<Q2){
for (int x=Q1; x<Q2; x++){
for (int y=Q3; y<Q4; y++){
if(x!=cx && y!=cy){ if(gametable.at(x,y)==a) return QUAD;}
}
}
}
else if (cx>=Q2 && cx<Q3){
for (int x=Q2; x<Q3; x++){
for (int y=Q3; y<Q4; y++){
if(x!=cx && y!=cy){ if(gametable.at(x,y)==a) return QUAD;}
}
}
}
if(gametable.rows()>9){
if (cx>=Q3 && cx<Q4){
for (int x=Q3; x<Q4; x++){
for (int y=Q3; y<Q4; y++){
if(x!=cx && y!=cy){ if(gametable.at(x,y)==a) return QUAD;}
}
}
}
}
if(gametable.rows()==25){
if (cx>=Q4 && cx<Q5){
for (int x=Q4; x<Q5; x++){
for (int y=Q3; y<Q4; y++){
if(x!=cx && y!=cy){ if(gametable.at(x,y)==a) return QUAD;}
}
}
}
}
}
}
if(gametable.rows()==25){
if (cy>=Q4 && cy<Q5){
if (cx>=0 && cx<Q1){
for (int x=0; x<Q1; x++){
for (int y=Q3; y<Q4; y++){
if(x!=cx && y!=cy){ if(gametable.at(x,y)==a) return QUAD;}
}
}
}
else if (cx>=Q1 && cx<Q2){
for (int x=Q1; x<Q2; x++){
for (int y=Q3; y<Q4; y++){
if(x!=cx && y!=cy){ if(gametable.at(x,y)==a) return QUAD;}
}
}
}
else if (cx>=Q2 && cx<Q3){
for (int x=Q2; x<Q3; x++){
for (int y=Q3; y<Q4; y++){
if(x!=cx && y!=cy){ if(gametable.at(x,y)==a) return QUAD;}
}
}
}
else if (cx>=Q3 && cx<Q4){
for (int x=Q3; x<Q4; x++){
for (int y=Q3; y<Q4; y++){
if(x!=cx && y!=cy){ if(gametable.at(x,y)==a) return QUAD;}
}
}
}
}
else if (cx>=Q4 && cx<Q5){
for (int x=Q4; x<Q5; x++){
for (int y=Q3; y<Q4; y++){
if(x!=cx && y!=cy){ if(gametable.at(x,y)==a) return QUAD;}
}
}
}
}
return OK;
}
/***************************************************************************/
void Sudoku:: filler(){
Error err;
int a;
int x; int y;
while (true){
cout<<"Inserire valore ";
cin>>a;
cout<<" alle coordinate ";
cin>>x; cin>>y;
cout<<endl;
err= ctrl_game(a,x,y);
if (err==RIGA) cout<<" Inserito numero non valido nella riga\n";
else if(err==COL) cout<<" Inserito numero non valido nella colonna\n";
else if(err==QUAD) cout<<" Inserito numero non valido nel quadrato latino\n";
else if(err==OK) {cout<<"Valore inserito correttamente"; gametable.at(x,y)=a;}
print_table();
//devo ancora decidere come e quando porre fine a questo ciclo.
}
}
Spero non vi venga la nausea guardando la funzione dei controlli...