Skip to content
16 changes: 8 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
Сейчас в коде описаны функции для рисования поля любого размера и рисования любого символа в клетке этого поля.
Твоя задача дописать код, чтобы это стало полноценной игрой в Крестики-нолики.

1. Реши, как будешь хранить поле. Тебе нужна будет такая структура, в которой удобно понимать есть ли победитель: три клетки по горизонтали, вертикали или диагонали, заполненные одинаковыми символами.
2. Допиши функцию cellClickHandler, чтобы после клика ставился крестик или нолик в соответствующее поле.
3. Если поле, по которому кликнули, не пустое, символ ставиться не должен.
4. Если кончились ходы, выведи alert с текстом "Победила дружба".
5. Напиши функцию, которая считает: есть ли уже победитель. Если есть победитель, выведи alert с названием победителя
6. Если есть победитель, покрась победные значения в клетках в красный.
7. После победы, клик по полю больше не должен ставить крестик или нолик.
8. Обрабатывай клик по кнопке "Сначала": допиши метод resetClickHandler, чтобы поле очищалось.
1. +++++++Реши, как будешь хранить поле. Тебе нужна будет такая структура, в которой удобно понимать есть ли победитель: три клетки по горизонтали, вертикали или диагонали, заполненные одинаковыми символами.
2. +++++++Допиши функцию cellClickHandler, чтобы после клика ставился крестик или нолик в соответствующее поле.
3. +++++++Если поле, по которому кликнули, не пустое, символ ставиться не должен.
4. +++++++Если кончились ходы, выведи alert с текстом "Победила дружба".
5. +++++++Напиши функцию, которая считает: есть ли уже победитель. Если есть победитель, выведи alert с названием победителя
6. +++++++Если есть победитель, покрась победные значения в клетках в красный.
7. +++++++После победы, клик по полю больше не должен ставить крестик или нолик.
8. +++++++Обрабатывай клик по кнопке "Сначала": допиши метод resetClickHandler, чтобы поле очищалось.
9. \* Сделай так, чтобы можно было в начале игры задавать поле произвольного размера.
10. \* Напиши "искусственный интеллект" — функцию, которая будет ставить нолики с случайное пустое поле.
11. \* Напиши чуть более умный искусственный интеллект — функция, ставящая нолики в случайном месте обязана поставить нолик в такое поле, нолик в котором приведет к выигрышу "ИИ".
Expand Down
163 changes: 149 additions & 14 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,17 +1,25 @@
const CROSS = 'X';
const ZERO = 'O';
const EMPTY = ' ';
let MAP = [
[EMPTY, EMPTY, EMPTY],
[EMPTY, EMPTY, EMPTY],
[EMPTY, EMPTY, EMPTY]
];

let winner
let lastMove = ZERO

const container = document.getElementById('fieldWrapper');

startGame();
addResetListener();

function startGame () {
function startGame() {
renderGrid(3);
}

function renderGrid (dimension) {
function renderGrid(dimension) {
container.innerHTML = '';

for (let i = 0; i < dimension; i++) {
Expand All @@ -26,41 +34,168 @@ function renderGrid (dimension) {
}
}

function cellClickHandler (row, col) {
// Пиши код тут
function cellClickHandler(row, col) {
if (MAP[row][col] !== EMPTY || winner !== undefined){
return;
}

let player;
if (lastMove === ZERO) {
player = CROSS;
} else {
player = ZERO;
}

renderSymbolInCell(player, row, col);
MAP[row][col] = player;
lastMove = player;
console.log(`Clicked on cell: ${row}, ${col}`);
checkWinner()

if (winner !== undefined){
checkTie()
}
}

function checkTie(){
for (let i = 0; i < MAP.length; i++) {
for (let j = 0; j < MAP[i].length; j++) {
if (MAP[i][j] === EMPTY) {
return;
}
}
}
alert('Победила дружба')
}

function checkWinner() {
for (let i = 0; i < MAP.length; i++) {
let temp = MAP[i][0];
let isWinner = true;

for (let j = 1; j < MAP[i].length; j++) {
if (MAP[i][j] !== temp || temp === EMPTY) {
isWinner = false;
break;
}
}

if (isWinner) {
winner = temp;
let res = [];
for (let j = 0; j < MAP[i].length; j++) {
res.push([i, j]);
}
drawCell(res);
return;
}
}

for (let i = 0; i < MAP.length; i++) {
let temp = MAP[0][i];
let isWinner = true;

for (let j = 1; j < MAP.length; j++) {
if (MAP[j][i] !== temp || temp === EMPTY) {
isWinner = false;
break;
}
}

if (isWinner) {
winner = temp;
let res = [];
for (let j = 0; j < MAP.length; j++) {
res.push([j, i]);
}
drawCell(res);
return;
}
}

let temp = MAP[0][0];
let isWinner = true;
let res = [[0, 0]];

for (let i = 1; i < MAP.length; i++) {
if (MAP[i][i] !== temp || temp === EMPTY) {
isWinner = false;
break;
}
res.push([i, i]);
}

/* Пользоваться методом для размещения символа в клетке так:
renderSymbolInCell(ZERO, row, col);
*/
if (isWinner) {
winner = temp;
drawCell(res);
return;
}

temp = MAP[0][MAP.length - 1];
isWinner = true;
res = [[0, MAP.length - 1]];

for (let i = 1; i < MAP.length; i++) {
if (MAP[i][MAP.length - i - 1] !== temp || temp === EMPTY) {
isWinner = false;
break;
}
res.push([i, MAP.length - i - 1]);
}

if (isWinner) {
winner = temp;
drawCell(res);
}
}


function drawCell(cells) {
for (let i = 0; i < cells.length; i++) {
renderSymbolInCell(winner, cells[i][0], cells[i][1], 'red');
}
alert(winner)
}

function renderSymbolInCell (symbol, row, col, color = '#333') {

function renderSymbolInCell(symbol, row, col, color = '#333') {
const targetCell = findCell(row, col);

targetCell.textContent = symbol;
targetCell.style.color = color;
}

function findCell (row, col) {
function findCell(row, col) {
const targetRow = container.querySelectorAll('tr')[row];
return targetRow.querySelectorAll('td')[col];
}

function addResetListener () {
function addResetListener() {
const resetButton = document.getElementById('reset');
resetButton.addEventListener('click', resetClickHandler);
}

function resetClickHandler () {
function resetClickHandler() {
MAP = [
[EMPTY, EMPTY, EMPTY],
[EMPTY, EMPTY, EMPTY],
[EMPTY, EMPTY, EMPTY]
];
for (let i = 0; i < MAP.length; i++) {
for (let j = 0; j < MAP[i].length; j++) {
renderSymbolInCell('', i, j, '#333')
}
}
winner = undefined
lastMove = ZERO
console.log('reset!');
}


/* Test Function */

/* Победа первого игрока */
function testWin () {
function testWin() {
clickOnCell(0, 2);
clickOnCell(0, 0);
clickOnCell(2, 0);
Expand All @@ -71,7 +206,7 @@ function testWin () {
}

/* Ничья */
function testDraw () {
function testDraw() {
clickOnCell(2, 0);
clickOnCell(1, 0);
clickOnCell(1, 1);
Expand All @@ -84,6 +219,6 @@ function testDraw () {
clickOnCell(2, 2);
}

function clickOnCell (row, col) {
function clickOnCell(row, col) {
findCell(row, col).click();
}