//devuelve grilla resuelta public GrillaSudoku InicializarGrilla() { //rellena aleatoreamente primera fila y columna GrillaSudoku tempGrilla = new GrillaSudoku { }; //grilla temporaria int fila = 0; int col = 0; int nuevoVal; //valor para poner dentro de grilla List <int> setValor = new List <int>(Enumerable.Range(-9, 9)); //rango de numeros List <int> setValor2 = new List <int>(); Random rnd = new Random(); //numero random int numRandom = 0; numRandom = rnd.Next(0, 8); nuevoVal = setValor[numRandom]; tempGrilla.inicializarCeldas(fila, col, nuevoVal); setValor.Remove(nuevoVal); for (fila = 1; fila < 9; fila++) { numRandom = rnd.Next(0, setValor.Count); nuevoVal = setValor[numRandom]; setValor2.Add(nuevoVal); setValor.Remove(nuevoVal); tempGrilla.inicializarCeldas(fila, col, nuevoVal); } fila = 0; for (col = 1; col < 3; col++) { numRandom = rnd.Next(0, setValor2.Count); nuevoVal = setValor2[numRandom]; while ((nuevoVal == tempGrilla.grilla[1, 0] || (nuevoVal == tempGrilla.grilla[2, 0]))) { numRandom = rnd.Next(0, setValor2.Count); nuevoVal = setValor2[numRandom]; } setValor2.Remove(nuevoVal); tempGrilla.inicializarCeldas(fila, col, nuevoVal); } for (col = 3; col < 9; col++) { numRandom = rnd.Next(0, setValor2.Count); nuevoVal = setValor2[numRandom]; setValor2.Remove(nuevoVal); tempGrilla.inicializarCeldas(fila, col, nuevoVal); } do { solucionadorSudoku = new SolucionadorSudoku(); solucionadorSudoku.resolverGrilla((GrillaSudoku)tempGrilla.Clone(), false); GrillaSolucion = solucionadorSudoku.solucion; } while (GrillaSolucion == null || GrillaSolucion.estaEnBlanco()); PermaGrilla = borrarCuadros(GrillaSolucion); return(PermaGrilla); }
/// borra cuadros al azar public GrillaSudoku borrarAzar(GrillaSudoku grillaTemporal, int simetria, ref int cantidadDeBorrados) { Random rnd = new Random(); //genero num random int fila = rnd.Next(0, 8); //selecciono fila random int column = rnd.Next(0, 8); //y columna while (grillaTemporal.grilla[fila, column] == 0) // no borro lo que ya este borrado { fila = rnd.Next(0, 8); column = rnd.Next(0, 8); } grillaTemporal.inicializarCeldas(fila, column, 0); cantidadDeBorrados++; //incremento la contador switch (simetria) { case 0: //vertical if (grillaTemporal.grilla[fila, 8 - column] != 0) { cantidadDeBorrados++; } grillaTemporal.inicializarCeldas(fila, 8 - column, 0); break; case 1: //horizontal if (grillaTemporal.grilla[8 - fila, column] != 0) { cantidadDeBorrados++; } grillaTemporal.inicializarCeldas(8 - fila, column, 0); break; case 2: //diagonal if (grillaTemporal.grilla[column, fila] != 0) { cantidadDeBorrados++; } grillaTemporal.inicializarCeldas(column, fila, 0); break; default: //diagonal if (grillaTemporal.grilla[fila, 8 - column] != 0) { cantidadDeBorrados++; } grillaTemporal.inicializarCeldas(column, fila, 0); break; } return(grillaTemporal); }
//clona objeto interfaz clone public object Clone() { //abilito el clonado GrillaSudoku p = new GrillaSudoku(); for (int i = 0; i < Max; i++) { for (int j = 0; j < Max; j++) { p.inicializarCeldas(i, j, grilla[i, j]); } } return(p); }