From 89810fca04fb73baeac4838633bdacb5d3d9524f Mon Sep 17 00:00:00 2001 From: AnnaIlinykh Date: Wed, 25 Apr 2018 18:01:50 +0500 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=B8=20=D1=82=D0=B5=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 99 ++++++++++++++++++++++++++++++++++++++++++++- index.js | 86 ++++++++++++++++++++++++++++++++++++++- tests/index-test.js | 80 +++++++++++++++++++++++++++++++++++- 3 files changed, 261 insertions(+), 4 deletions(-) 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(), 'ничья'); + }); });