Создание судоку в React

Я создал судоку, который генерируется с помощью функции js, я пытаюсь показать его с помощью реакции, но я не знаю, почему это не работает.

Я пытаюсь создать 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.info(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')
      );

Я пытаюсь создать кабана, у которого есть 81 квадрат, эти квадраты имеют внутри вход со значением и идентификатором, когда я создаю входы, которые я хочу, чтобы это имело событие onkeypress, когда я помещаю число внутри входов, которые будут вызовите функцию comprovar, предоставив ему идентификатор и значение ввода, эта функция поместит фон ввода на красный цвет, если это не правильное число, или останется с ним, если оно правильное. У меня проблема с реагирующим кодом, потому что я не знаю, как создавать квадраты и вводы с событием, значением и вводом и как изменить их цвет фона.

Darckan 24.01.2019 09:59
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
249
2

Ответы 2

Привет, вы неправильно используете обработчик события onKeyPress, он должен получить ссылку на функцию, а не выполнять функцию следующим образом:

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

также вам не нужно передавать onkeypress при использовании компонента Square:

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

Это работает, и я это понял, спасибо, но теперь проблема в том, что когда я генерирую квадраты, их значение равно нулю.

Darckan 24.01.2019 11:50

У меня тоже есть это предупреждение. index.js:1446 Предупреждение. Недопустимое свойство обработчика событий onkeypress. Вы имели в виду onKeyPress? на входе (в src/index.js:137) в Square (в src/index.js:154) в div (в src/index.js:168) в div (в src/index.js:166) в Board (в src/index.js:277) в div (в src/index.js:276) в div (в src/index.js:275) в игре (в src/index.js:291)

Darckan 24.01.2019 11:52

Я думаю, проблема в том, что вы передаете value = {0}, а не value = {a}, попробуйте посмотреть, является ли это тем, чего вы хотели достичь здесь: codeandbox.io/s/l32wky2wjl

stasdes 24.01.2019 16:50

Это решение, но если я это сделаю, у меня будет полная судоку, и когда я хочу поместить числовую комбинированную панель, я не знаю, почему это не работает. Такс

Darckan 24.01.2019 17:12

Я бы предложил создать массив внутри состояния. это.

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(); 
      
      
      }
since you will have placeholders to hold those values to their coordinates inside your cells. whenever you change your arrays new values will be shown in your cells.

мое видео на ютубе на эту тему

Другие вопросы по теме