Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 12 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
Задача дописать игру в крестики-нолики.

Я Усынин Андрей Вячеславович!
Сейчас в коде описаны функции для рисования поля любого размера и рисования любого символа в клетке этого поля.
Твоя задача дописать код, чтобы это стало полноценной игрой в Крестики-нолики.

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

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

let fullGrid=[];
let switcherX = true;
let movesLeft;
let x;
let win = false;
let coolPosition = [0, 0];
startGame();
addResetListener();

function startGame () {
renderGrid(3);
x = prompt('Введите длинну стороны поля', 3)
movesLeft = x*x;
coolPosition = [Math.floor(Math.random() * x), Math.floor(Math.random() * x)];
for(let i=0; i<x; i++)
{
fullGrid[i]=[];
for(let j=0; j<x; j++)
fullGrid[i][j]=EMPTY;
}
renderGrid(x);
}

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

for (let i = 0; i < dimension; i++) {
const row = document.createElement('tr');
for (let j = 0; j < dimension; j++) {
const cell = document.createElement('td');
cell.textContent = EMPTY;
cell.textContent = fullGrid[i][j];
cell.addEventListener('click', () => cellClickHandler(i, j));
row.appendChild(cell);
}
Expand All @@ -27,18 +42,212 @@ function renderGrid (dimension) {
}

function cellClickHandler (row, col) {
// Пиши код тут
console.log(`Clicked on cell: ${row}, ${col}`);
if (win === true)
return;
console.log(`Clicked on cell: ${row}, ${col}`);
if (fullGrid[row][col]===EMPTY){
Click(row, col);
if (win != true)
if ((+(movesLeft*2)) <= (+x*x))
enlageGrid();
if ((movesLeft >0)&(!win)){
let y = coolPosition[0];
let z = coolPosition[1];
//console.log(y+' '+z);
while (fullGrid[y][z] != EMPTY)
{
y = Math.floor(Math.random() * x);
z = Math.floor(Math.random() * x);
}
Click(y, z);
}
}
//Увеличение поля
if (win != true)
if ((+(movesLeft*2)) <= (+x*x))
enlageGrid();
}

function Click (row, col){
if (movesLeft<=0)
{
if (!win)
alert('Победила дружба');
return;
}
if (switcherX){
renderSymbolInCell(CROSS, row, col, '#333');
switcherX = false;
fullGrid[row][col] = CROSS;
checkWin(row, col, CROSS)
}
else{
renderSymbolInCell(ZERO, row, col), '#333';
switcherX = true;
fullGrid[row][col] = ZERO;
checkWin(row, col, ZERO)
}
movesLeft=movesLeft-1;
if (movesLeft<=0)
{
if (!win)
alert('Победила дружба');
return;
}
}

function checkWin(row, col, player){
let amount = 0;
let potentialPosition =[]
//Проверка на полную горизонталь
for (i=0; i<x; i++)
{
if (fullGrid[row][i]==EMPTY)
potentialPosition = [row, i]
if(fullGrid[row][i]==player)
amount=amount+1;
//else break;
}
if (amount==x)
{
win = true;
addColor(row, 'horizontal', player);
alert('Победа игрока '+player);
return;
}
if ((player == ZERO)&(amount==x-1))
{
console.log(potentialPosition);
coolPosition = [potentialPosition[0], potentialPosition[1]];
}
amount=0;

/* Пользоваться методом для размещения символа в клетке так:
renderSymbolInCell(ZERO, row, col);
*/
//Проверка на полную вертикаль
for (i=0; i<x; i++)
{
if (fullGrid[i][col]==EMPTY)
potentialPosition = [i, col]
if(fullGrid[i][col]==player)
amount=amount+1;
//else break;
}
if (amount==x)
{
win = true;
addColor(col, 'vertical', player);
alert('Победа игрока '+player);
return;
}
if ((player == ZERO)&(amount==x-1))
{
console.log(potentialPosition);
coolPosition = [potentialPosition[0], potentialPosition[1]];
}
amount=0;
//Проверка на полную главную диагональ
if (row == col)
{
for (i=0; i<x; i++)
{
if (fullGrid[i][i]==EMPTY)
potentialPosition = [i, i]
if(fullGrid[i][i]==player)
amount=amount+1;
//else break;
}
if (amount==x)
{
win = true;
addColor(row, 'mainDiagonal', player);
alert('Победа игрока '+player);
return;
}
if ((player == ZERO)&(amount==x-1))
{
console.log(potentialPosition);
coolPosition = [potentialPosition[0], potentialPosition[1]];
}
amount=0;
}
//Проверка на полную побочную диагональ
if (row+col==x-1)
{
for (i=0; i<x; i++)
{
if (fullGrid[i][x-1-i]==EMPTY)
potentialPosition = [i, x-1-i]
if(fullGrid[i][x-1-i]==player)
amount=amount+1;
//else break;
}
if (amount==x)
{
win = true;
addColor(row, 'secondDiagonal', player);
alert('Победа игрока '+player);
return;
}
if ((player == ZERO)&(amount==x-1))
{
console.log(potentialPosition);
coolPosition = [potentialPosition[0], potentialPosition[1]];
}
amount=0;
}
}
function addColor(number, type, player)
{
switch (type){
case 'horizontal':
for (let i=0; i<x; i++)
renderSymbolInCell(player, number, i, 'red')
break;
case 'vertical':
for (let i=0; i<x; i++)
renderSymbolInCell(player, i, number, 'red')
break;
case 'mainDiagonal':
for (let i=0; i<x; i++)
renderSymbolInCell(player, i, i, 'red')
break;
case 'secondDiagonal':
for (let i=0; i<x; i++)
renderSymbolInCell(player, i, x-1-i, 'red')
break;
}
}

function renderSymbolInCell (symbol, row, col, color = '#333') {
const targetCell = findCell(row, col);
function enlageGrid() {
console.log('ENLARGE!!!')
let newFullGrid = [];
x = (+x)+2;
movesLeft = x*x - (x-2)*(x-2)/2;

for(let i=0; i<x; i++)
{
newFullGrid[i]=[];
for(let j=0; j<x; j++)
newFullGrid[i][j]=EMPTY;
}

for(let i=0; i<x-2; i++)
{
for(let j=0; j<x-2; j++)
newFullGrid[i+1][j+1]=fullGrid[i][j];
}

for(let i=0; i<x; i++)
{
fullGrid[i]=[];
for(let j=0; j<x; j++){
fullGrid[i][j]=newFullGrid[i][j];
}
}
renderGrid(x);
}

function renderSymbolInCell (symbol, row, col, color) {
const targetCell = findCell(row, col);
targetCell.textContent = symbol;
targetCell.style.color = color;
}
Expand All @@ -55,6 +264,9 @@ function addResetListener () {

function resetClickHandler () {
console.log('reset!');
switcherX = true;
win = false;
startGame();
}


Expand Down