Задать вопрос
@Khetag_d

Как улучшить код и что в нём может быть не так?

Написал код (рабочий) и я хочу услышать конструктивную критику от знающих что поменять или как улучшить код (тоесть написал ли я так как не принято писать и т.п.)

let sum = 0;
let playerOne = 1;
let playerTwo = 2;

let arrayCheker = [
    [0, 0, 0],
    [0, 0, 0],
    [0, 0, 0]
];

function krestik(krest) {
    let div = document.createElement("div");
    let divRight = document.createElement("div");

    div.style.position = "absolute";
    div.style.top = "52%";
    div.style.left = "50%";
    div.style.transform = "translate(-50%,-50%) rotate(45deg)";
    div.style.width = "5%";
    div.style.height = "60%";
    div.style.backgroundColor = "#ffd0fe";
    div.style.border = "2px solid #ffd0fe";

    divRight.style.position = "absolute";
    divRight.style.top = "50%";
    divRight.style.left = "50%";
    divRight.style.transform = "translateX(-50%) rotate(45deg)";
    divRight.style.width = "60%";
    divRight.style.height = "5%";
    divRight.style.backgroundColor = "#fe8eff";
    divRight.style.border = "2px solid #fe8eff";

    krest.appendChild(divRight);
    krest.appendChild(div);
    return krest;
}

function nolik(nol) {
    let div = document.createElement("div");
    div.style.position = "absolute";
    div.style.top = "10px";
    div.style.left = "50%";
    div.style.transform = "translateX(-50%)";
    div.style.borderStyle = "solid";
    div.style.borderWidth = "10px";
    div.style.backgroundImage = "linear-gradient(to left, #fe8eff, #ffd0fe)";
    div.style.borderColor = "#a12d91";
    div.style.borderRadius = "50%";
    div.style.width = "80%";
    div.style.height = "80%";
    nol.appendChild(div);
    return nol;
}

function arrCompletion(index, arr, perem) {
    let row = Math.floor(index / 3);
    let col = index % 3;
    if (arr[row][col] === 0) {
        arr[row][col] = perem;
        return true;
    }
    return false;
}

function checkWinner() {

    for (let i = 0; i < 3; i++) {
        if (arrayCheker[i][0] !== 0 && arrayCheker[i][0] === arrayCheker[i][1] && arrayCheker[i][1] === arrayCheker[i][2]) {
            return arrayCheker[i][0];
        }
        if (arrayCheker[0][i] !== 0 && arrayCheker[0][i] === arrayCheker[1][i] && arrayCheker[1][i] === arrayCheker[2][i]) {
            return arrayCheker[0][i];
        }
    }


    if (arrayCheker[0][0] !== 0 && arrayCheker[0][0] === arrayCheker[1][1] && arrayCheker[1][1] === arrayCheker[2][2]) {
        return arrayCheker[0][0];
    }
    if (arrayCheker[0][2] !== 0 && arrayCheker[0][2] === arrayCheker[1][1] && arrayCheker[1][1] === arrayCheker[2][0]) {
        return arrayCheker[0][2];
    }

    return 0;
}

function displayWinner(winner) {
    const message = winner === playerOne ? "Игрок 1 победил!" : "Игрок 2 победил!";
    alert(message);


    groupCell.forEach(el => {
        el.removeEventListener("click", handleClick);
    });


    if (confirm("Хотите сыграть еще раз?")) {
        resetGame();
    }
}

function handleClick(el, index) {
    if (arrCompletion(index, arrayCheker, (sum % 2 === 1) ? playerOne : playerTwo)) {
        if (sum % 2 === 1) {
            nolik(el);
        } else {
            krestik(el);
        }
        sum++;

        const winner = checkWinner();
        if (winner !== 0) {
            displayWinner(winner);
        }
    }
}

let groupCell = document.querySelectorAll(".game__monitor--krestnol div");
groupCell.forEach((el, index) => {
    el.addEventListener("click", function() {
        handleClick(el, index);
    });
});
function resetGame() {

    groupCell.forEach(el => {
        el.innerHTML = '';
        el.addEventListener("click", function() {
            handleClick(el, index);
        });
    });


    arrayCheker = [
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]
    ];
    sum = 0;
}
  • Вопрос задан
  • 1747 просмотров
Подписаться 1 Простой 5 комментариев
Решения вопроса 1
Kentavr16
@Kentavr16
long cold winter
сугубо по коду -
1) вынести предикаты в отдельные функции для улучшения читаемости.
2) вообще код разбить на функции. Если только начинаешь учиться - перенеси все это в классы. Создай класс игрока, поля и тд. Заодно ознакомишься с SOLID (уточнения по мелочам и правда лучше к чату гпт)
3) если правда учишься и САМ написал код - переведи его в typescript. Это стандарт индустрии, мастхев.
4) if (confirm("Хотите сыграть еще раз?"))
вынести в отдельные переменные. Учиться не оставлять в коде прописаных от руки строк.

Основа основ - переписать это на мелкие ф-кции с нормальными названиями и четким назначением, чтобы код стал приятно читаем.

пока у меня все )
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@idd451289
Из того что бросилось в глаза
  1. названия. Часть названий не информативны. К примеру методы это почти всегда глагол и опционально действие над предметом. Что делает метод krestik(кстати транслит тоже использовать не стоит)? Создаёт, удаляет, копирует? Смотрим в метод, добавляет. Но так быть не должно
  2. css в js-е. Зачем создавать свойства в js, с учётом того что они статические. Это надо перенести в css и юзать классы
  3. магические числа. Что за строки прямо в коде. Что за 0, в массиве. Все в константы с понятным именем
  4. не везде используется const. Много где можно было бы юзать const
  5. разное объявление строковых литералов. Пофиг как,через ' или через " используйте один вариант. С таким очень хорошо помогает prettier
  6. смешанность кода. Тут и логика игрока, и логика игрового поля, и логика процесса игры. Разбейте на классы и пусть они взаимодействуют друг с другом как отдельные сущности
  7. ещё можно немного поругаться на то что надо разделить бизнес логику(проставление крестиков, подсчет) и слой визуализации. На таком маленьком проекте может и не надо, но на большом стрельнет, особенно если будете жить без какого то фреймворка
  8. так же можно взять какой либо фреймворк(или завести реактивность типа rxjs). Это совсем не обязательно, но потренироваться полезно. Если совсем делать нечего можете посмотреть в сторону веб компонентов, штука интересная, но специфичная
  9. так же нужен typescript, это по сути стандарт в разработке
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы