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(), 'ничья');
+ });
});