Создание судоку на веб-странице может показаться сложной задачей, но с использованием CSS, HTML и немного JavaScript, это становится увлекательным процессом. В этой статье мы рассмотрим, как создать судоку с нуля, используя технологии веб-разработки. Мы обсудим алгоритмы генерации головоломок, методы решения и особенности оформления с помощью CSS.
Что за игра
Судоку — это популярная логическая головоломка, где задача заключается в заполнении сетки 9×9 цифрами так, чтобы в каждом ряду, каждом столбце и каждом 3×3 подблоке не повторялись числа от 1 до 9. В веб-разработке создание судоку включает несколько этапов: создание структуры HTML, оформление с использованием CSS и логика игры на JavaScript.

- ПОКАЖЕМ, КАК РАЗВЕРНУТЬ МОДЕЛЬ DEEPSEEK R1 ПРЯМО НА СВОЁМ КОМПЬЮТЕРЕ
- Где и как применять? Потестируем модель после установки на разных задачах
- Как дообучить модель под себя?
Создание структуры HTML
Первый шаг — создание базовой структуры HTML для судоку. Для этого нам потребуется создать таблицу 9×9.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Судоку</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="sudoku-container">
<table class="sudoku-grid">
<!-- Таблица 9x9 -->
<!-- Вставляем HTML-код для создания таблицы -->
<tbody>
<!-- Создаем строки и ячейки таблицы -->
<script>
document.addEventListener('DOMContentLoaded', () => {
const sudokuGrid = document.querySelector('.sudoku-grid');
for (let i = 0; i < 9; i++) {
const row = document.createElement('tr');
for (let j = 0; j < 9; j++) {
const cell = document.createElement('td');
if (i % 3 === 0) cell.classList.add('bold-border-top');
if (j % 3 === 0) cell.classList.add('bold-border-left');
row.appendChild(cell);
}
sudokuGrid.appendChild(row);
}
});
</script>
</tbody>
</table>
<button id="generate">Сгенерировать Судоку</button>
<button id="solve">Решить Судоку</button>
</div>
<script src="script.js"></script>
</body>
</html>
Оформление с использованием CSS
CSS позволяет нам создать красивую и удобную таблицу для судоку. Мы используем grid layout для равномерного распределения ячеек.
/* styles.css */
body {
margin: 0;
font-family: Arial, sans-serif;
background-color: #f9f9f9;
}
.sudoku-container {
display: flex;
flex-direction: column;
align-items: center;
padding-top: 50px;
}
.sudoku-grid {
border-collapse: collapse;
}
.sudoku-grid td {
width: 40px;
height: 40px;
border: 1px solid #000;
text-align: center;
font-size: 20px;
vertical-align: middle;
}
.sudoku-grid .bold-border-top {
border-top-width: 2px;
}
.sudoku-grid .bold-border-left {
border-left-width: 2px;
}
button {
margin: 10px;
padding: 10px 20px;
font-size: 16px;
cursor: pointer;
}
Логика игры на JavaScript
Теперь добавим JavaScript для генерации и решения судоку. Сначала создадим генератор головоломок.
// script.js
document.addEventListener('DOMContentLoaded', () => {
const generateButton = document.getElementById('generate');
const solveButton = document.getElementById('solve');
const sudokuGrid = document.querySelector('.sudoku-grid');
generateButton.addEventListener('click', () => generateSudoku(sudokuGrid));
solveButton.addEventListener('click', () => {
const grid = getGridFromDOM(sudokuGrid);
if (solveSudoku(grid)) {
renderGrid(sudokuGrid, grid);
} else {
alert('Невозможно решить данное судоку.');
}
});
});
function generateSudoku(sudokuGrid) {
let grid = [...Array(9)].map(e => Array(9).fill(0));
fillGrid(grid);
removeNumbers(grid);
renderGrid(sudokuGrid, grid);
}
function fillGrid(grid) {
// Функция для заполнения сетки допустимыми числами
for (let i = 0; i < 9; i++) {
for (let j = 0; j < 9; j++) {
let num = Math.floor(Math.random() * 9) + 1;
while (!isValid(grid, i, j, num)) {
num = Math.floor(Math.random() * 9) + 1;
}
grid[i][j] = num;
}
}
}
function removeNumbers(grid) {
let attempts = 5;
while (attempts > 0) {
const row = Math.floor(Math.random() * 9);
const col = Math.floor(Math.random() * 9);
if (grid[row][col] !== 0) {
const backup = grid[row][col];
grid[row][col] = 0;
let gridCopy = grid.map(row => row.slice());
if (!solveSudoku(gridCopy)) {
grid[row][col] = backup;
attempts--;
}
}
}
}
function renderGrid(sudokuGrid, grid) {
const cells = sudokuGrid.querySelectorAll('td');
cells.forEach((cell, index) => {
const row = Math.floor(index / 9);
const col = index % 9;
cell.textContent = grid[row][col] !== 0 ? grid[row][col] : '';
});
}
function solveSudoku(grid) {
const emptyCell = findEmptyCell(grid);
if (!emptyCell) return true;
const [row, col] = emptyCell;
for (let num = 1; num <= 9; num++) {
if (isValid(grid, row, col, num)) {
grid[row][col] = num;
if (solveSudoku(grid)) {
return true;
}
grid[row][col] = 0;
}
}
return false;
}
function findEmptyCell(grid) {
for (let i = 0; i < 9; i++) {
for (let j = 0; j < 9; j++) {
if (grid[i][j] === 0) {
return [i, j];
}
}
}
return null;
}
function isValid(grid, row, col, num) {
for (let i = 0; i < 9; i++) {
if (grid[row][i] === num || grid[i][col] === num) {
return false;
}
const boxRow = 3 * Math.floor(row / 3) + Math.floor(i / 3);
const boxCol = 3 * Math.floor(col / 3) + (i % 3);
if (grid[boxRow][boxCol] === num) {
return false;
}
}
return true;
}
function getGridFromDOM(sudokuGrid) {
const grid = [...Array(9)].map(e => Array(9).fill(0));
const cells = sudokuGrid.querySelectorAll('td');
cells.forEach((cell, index) => {
const row = Math.floor(index / 9);
const col = index % 9;
grid[row][col] = cell.textContent ? parseInt(cell.textContent) : 0;
});
return grid;
}
Заключение
Создание судоку с использованием HTML, CSS и JavaScript — это отличный способ улучшить свои навыки веб-разработки. Вы научитесь создавать сложные макеты с помощью CSS grid, а также поймете основы алгоритмов генерации и решения головоломок. Судоку может стать отличным проектом для портфолио, демонстрирующим ваши способности в области веб-разработки.
- Освой Perplexity и узнай, как пользоваться функционалом остальных ИИ в одном
- УЧАСТВОВАТЬ ЗА 0 РУБ.
- Расскажем, как получить подписку (240$) бесплатно
- ПОКАЖЕМ, КАК РАЗВЕРНУТЬ МОДЕЛЬ DEEPSEEK R1 ПРЯМО НА СВОЁМ КОМПЬЮТЕРЕ