Капитан Къераку сделал это для нас:)
Наслаждаемся!
[html]<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Судоку - За Отчизну!</title>
    <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap" rel="stylesheet">
    <style>
        body {
            margin: 0;
            overflow: hidden; /* Prevent scrollbar due to pseudo-elements */
        }

        .bleach-sudoku-container {
            all: initial;
            font-family: 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            min-height: 100vh;
            /* Советский фон: темно-серый, почти как бетон или военная форма */
            background: #3c3c3c; /* Темно-серый */
            color: #e0e0e0; /* Светлый текст */
            padding: 20px;
            box-sizing: border-box;
            position: relative;
            overflow: hidden;
        }

        .bleach-sudoku-container::before {
            content: "";
            position: absolute;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
            /* Менее выраженные градиенты или их отсутствие */
            background-image: none; /* Убираем яркие радиальные градиенты */
            pointer-events: none;
        }

        .bleach-sudoku-title {
            all: initial;
            font-family: 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
            font-size: 2.8rem;
            font-weight: 700;
            /* Цвет названия: золотистый или яркий красный */
            color: #ffd700; /* Золотой */
            text-shadow: 0 0 10px rgba(255, 215, 0, 0.6), 0 0 20px rgba(255, 215, 0, 0.3);
            margin-bottom: 15px;
            letter-spacing: 3px;
            z-index: 10;
            position: relative;
            text-align: center;
        }

        .bleach-sudoku-subtitle {
            all: initial;
            font-family: 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
            font-size: 1rem;
            /* Приглушенный светло-желтый или белый */
            color: rgba(255, 255, 255, 0.8);
            margin-bottom: 25px;
            text-align: center;
            letter-spacing: 1px;
            z-index: 10;
            position: relative;
        }

        .bleach-sudoku-board {
            all: initial;
            display: grid;
            grid-template-columns: repeat(9, 52px);
            grid-template-rows: repeat(9, 52px);
            gap: 1px;
            /* Строгий цвет фона доски */
            background: #4a4a4a; /* Темно-серый */
            border: 6px solid #4a4a4a; /* Граница в тон фона */
            box-shadow:
                0 0 20px rgba(0, 0, 0, 0.5),
                inset 0 0 15px rgba(0, 0, 0, 0.6);
            z-index: 10;
            position: relative;
            margin-bottom: 25px;
        }

        .bleach-sudoku-cell {
            all: initial;
            width: 52px;
            height: 52px;
            /* Цвет ячейки: темный, "рабочий" */
            background: #2b2b2b; /* Очень темно-серый */
            border: 1px solid rgba(100, 100, 100, 0.4); /* Мягкая серая граница */
            display: flex;
            align-items: center;
            justify-content: center;
            font-family: 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
            font-size: 1.6rem;
            font-weight: 400;
            color: #e0e0e0; /* Светлый текст */
            cursor: pointer;
            transition: all 0.3s ease;
            box-sizing: border-box;
            position: relative;
        }

        .bleach-sudoku-cell:hover {
            /* Менее яркая подсветка при наведении */
            background: #404040; /* Средне-серый */
            box-shadow: 0 0 8px rgba(100, 100, 100, 0.6);
        }

        .bleach-sudoku-cell.bleach-given {
            /* Заданные числа: более строгий цвет */
            background: #353535; /* Чуть светлее фона ячеек */
            color: #ffd700; /* Золотой или светло-желтый */
            text-shadow: 0 0 5px rgba(255, 215, 0, 0.4);
            cursor: default;
        }

        .bleach-sudoku-cell.bleach-selected {
            /* Выделенная ячейка: акцент красного */
            background: rgba(178, 34, 34, 0.4); /* Огненно-красный */
            box-shadow: 0 0 15px rgba(178, 34, 34, 0.8);
            border: 2px solid #b22222; /* Красная граница */
        }

        .bleach-sudoku-cell.bleach-error {
            /* Ошибка: все еще красный, но менее "кричащий" */
            background: rgba(139, 0, 0, 0.6); /* Темно-красный */
            animation: bleach-error-pulse 0.6s ease-in-out;
        }

        .bleach-sudoku-cell.bleach-hint {
            /* Подсказка: зеленый, но приглушенный */
            background: rgba(34, 139, 34, 0.5); /* Лесной зеленый */
            animation: bleach-hint-glow 1s ease-in-out;
        }

        .bleach-sudoku-cell.bleach-highlight-row,
        .bleach-sudoku-cell.bleach-highlight-col,
        .bleach-sudoku-cell.bleach-highlight-box {
            /* Подсветка: приглушенный серый */
            background: rgba(70, 70, 70, 0.3);
        }

        .bleach-sudoku-cell.bleach-highlight-duplicate {
            /* Дубликаты: оранжевый, но темнее */
            background: rgba(184, 134, 11, 0.5); /* Темный золотисто-оранжевый */
            box-shadow: 0 0 8px rgba(184, 134, 11, 0.6);
        }

        /* Толстые границы для 3x3 блоков */
        .bleach-sudoku-cell:nth-child(3n):not(:nth-child(9n)) {
            border-right: 3px solid #4a4a4a;
        }

        .bleach-sudoku-cell:nth-child(n+19):nth-child(-n+27),
        .bleach-sudoku-cell:nth-child(n+46):nth-child(-n+54) {
            border-bottom: 3px solid #4a4a4a;
        }

        @keyframes bleach-error-pulse {
            0%, 100% { transform: scale(1); box-shadow: 0 0 10px rgba(139, 0, 0, 0.8); }
            50% { transform: scale(1.08); box-shadow: 0 0 20px rgba(139, 0, 0, 1); }
        }

        @keyframes bleach-hint-glow {
            0%, 100% { box-shadow: 0 0 8px rgba(34, 139, 34, 0.6); }
            50% { box-shadow: 0 0 20px rgba(34, 139, 34, 1); }
        }

        .bleach-sudoku-controls {
            all: initial;
            display: flex;
            gap: 15px;
            margin-bottom: 20px;
            z-index: 10;
            position: relative;
            flex-wrap: wrap;
            justify-content: center;
        }

        .bleach-sudoku-btn {
            all: initial;
            font-family: 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
            /* Кнопки: строгие, с легким градиентом красного или серого */
            background: linear-gradient(45deg, #8b0000, #b22222); /* От темно-красного до красного */
            color: #e0e0e0;
            border: none;
            padding: 12px 24px;
            border-radius: 5px; /* Менее скругленные кнопки */
            cursor: pointer;
            font-size: 0.95rem;
            font-weight: 400;
            transition: all 0.3s ease;
            box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3);
            letter-spacing: 0.5px;
        }

        .bleach-sudoku-btn:hover:not(:disabled) {
            transform: translateY(-2px); /* Меньший эффект при наведении */
            box-shadow: 0 6px 15px rgba(0, 0, 0, 0.5);
            background: linear-gradient(45deg, #b22222, #cd5c5c);
        }

        .bleach-sudoku-btn:disabled {
            opacity: 0.5;
            cursor: not-allowed;
            background: linear-gradient(45deg, #505050, #707070); /* Серые отключенные кнопки */
        }

        .bleach-sudoku-info {
            all: initial;
            font-family: 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
            display: flex;
            justify-content: space-between;
            align-items: center;
            width: 500px;
            max-width: 90vw;
            color: rgba(255, 255, 255, 0.9);
            z-index: 10;
            position: relative;
            margin-bottom: 15px;
        }

        .bleach-sudoku-timer, .bleach-sudoku-hint-timer {
            all: initial;
            font-family: 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
            font-size: 1.3rem;
            /* Цвет таймера: золотой или светло-желтый */
            color: #ffd700;
            font-weight: 400;
            text-shadow: 0 0 8px rgba(255, 215, 0, 0.6);
        }

        .bleach-sudoku-controls-info {
            all: initial;
            font-family: 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
            text-align: center;
            color: rgba(255, 255, 255, 0.7);
            font-size: 0.9rem;
            z-index: 10;
            position: relative;
            line-height: 1.4;
        }

        .bleach-victory {
            all: initial;
            font-family: 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
            position: fixed;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            /* Фон окна победы: темный, с красной или золотой рамкой */
            background: rgba(43, 43, 43, 0.95);
            color: #e0e0e0;
            padding: 50px;
            border-radius: 10px; /* Менее скругленные углы */
            text-align: center;
            border: 4px solid #b22222; /* Красная рамка */
            box-shadow: 0 0 40px rgba(178, 34, 34, 0.7);
            z-index: 100;
            display: none;
        }

        .bleach-victory h2 {
            all: initial;
            font-family: 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
            font-size: 2.2rem;
            color: #ffd700; /* Золотой заголовок победы */
            margin-bottom: 20px;
            text-shadow: 0 0 10px rgba(255, 215, 0, 0.7);
            font-weight: 300;
            letter-spacing: 2px;
        }

        .bleach-victory p {
            all: initial;
            font-family: 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
            color: rgba(255, 255, 255, 0.9);
            margin-bottom: 10px;
            font-size: 1.1rem;
            line-height: 1.5;
        }

        .bleach-copyright {
            all: initial;
            font-family: 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
            font-size: 0.8rem;
            color: rgba(255, 255, 255, 0.5);
            margin-top: 20px;
            z-index: 10;
            position: relative;
        }
    </style>
</head>
<body>
    <div class="bleach-sudoku-container">
        <h1 class="bleach-sudoku-title">Судоку - Наша Цель!</h1>
        <div class="bleach-sudoku-subtitle">Примите вызов и укрепите дисциплину!</div>
       
        <div class="bleach-sudoku-info">
            <div>Время борьбы: <span class="bleach-sudoku-timer" id="bleachTimer">00:00</span></div>
            <div>Помощь товарища: <span class="bleach-sudoku-hint-timer" id="bleachHintTimer">готова</span></div>
        </div>
       
        <div class="bleach-sudoku-board" id="bleachSudokuBoard"></div>
       
        <div class="bleach-sudoku-controls">
            <button class="bleach-sudoku-btn" onclick="bleachNewGame()">Новый бой!</button>
            <button class="bleach-sudoku-btn" id="bleachHintBtn" onclick="bleachGetHint()">Взаимопомощь</button>
            <button class="bleach-sudoku-btn" onclick="bleachSolve()">Проверенное решение</button>
            <button class="bleach-sudoku-btn" onclick="bleachClear()">Очистить поле</button>
        </div>
       
        <div class="bleach-sudoku-controls-info">
            Выберите ячейку и введите цифру 1-9<br>
            0 или Delete для очистки • Порядок в строках и столбцах
        </div>

        <div class="bleach-victory" id="bleachVictory">
            <h2>Победа Наша!</h2>
            <p>Вы завершили задание! Родина гордится вами!</p>
            <p>Время достижения: <span id="bleachFinalTimer"></span></p>
            <button class="bleach-sudoku-btn" onclick="bleachNewGame(); document.getElementById('bleachVictory').style.display='none';">Новое задание</button>
        </div>
        <div class="bleach-copyright">Построено Zero_Chan для народа © 2025</div>
    </div>

    <script>
        (function() {
            let bleachSudokuGrid = [];
            let bleachSolution = [];
            let bleachSelectedCell = null;
            let bleachStartTime = Date.now();
            let bleachTimerInterval = null;
            let bleachHintCooldown = 0;
            let bleachHintInterval = null;
            let bleachOriginalPuzzle = [];

            const bleachBoard = document.getElementById('bleachSudokuBoard');
            const bleachTimerElement = document.getElementById('bleachTimer');
            const bleachHintTimerElement = document.getElementById('bleachHintTimer');
            const bleachHintBtn = document.getElementById('bleachHintBtn');
            const bleachVictoryElement = document.getElementById('bleachVictory');

            function bleachInitGrid() {
                bleachSudokuGrid = Array(9).fill().map(() => Array(9).fill(0));
                bleachSolution = Array(9).fill().map(() => Array(9).fill(0));
                bleachOriginalPuzzle = Array(9).fill().map(() => Array(9).fill(0));
            }

            function bleachIsValid(grid, row, col, num) {
                // Check row
                for (let x = 0; x < 9; x++) {
                    if (grid[row][x] === num) return false;
                }
               
                // Check column
                for (let x = 0; x < 9; x++) {
                    if (grid[x][col] === num) return false;
                }
               
                // Check 3x3 box
                const boxRow = Math.floor(row / 3) * 3;
                const boxCol = Math.floor(col / 3) * 3;
                for (let i = 0; i < 3; i++) {
                    for (let j = 0; j < 3; j++) {
                        if (grid[boxRow + i][boxCol + j] === num) return false;
                    }
                }
               
                return true;
            }

            function bleachSolveSudoku(grid) {
                for (let row = 0; row < 9; row++) {
                    for (let col = 0; col < 9; col++) {
                        if (grid[row][col] === 0) {
                            for (let num = 1; num <= 9; num++) {
                                if (bleachIsValid(grid, row, col, num)) {
                                    grid[row][col] = num;
                                    if (bleachSolveSudoku(grid)) {
                                        return true;
                                    }
                                    grid[row][col] = 0;
                                }
                            }
                            return false;
                        }
                    }
                }
                return true;
            }

            function bleachGeneratePuzzle() {
                bleachInitGrid();
               
                // Fill diagonal 3x3 boxes first
                for (let box = 0; box < 9; box += 3) {
                    const nums = [1,2,3,4,5,6,7,8,9];
                    for (let i = 0; i < 3; i++) {
                        for (let j = 0; j < 3; j++) {
                            const randomIndex = Math.floor(Math.random() * nums.length);
                            bleachSolution[box + i][box + j] = nums[randomIndex];
                            nums.splice(randomIndex, 1);
                        }
                    }
                }
               
                // Solve the rest
                bleachSolveSudoku(bleachSolution);
               
                // Create puzzle by removing numbers
                for (let row = 0; row < 9; row++) {
                    for (let col = 0; col < 9; col++) {
                        bleachSudokuGrid[row][col] = bleachSolution[row][col];
                        bleachOriginalPuzzle[row][col] = bleachSolution[row][col];
                    }
                }
               
                // Remove 40-50 numbers for medium difficulty
                const cellsToRemove = 45;
                let removed = 0;
                while (removed < cellsToRemove) {
                    const row = Math.floor(Math.random() * 9);
                    const col = Math.floor(Math.random() * 9);
                    if (bleachSudokuGrid[row][col] !== 0) {
                        bleachSudokuGrid[row][col] = 0;
                        bleachOriginalPuzzle[row][col] = 0;
                        removed++;
                    }
                }
            }

            function bleachHighlightRelated(selectedRow, selectedCol) {
                const cells = bleachBoard.children;
               
                // Clear previous highlights
                for (let cell of cells) {
                    cell.classList.remove('bleach-highlight-row', 'bleach-highlight-col', 'bleach-highlight-box', 'bleach-highlight-duplicate');
                }
               
                if (selectedRow === -1 || selectedCol === -1) return;
               
                const selectedValue = bleachSudokuGrid[selectedRow][selectedCol];
               
                for (let row = 0; row < 9; row++) {
                    for (let col = 0; col < 9; col++) {
                        const index = row * 9 + col;
                        const cell = cells[index];
                       
                        // Highlight row
                        if (row === selectedRow) {
                            cell.classList.add('bleach-highlight-row');
                        }
                       
                        // Highlight column
                        if (col === selectedCol) {
                            cell.classList.add('bleach-highlight-col');
                        }
                       
                        // Highlight 3x3 box
                        const boxRow = Math.floor(selectedRow / 3);
                        const boxCol = Math.floor(selectedCol / 3);
                        const cellBoxRow = Math.floor(row / 3);
                        const cellBoxCol = Math.floor(col / 3);
                       
                        if (boxRow === cellBoxRow && boxCol === cellBoxCol) {
                            cell.classList.add('bleach-highlight-box');
                        }
                       
                        // Highlight duplicates
                        if (selectedValue !== 0 && bleachSudokuGrid[row][col] === selectedValue && !(row === selectedRow && col === selectedCol)) {
                            cell.classList.add('bleach-highlight-duplicate');
                        }
                    }
                }
            }

            function bleachRenderBoard() {
                bleachBoard.innerHTML = '';
                for (let row = 0; row < 9; row++) {
                    for (let col = 0; col < 9; col++) {
                        const cell = document.createElement('div');
                        cell.className = 'bleach-sudoku-cell';
                        cell.textContent = bleachSudokuGrid[row][col] || '';
                       
                        if (bleachOriginalPuzzle[row][col] !== 0) {
                            cell.classList.add('bleach-given');
                        }
                       
                        cell.addEventListener('click', () => {
                            if (bleachSelectedCell) {
                                bleachSelectedCell.classList.remove('bleach-selected');
                            }
                            bleachSelectedCell = cell;
                            cell.classList.add('bleach-selected');
                            bleachSelectedCell.dataset.row = row;
                            bleachSelectedCell.dataset.col = col;
                           
                            bleachHighlightRelated(row, col);
                        });
                       
                        bleachBoard.appendChild(cell);
                    }
                }
            }

            function bleachUpdateTimer() {
                const elapsed = Math.floor((Date.now() - bleachStartTime) / 1000);
                const minutes = Math.floor(elapsed / 60).toString().padStart(2, '0');
                const seconds = (elapsed % 60).toString().padStart(2, '0');
                bleachTimerElement.textContent = `${minutes}:${seconds}`;
            }

            function bleachUpdateHintTimer() {
                if (bleachHintCooldown > 0) {
                    bleachHintCooldown--;
                    bleachHintTimerElement.textContent = `${bleachHintCooldown}с`;
                    bleachHintBtn.disabled = true;
                } else {
                    bleachHintTimerElement.textContent = 'готова';
                    bleachHintBtn.disabled = false;
                }
            }

            function bleachCheckWin() {
                for (let row = 0; row < 9; row++) {
                    for (let col = 0; col < 9; col++) {
                        if (bleachSudokuGrid[row][col] !== bleachSolution[row][col]) {
                            return false;
                        }
                    }
                }
               
                clearInterval(bleachTimerInterval);
                clearInterval(bleachHintInterval);
                document.getElementById('bleachFinalTimer').textContent = bleachTimerElement.textContent;
                bleachVictoryElement.style.display = 'block';
                return true;
            }

            function bleachHandleKeyPress(e) {
                if (!bleachSelectedCell) return;
               
                const row = parseInt(bleachSelectedCell.dataset.row);
                const col = parseInt(bleachSelectedCell.dataset.col);
               
                // Don't modify given numbers
                if (bleachOriginalPuzzle[row][col] !== 0) {
                    return;
                }
               
                const key = e.key;
               
                if (key >= '1' && key <= '9') {
                    const num = parseInt(key);
                    if (bleachIsValid(bleachSudokuGrid, row, col, num)) {
                        bleachSudokuGrid[row][col] = num;
                        bleachSelectedCell.textContent = num;
                        bleachSelectedCell.classList.remove('bleach-error');
                        bleachHighlightRelated(row, col);
                        bleachCheckWin();
                    } else {
                        bleachSelectedCell.classList.add('bleach-error');
                        setTimeout(() => {
                            bleachSelectedCell.classList.remove('bleach-error');
                        }, 600);
                    }
                } else if (key === '0' || key === 'Delete' || key === 'Backspace') {
                    bleachSudokuGrid[row][col] = 0;
                    bleachSelectedCell.textContent = '';
                    bleachSelectedCell.classList.remove('bleach-error');
                    bleachHighlightRelated(row, col);
                }
            }

            window.bleachNewGame = function() {
                bleachGeneratePuzzle();
                bleachRenderBoard();
                bleachStartTime = Date.now();
                bleachHintCooldown = 0;
               
                clearInterval(bleachTimerInterval);
                clearInterval(bleachHintInterval);
               
                bleachTimerInterval = setInterval(bleachUpdateTimer, 1000);
                bleachHintInterval = setInterval(bleachUpdateHintTimer, 1000);
               
                bleachSelectedCell = null;
                bleachHighlightRelated(-1, -1);
                bleachUpdateHintTimer();
                bleachVictoryElement.style.display = 'none'; // Hide victory message on new game
            };

            window.bleachGetHint = function() {
                if (bleachHintCooldown > 0) return;
               
                // Find empty cells
                const emptyCells = [];
                for (let row = 0; row < 9; row++) {
                    for (let col = 0; col < 9; col++) {
                        if (bleachSudokuGrid[row][col] === 0) {
                            emptyCells.push({row, col});
                        }
                    }
                }
               
                if (emptyCells.length === 0) return;
               
                // Pick random empty cell and fill it
                const randomCell = emptyCells[Math.floor(Math.random() * emptyCells.length)];
                const {row, col} = randomCell;
               
                bleachSudokuGrid[row][col] = bleachSolution[row][col];
               
                // Update display
                const cellIndex = row * 9 + col;
                const cellElement = bleachBoard.children[cellIndex];
                cellElement.textContent = bleachSolution[row][col];
                cellElement.classList.add('bleach-hint');
               
                setTimeout(() => {
                    cellElement.classList.remove('bleach-hint');
                }, 1000);
               
                // Start cooldown
                bleachHintCooldown = 60;
                bleachUpdateHintTimer();
               
                bleachCheckWin();
            };

            window.bleachSolve = function() {
                for (let row = 0; row < 9; row++) {
                    for (let col = 0; col < 9; col++) {
                        bleachSudokuGrid[row][col] = bleachSolution[row][col];
                    }
                }
                bleachRenderBoard();
                bleachCheckWin();
            };

            window.bleachClear = function() {
                for (let row = 0; row < 9; row++) {
                    for (let col = 0; col < 9; col++) {
                        if (bleachOriginalPuzzle[row][col] === 0) {
                            bleachSudokuGrid[row][col] = 0;
                        }
                    }
                }
                bleachRenderBoard();
                if (bleachSelectedCell) {
                    const row = parseInt(bleachSelectedCell.dataset.row);
                    const col = parseInt(bleachSelectedCell.dataset.col);
                    bleachHighlightRelated(row, col);
                }
            };

            document.addEventListener('keydown', bleachHandleKeyPress);

            // Initialize game
            bleachNewGame();
        })();
    </script>
</body>
</html>[/html]