Крестики-нолики. Вторая итерация

Демо: https://projectstictactoe1.github.io/
Код: https://github.com/projectstictactoe1/projectstictactoe1.github.io


Данный пост продолжение предыдущего
Задача новой версии проекта - улучшить код, улучшить функционал и избавиться от некоторых недостатков.
Что планируется изменить:
- проверку на выигрыш, сделать её код более компактным и логичным;
- добавить проверку на ничью, которой не было в предыдущей версии;
- запретить делать ход в уже заполненные ячейки;
- запретить делать ход после выигрыша;
- сделать кнопку сброса игрового поля и предложения сыграть ещё раз
- возможно сделаю счётчик побед и поражений. хоть пока компьютер не играет сам в таком счётчике нет особого смысла

Код можно посмотреть по ссылке на гитхаб.
Эта небольшая, простая, даже примитивная игра заняла у меня неделю времени и показалась достаточно сложной. Ходы компьютера, пусть даже рандомные, не говоря уже об ии я запрограммировать не сумела. Немного успокаиваю себя фразой "Есть один момент, на который я хочу указать тем, кто будет делать крестики-нолики или четыре в ряд. Не стоит сейчас сильно беспокоиться об искусственном интеллекте. Сделать игру только для двух игроков или для игры с компьютером, который делает случайные ходы вполне достаточно для начала." Как начать писать игры
Конечно, с 2012 года, когда был выложен пост по ссылке, многое изменилось, но люди остались те же.

В качестве источника использовалось видео Создаем игру крестики-нолики на чистом Javascript
Его пересмотрела дважды, разобрала код построчно, потом удалила весь код полностью и заново написала свой.

Какие методы использовались, или планировались использоваться:

document.getElementById("id");
.querySelectorAll(".class");
.innerHTML += '....';
.innerText = "...";
.textContent = "...";
.addEventListener("click", function(){});
.getAttribute("attribute");
.removeEventListener("click", function);
.classList.add("class");
.classList.remove("class");
.indexOf("text") !== -1;

Там, где вначале точка, перед точкой ставится какая-то переменная.

Пока не могу определиться с кавычками - двойные или одинарные. С одной стороны, одинарные в js более распространены. Firefox, когда нажимаешь в консоли кнопку "Красивый вывод" преобразует двойные кавычки в коде в одинарные. С другой стороны, редактор Brackets  автоматически ставит двойные кавычки. И ещё увидеть разницу между " и '' я не могу. При том что в первом случае это одна двойная кавычка, а во втором - две одинарные, обозначающие пустую строку. В общем, пока пользуюсь двойными, а там посмотрим.

В чём были проблемы.
Во многом.
- ошибки в методах, когда вместо .querySelectorAll пишешь .guerySelectorAll, или .querySelectorsAll и удивляешься почему интерпретатор тебя не понимает;
-  ошибки в точках, которые то пишутся .querySelectorAll(".class");, то нет .classList.add("class"); И хоть умом я понимаю, что раз метод .classList применим только к классам, точка не нужна, но автоматически могу её поставить
- доступ к ячейкам игры, который осуществляется только в цикле
- и вот когда этот цикли идёт, то обращаться к текущему элементу  можно и нужно через this, а если через cell[i], то не работает.
- или вот ещё, когда навесила на ячейку событие клик, а потом не могла его отменить. Потому что, оказывается, если пишешь сразу код функции там где .addEventListener("click", function(){}); то отменить её не поучится. А нужно вместо кода функции function(){} написать её имя, потом создать функцию с таким именем, а потом только её отменять.
- и ещё я не знаю как из одной функции вызывать другую. Или как передать результат true или false работы одной функции в другую функцию
- и вот когда назначаю одному элементу . textContent = "..."; а потом пытаюсь сделать это условием . textContent === "..."; то это условие не работает. И с .innerText = "..."; то же самое. Вот почему так?

Поэтому сейчас я хочу найти какие-то практические уроки, чтобы посмотреть как вообще пишется код.