在React中创建Sudoku

时间:2019-01-24 07:23:41

标签: javascript reactjs

我创建了一个由js函数生成的数独,我尝试通过react来显示它,但是我不知道为什么这样做有效。

我尝试创建一个在输入中带有id和值,值的81个正方形,当我在其中输入数字时,将执行功能comprobar并将其背景设置为已读或白色(如果正确的话)。

import React, { Component } from "react";
    import ReactDOM from "react-dom";
    import "./index.css";

    /*Se genera el diseño */
    var fallo;

    // Array que contendra las posiciones que se mostrarán
    var array = new Array(9);

    // Array de 9x9 que contiene la solucion. generada
    for (var z = 0; z < 9; z++) {
      array[z] = new Array(9);
    }

    function rellenarCuad(n, m) {
      // Método que recibe el punto de comienzo del cuadrado
      var x = n * 3;
      var z = m * 3;
      var arrN = [1, 2, 3, 4, 5, 6, 7, 8, 9];

      /* En este método se procede a rellenar el cuadrado 3x3 cumpliendo que no se repita en el mismo, en la fila y en la columna */
      for (var i = x; i < 3 + x; i++) {
        for (var j = z; j < 3 + z; j++) {
          var arrayaux = new Array(9);

          for (var zn = 0; zn < 9; zn++) arrayaux[zn] = array[zn][j];

          var pr = true;
          var intentos = 0;

          do {
            do {
              var nm = Math.floor(Math.random() * 9, 0);
            } while (arrN[nm] == 0);

            if (
              array[i].indexOf(arrN[nm]) === -1 &&
              arrayaux.indexOf(arrN[nm]) === -1
            ) {
              array[i][j] = arrN[nm];
              arrN[nm] = 0;
              pr = false;
            }

            if (intentos > 50) {
              // Si rebasa 50 intentos doy por hecho que no tiene solucion

              fallo = true;
              return;
            }

            intentos++;
          } while (pr);
        }
      }
    }

    // Método que genera el sodoku. Es recursivo, si no se halla una solución se llama a si mismo hasta encontrarla
    function generarSodoku() {
      // Método que simplemente llamar a rellenarCuad por cada cuadrado 3x3, es decir, le llama 9 veces
      for (var i = 0; i < 3; i++) {
        for (var y = 0; y < 3; y++) {
          rellenarCuad(y, i);
          if (fallo) {
            //  Si el seguro se activa, regenera el array y se llama asi mismo para repetir el proceso.

            fallo = false;
            array = null;
            array = new Array(9);

            for (z = 0; z < 9; z++) array[z] = new Array(9);

            generarSodoku();
            return;
          }
        }
      }
    }

    // Función que genera el numero de posiciones a ocultar según la eleción del usuario
    function umbral() {
      var nm = 80;
      var arrayM = new Array(nm);

      for (var l = 0; l < nm; l++) {
        var alpha = true;
        while (alpha) {
          var num = Math.floor(Math.random() * 81) + 1;
          if (arrayM.indexOf(num) !== -1) {
          } else {
            arrayM[l] = num;
            alpha = false;
          }
        }
      }
    }

    generarSodoku();

    console.log(array);

    var valoresVacios = [0];

    function generarAleatorios() {
        for (let i = 1; i < 5; i++) {
            do {
                var numAlea = Math.floor(Math.random() * 80);

            } while (!valoresVacios.indexOf(valoresVacios[i]));
            valoresVacios[i] = numAlea;
        }
    }

    generarAleatorios();

    function comprobar(value, i) {
      if (valoresVacios.indexOf(i)) {
        var valor = Math.floor(i / 9);
        var segundo = (i / 9).toFixed(1);
        segundo = (segundo - valor) * 10;
        if (array[valor][segundo] !== value) {
          document.getElementById(i).style.backgroundColor = "red";
        } else {
          document.getElementById(i).style.backgroundColor = "white";
        }
      }
    } 


    function Square(props) {
        return (
          <input className="square" type="text" onkeypress={comprobar(this.value, this.id)} />
        );
      }

      class Board extends React.Component {
        constructor(props) {
          super(props);
          this.state = {
            squares: Array(81),
          };
        }

        comprobar(value, i) {
            if (valoresVacios.indexOf(i)) {
              var valor = Math.floor(i / 9);
              var segundo = (i / 9).toFixed(1);
              segundo = (segundo - valor) * 10;
              if (array[valor][segundo] !== value) {
                document.getElementById(i).style.backgroundColor = "red";
              } else {
                document.getElementById(i).style.backgroundColor = "white";
              }
            }
          } 

        renderSquare(a, i) {
            if (valoresVacios.indexOf(i)) {
              return <Square value={0} id={i} onkeypress={() => this.comprobar(a, i)}/>;
            } else {
              return <Square value={a} id={i} disabled onkeypress={() => this.comprobar(a, i)}/>;
            }
          }

        render() {
          /*const winner = calculateWinner(this.state.squares);
          let status;
          if (winner) {
            status = 'Winner: ' + winner;
          }*/

          return (
            <div>
                <div className="status">{}</div>
                <div className="board-row">
                {this.renderSquare(array[0][0], 0)}
                {this.renderSquare(array[0][1], 1)}
                {this.renderSquare(array[0][2], 2)}
                {this.renderSquare(array[0][3], 3)}
                {this.renderSquare(array[0][4], 4)}
                {this.renderSquare(array[0][5], 5)}
                {this.renderSquare(array[0][6], 6)}
                {this.renderSquare(array[0][7], 7)}
                {this.renderSquare(array[0][8], 8)}
                </div>
                <div className="board-row">
                {this.renderSquare(array[1][0], 9)}
                {this.renderSquare(array[1][1], 10)}
                {this.renderSquare(array[1][2], 11)}
                {this.renderSquare(array[1][3], 12)}
                {this.renderSquare(array[1][4], 13)}
                {this.renderSquare(array[1][5], 14)}
                {this.renderSquare(array[1][6], 15)}
                {this.renderSquare(array[1][7], 16)}
                {this.renderSquare(array[1][8], 17)}
                </div>
                <div className="board-row">
                {this.renderSquare(array[2][0], 18)}
                {this.renderSquare(array[2][1], 19)}
                {this.renderSquare(array[2][2], 20)}
                {this.renderSquare(array[2][3], 21)}
                {this.renderSquare(array[2][4], 22)}
                {this.renderSquare(array[2][5], 23)}
                {this.renderSquare(array[2][6], 24)}
                {this.renderSquare(array[2][7], 25)}
                {this.renderSquare(array[2][8], 26)}
                </div>
                <div className="board-row">
                {this.renderSquare(array[3][0], 27)}
                {this.renderSquare(array[3][1], 28)}
                {this.renderSquare(array[3][2], 29)}
                {this.renderSquare(array[3][3], 30)}
                {this.renderSquare(array[3][4], 31)}
                {this.renderSquare(array[3][5], 32)}
                {this.renderSquare(array[3][6], 33)}
                {this.renderSquare(array[3][7], 34)}
                {this.renderSquare(array[3][8], 35)}
                </div>
                <div className="board-row">
                {this.renderSquare(array[4][0], 36)}
                {this.renderSquare(array[4][1], 37)}
                {this.renderSquare(array[4][2], 38)}
                {this.renderSquare(array[4][3], 39)}
                {this.renderSquare(array[4][4], 40)}
                {this.renderSquare(array[4][5], 41)}
                {this.renderSquare(array[4][6], 42)}
                {this.renderSquare(array[4][7], 43)}
                {this.renderSquare(array[4][8], 44)}
                </div>
                <div className="board-row">
                {this.renderSquare(array[5][0], 45)}
                {this.renderSquare(array[5][1], 46)}
                {this.renderSquare(array[5][2], 47)}
                {this.renderSquare(array[5][3], 48)}
                {this.renderSquare(array[5][4], 49)}
                {this.renderSquare(array[5][5], 50)}
                {this.renderSquare(array[5][6], 51)}
                {this.renderSquare(array[5][7], 52)}
                {this.renderSquare(array[5][8], 53)}
                </div>
                <div className="board-row">
                {this.renderSquare(array[6][0], 54)}
                {this.renderSquare(array[6][1], 55)}
                {this.renderSquare(array[6][2], 56)}
                {this.renderSquare(array[6][3], 57)}
                {this.renderSquare(array[6][4], 58)}
                {this.renderSquare(array[6][5], 59)}
                {this.renderSquare(array[6][6], 60)}
                {this.renderSquare(array[6][7], 61)}
                {this.renderSquare(array[6][8], 62)}
                </div>
                <div className="board-row">
                {this.renderSquare(array[7][0], 63)}
                {this.renderSquare(array[7][1], 64)}
                {this.renderSquare(array[7][2], 65)}
                {this.renderSquare(array[7][3], 66)}
                {this.renderSquare(array[7][4], 67)}
                {this.renderSquare(array[7][5], 68)}
                {this.renderSquare(array[7][6], 69)}
                {this.renderSquare(array[7][7], 70)}
                {this.renderSquare(array[7][8], 71)}
                </div>
                <div className="board-row">
                {this.renderSquare(array[8][0], 72)}
                {this.renderSquare(array[8][1], 73)}
                {this.renderSquare(array[8][2], 74)}
                {this.renderSquare(array[8][3], 75)}
                {this.renderSquare(array[8][4], 76)}
                {this.renderSquare(array[8][5], 77)}
                {this.renderSquare(array[8][6], 78)}
                {this.renderSquare(array[8][7], 79)}
                {this.renderSquare(array[8][8], 80)}
                </div>
            </div>
          );
        }
      }

      class Game extends React.Component {
        render() {
          return (
            <div className="game">
              <div className="game-board">
                <Board />
              </div>
              <div className="game-info">
                <div>{/* status */}</div>
                <ol>{/* TODO */}</ol>
              </div>
            </div>
          );
        }
      }

      // ========================================

      ReactDOM.render(
        <Game />,
        document.getElementById('root')
      );

