예제 #1
0
        //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);
        }
예제 #2
0
//toma el sudoku resuelto y le saca algunos numeros
        public GrillaSudoku borrarCuadros(GrillaSudoku grillaResuelta)
        {
            GrillaSudoku grillaTemporal;
            GrillaSudoku guardarCopia;

            bool unico             = true;
            int  totalDeNumSacados = 0;
            int  intentos          = 0;
            int  espaciosEnBlancoDeseados;                       //cantidad de espacios en blanco deseados
            int  simetria = 0;

            grillaTemporal = (GrillaSudoku)grillaResuelta.Clone();

            Random rnd = new Random();

            switch (dificultad)                       //cantidad de espacios en blancos deseados segun dificultad
            {
            case Difficulty.Easy:                     //easy
                espaciosEnBlancoDeseados = 10;
                break;

            case Difficulty.Medium:                     //medium
                espaciosEnBlancoDeseados = 25;
                break;

            case Difficulty.Hard:                     //hard
                espaciosEnBlancoDeseados = 40;
                break;

            default:
                espaciosEnBlancoDeseados = 60;
                break;
            }

            simetria = rnd.Next(0, 2);                               //selecciona simetria random
            do
            {
                guardarCopia   = (GrillaSudoku)grillaTemporal.Clone();
                grillaTemporal = borrarAzar(grillaTemporal, simetria, ref totalDeNumSacados);
                //borra 1 o 2 cuadros depende simetria
                solucionadorSudoku = new SolucionadorSudoku();
                unico = solucionadorSudoku.resolverGrilla((GrillaSudoku)grillaTemporal.Clone(), true);
                if (!unico)
                {
                    grillaTemporal = (GrillaSudoku)guardarCopia.Clone();
                    intentos++;
                }
            } while ((totalDeNumSacados < espaciosEnBlancoDeseados) && (intentos < 1000));
            grillaResuelta = grillaTemporal;
            grillaResuelta.Termina();
            return(grillaResuelta);
        }
예제 #3
0
        //retorna modo de juego estndar
        public ModoDeJuego(Difficulty diff) : base(diff)
        {
            grillaSudoku       = new GrillaSudoku();
            solucionadorSudoku = new SolucionadorSudoku();
            generadorSudoku    = new generarSudoku(diff);

            generadorSudoku.InicializarGrilla();

            base.solucion = generadorSudoku.GrillaSolucion.grilla;
            base.mask     = generadorSudoku.PermaGrilla.grilla;
            grillaUsuario.Initialize();
            for (int i = 0; i < 9; i++)
            {
                for (int j = 0; j < 9; j++)
                {
                    mask[i, j]          = -mask[i, j];
                    grillaUsuario[i, j] = mask[i, j];
                }
            }
        }
예제 #4
0
 //contructor
 public generarSudoku(Difficulty dificultad)
 {
     solucionadorSudoku = new SolucionadorSudoku();
     this.dificultad    = dificultad;
 }