Проблема в игре в крестики-нолики с перемещением компьютера

#javascript #html #css

#javascript #HTML #css

Вопрос:

Я пишу игру в крестики-нолики, и у меня такая проблема, потому что я создал функцию computerMove, и она отвечает за создание буквы «О» в случайном поле. Но когда есть последнее поле для выбора и есть ход игрока, когда вы нажимаете на это поле как игрок, вторая буква «О» появляется в другом. Иногда в середине игры появляются две буквы «О».

Вот ссылка на весь проект:https://codepen.io/daniel-led/pen/qBZpWZG

 let pools = document.querySelectorAll(".pool"); 
let randomNumber;
var nums = [];
    ranNums = [0,1,2,3,4,5,6,7,8];
// let i = 0;
let didHave;

addClickForPools();

function addClickForPools(){ //addEventListener
    for(let i = 0; i < pools.length; i  ){
        pools[i].addEventListener("click", userMove);

        function userMove(){
            let h1 = document.createElement("H1");
            let t = document.createTextNode("X")
            h1.appendChild(t);
            pools[i].appendChild(h1);
            nums[i] = i;
            
                computerMove();
              
            removeClickForPools();
            // pools[i].innerHTML = 
            function removeClickForPools(){
                pools[i].removeEventListener("click", userMove);
            }
        }
    }

}
function computerMove(){

   randomNumber = randomNum();


   
    let h1 = document.createElement("H1");
    let t = document.createTextNode("O")
    h1.appendChild(t);
    pools[randomNumber].appendChild(h1);
   

    
  
}


function randomNum(){
    let n = Math.floor(Math.random() * 9);
    didHave = nums.includes(n);

    while(didHave == true){
         n = Math.floor(Math.random() * 9);
        didHave = nums.includes(n);
    }
    nums.push(n);
    return n
}
  

Ответ №1:

Чтобы уточнить ответ Гордона и почему смешивание nums.push(n) и nums[i] = i является проблемой .. nums.push(n) всегда добавляется в конец nums , поэтому, если nums имеет 3 элемента, четвертый будет добавлен в конец. nums[i] = i прямое назначение слоту, чтобы пользовательское перемещение могло переопределить перемещение компьютеров. Вот почему компьютер помещает O в слоты, которые он уже сыграл. Всегда используйте push для добавления элементов в массив в JS.

Вторая проблема, которую я вижу, заключается в том, что randomNum() также должна быть возможность возвращать 0, поскольку это представляет первую плитку, и компьютер должен иметь возможность ее воспроизводить.

Вам также необходимо проверить, должен ли компьютер вообще играть — остались ли какие-либо пустые плитки.

Я внес некоторые изменения в ваш codepen.

Ответ №2:

Вы добавляете номер пула в nums в функции userMove() через nums[i] = i; , но в функции randomNum() через nums.push(n); . Вы должны использовать один и тот же способ в обоих методах.