2 个答案:

答案 0 :(得分:1)

您好,您使用了错误的onKeyPress事件处理程序,它应该收到对该函数的引用,并且不能以这种方式执行该函数:

 function Square(props) {
    const handleKeyPress = (e) => {
       comprobar(props.value, props.id) 
    }
        return (
          <input className="square" type="text" onkeypress={handleKeyPress} />
        );
      }

使用Square组件时,您也不需要传递onkeypress:

renderSquare(a, i) {
            if (valoresVacios.indexOf(i)) {
              return <Square value={0} id={i} />;
            } else {
              return <Square value={a} id={i} disabled />;
            }
          }

答案 1 :(得分:0)

我建议在状态内部创建一个数组。这个。

const filledArray1 = new Array(81).fill("1");
const filledArray2 = new Array(81).fill("white");
    this.state = {
      cellValues: filledArray1 , 
      cellBackgroundColors:filledArray2
      }
      
      loadValues=()=>{
      
         const newValues= [ 1,"" , 5 , "" , 6 ,  .......   ] ;  // 81 
         this.setState( { cellValues : [...newValues ] })
      
      }
      
      componentDidMount(){
      
         loadValues(); 
      
      }


      loadValues=()=>{
      
         const newValues= [ 1,"" , 5 , "" , 6 ,  .......   ] ;  // 81 
         this.setState( { cellValues : [...newValues ] })
      
      }
      
      
      componentDidMount(){
      
         loadValues(); 
      
      
      }
因为您将拥有占位符,以将这些值保存在单元格内的坐标中。每当您更改数组时,新值都会显示在单元格中。

my youtube video on this subject