diff --git a/index.html b/index.html index 64d9c0e..30ed8b8 100644 --- a/index.html +++ b/index.html @@ -6,15 +6,112 @@ +
+ + + + + + + + + + + + + + + + +
+ +
+ - + diff --git a/index.js b/index.js index 1de2d94..f3dc35f 100644 --- a/index.js +++ b/index.js @@ -1 +1,85 @@ -// Реализуй логику выбора победителя в этом файле +const playingField = document.getElementById('playing-field'); +let currentPlayer = 'x'; +let canChangePlayer = true; +/* Инпуты игрового поля */ +let playingFieldInputs = new Array(9); +for (var x = 0; x < 3; x++) { + for (var y = 0; y < 3; y++) { + playingFieldInputs[x * 3 + y] = document.getElementById(x + "-" + y) + } +} + +function getCellValue(row, column) { + const input = document.getElementById(row + '-' + column); + return input.value; +} + +/* Очищаем игровое поле, устанавливаем текущего игрока и очищаем запись о победители*/ +function startNewGame(fieldInputs) { + playingFieldInputs.forEach(input => { + input.removeAttribute('value'); + }); + currentPlayer = 'x' + playingField.setAttribute('class', 'current_' + currentPlayer); + document.getElementById("winmsg").innerText = "" + canChangePlayer = true +} + +// Логика определения победителя!! +/* Возвращает символ победителя либо пустую строку либо ничью */ +function getWinMsg() { + let winMsg = undefined; + + /* Возвращает элемент, содержащийся во всех ячейках, иначе пустую строку*/ + function getSomeValue(valuesToCheck) { + const checkedValue = valuesToCheck[0]; + if (valuesToCheck.every(valueToCheck => valueToCheck == checkedValue)){ + return checkedValue; + } + else{ + return ""; + } + } + // Текущие состояние доски + const gameValues = playingFieldInputs.map(inp => inp.value); + // проверка горизонтальных линий + winMsg = getSomeValue(gameValues.slice(0, 3)) + getSomeValue(gameValues.slice(3, 6)) + getSomeValue(gameValues.slice(6, 9)) + // проверка вертикальных линий + + getSomeValue([gameValues[0], gameValues[3], gameValues[6]]) + + getSomeValue([gameValues[1], gameValues[4], gameValues[7]]) + + getSomeValue([gameValues[2], gameValues[5], gameValues[8]]) + // проверка диагоналей + + getSomeValue([gameValues[0], gameValues[4], gameValues[8]]) + + getSomeValue([gameValues[2], gameValues[4], gameValues[6]]) + + // если победитель не определён и все ячейки заполнены + if (winMsg.length == 0 && !gameValues.some(value => value == "")){ + winMsg = "ничья" + } + return winMsg; +} + +playingField.addEventListener('click', event => { + if(!canChangePlayer){ + return; + } + canChangePlayer = false; + + const cell = event.target; + const hiddenInput = cell.getElementsByTagName('input')[0]; + if (!hiddenInput.value) { + hiddenInput.setAttribute('value', currentPlayer); + currentPlayer = currentPlayer === 'x' ? 'o' : 'x'; + playingField.setAttribute('class', 'current_' + currentPlayer); + } + + canChangePlayer = true; + + const winMsg = getWinMsg() + if (winMsg.length > 0) { + const winMsgDiv = document.getElementById("winmsg") + winMsgDiv.innerText = winMsg + canChangePlayer = false + } +}) +; \ No newline at end of file diff --git a/tests/index-test.js b/tests/index-test.js index dbba04a..82b71c7 100644 --- a/tests/index-test.js +++ b/tests/index-test.js @@ -1,4 +1,80 @@ describe('cross-zero', () => { - // Этот тест можно уалить, он нужен для проверки сборки - it('should sum digits', () => chai.assert(1 + 1, 2)); + + function clickCell(id) { + document.getElementById(id).parentNode.click(); + } + function getWinnerMsg() { + return document.getElementById("winmsg").innerText + } + function startNewGameByButtonClicking() { + return document.getElementById("startGameButton").click() + } + // две линии по горизонтале, x просто первее закончит + it('should win x - horizontal', () => { + startNewGameByButtonClicking() + clickCell("0-0"); + clickCell("1-0"); + clickCell("0-1"); + clickCell("1-1"); + clickCell("0-2"); + clickCell("1-2"); + chai.assert.equal(getWinnerMsg(), 'x'); + }); + // две линии по горизонтале, x на 2ом шаге ставит на другую линию, отдавая победу o + it('should win o horizontal', () => { + startNewGameByButtonClicking() + clickCell("0-0"); + clickCell("1-0"); + clickCell("2-1"); + clickCell("1-1"); + clickCell("0-2"); + clickCell("1-2"); + chai.assert.equal(getWinnerMsg(), 'o'); + }); + + it('should win x vertical', () => { + startNewGameByButtonClicking() + clickCell("0-0"); + clickCell("1-1"); + clickCell("2-0"); + clickCell("0-1"); + clickCell("1-0"); + clickCell("2-2"); + chai.assert.equal(getWinnerMsg(), 'x'); + }); + + it('should win o vertical', () => { + startNewGameByButtonClicking() + clickCell("0-0"); + clickCell("1-0"); + clickCell("2-1"); + clickCell("1-1"); + clickCell("2-2"); + clickCell("1-2"); + chai.assert.equal(getWinnerMsg(), 'o'); + }); + + it('should win x diagonal', () => { + startNewGameByButtonClicking() + clickCell("0-0"); + clickCell("0-1"); + clickCell("1-0"); + clickCell("1-1"); + clickCell("2-0"); + chai.assert.equal(getWinnerMsg(), 'x'); + }); + + it('without winners', () => { + startNewGameByButtonClicking() + clickCell("0-0"); + clickCell("0-1"); + clickCell("0-2"); + clickCell("1-1"); + clickCell("1-0"); + clickCell("2-0"); + clickCell("2-1"); + clickCell("2-2"); + clickCell("1-2"); + chai.assert.equal(getWinnerMsg(), 'ничья'); + }); });