Тест на удачу

у кого то % побед есть выше 40% после 100+ попыток?))) надо создать текстовый документ, вставить код, сохранить, и изменить окончание документа на html, и запустить в браузере

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
    <title>Игра: 3 ящика — найди приз | Смена выбора</title>
    <style>
        * {
            box-sizing: border-box;
            user-select: none;
        }

        body {
            background: linear-gradient(145deg, #1a472a 0%, #0e2a1a 100%);
            min-height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            font-family: 'Segoe UI', 'Poppins', 'Roboto', system-ui, sans-serif;
            margin: 0;
            padding: 20px;
        }

        /* главная карточка игры */
        .game-container {
            max-width: 1100px;
            width: 100%;
            background: rgba(255, 248, 225, 0.9);
            backdrop-filter: blur(3px);
            border-radius: 4rem 2rem 4rem 2rem;
            box-shadow: 0 25px 45px rgba(0, 0, 0, 0.5), inset 0 1px 2px rgba(255,255,240,0.6);
            padding: 1.8rem 1.5rem 2rem;
            transition: all 0.2s;
        }

        h1 {
            text-align: center;
            font-size: 2rem;
            margin: 0 0 0.25rem 0;
            color: #f7b42c;
            text-shadow: 3px 3px 0 #7a2e00;
            letter-spacing: 2px;
            word-break: keep-all;
        }

        .sub {
            text-align: center;
            font-weight: 500;
            color: #2c3e2f;
            background: #fef1cf;
            display: inline-block;
            width: auto;
            margin: 0 auto 1.5rem;
            padding: 0.3rem 1.6rem;
            border-radius: 40px;
            font-size: 1rem;
            box-shadow: inset 0 0 3px #b87c2e, 0 2px 5px rgba(0,0,0,0.1);
        }

        /* статистика — две кнопки-карточки */
        .stats-panel {
            display: flex;
            justify-content: center;
            gap: 2rem;
            margin-bottom: 2rem;
            flex-wrap: wrap;
        }

        .stat-card {
            background: #2d2b26;
            border-radius: 2rem;
            padding: 0.8rem 1.8rem;
            min-width: 160px;
            text-align: center;
            box-shadow: 0 8px 0 #0f0e0c;
            color: #f9e2a1;
        }

        .stat-card span:first-child {
            font-size: 1.2rem;
            font-weight: 600;
            letter-spacing: 1px;
            display: block;
        }

        .stat-number {
            font-size: 2.8rem;
            font-weight: 800;
            line-height: 1;
            color: #ffd966;
            text-shadow: 0 2px 0 #5a3e1a;
            font-family: monospace;
        }

        .accuracy {
            font-size: 1rem;
            background: #00000066;
            border-radius: 40px;
            padding: 0.2rem 0.8rem;
            display: inline-block;
            margin-top: 6px;
        }

        /* блок ящиков — сетка */
        .boxes-area {
            display: flex;
            flex-wrap: wrap;
            justify-content: center;
            gap: 1.8rem;
            margin: 2rem 0 1.5rem;
        }

        /* карточка ящика */
        .box {
            background: #d9ae6c;
            background-image: radial-gradient(circle at 35% 25%, rgba(255,215,140,0.6) 2%, transparent 2.5%);
            background-size: 20px 20px;
            width: 160px;
            height: 170px;
            border-radius: 24px;
            cursor: pointer;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            transition: 0.2s ease;
            box-shadow: 0 12px 0 #7a4a1e;
            border: 1px solid #ffeaac;
            position: relative;
        }

        .box:hover:not(.disabled-box) {
            transform: translateY(-6px);
            box-shadow: 0 16px 0 #7a4a1e;
            background-color: #e7bc7c;
        }

        /* выбранный ящик до подтверждения */
        .box.selected {
            background: #f5cd94;
            box-shadow: 0 0 0 4px #ffdd88, 0 12px 0 #7a4a1e;
            transform: scale(0.98);
        }

        /* блокировка после выбора финала / открытия */
        .disabled-box {
            cursor: default;
            opacity: 0.75;
            filter: grayscale(0.1);
            transform: none;
        }

        .box-icon {
            font-size: 4rem;
            filter: drop-shadow(4px 6px 0 rgba(0,0,0,0.3));
            transition: 0.1s;
        }

        .box-label {
            font-size: 1.5rem;
            font-weight: bold;
            background: #492d14;
            color: #ffeaac;
            padding: 0.2rem 1rem;
            border-radius: 40px;
            margin-top: 8px;
            font-family: monospace;
        }

        /* отображение приза при открытии */
        .box.revealed-prize {
            background: radial-gradient(circle at 30% 20%, #ffcf4a, #c27e2e);
            box-shadow: 0 6px 0 #5a3a18;
        }

        .prize-badge {
            font-size: 3rem;
            display: block;
            margin-top: 5px;
        }

        /* кнопки управления */
        .action-buttons {
            display: flex;
            justify-content: center;
            gap: 1.5rem;
            flex-wrap: wrap;
            margin: 20px 0 20px;
        }

        button {
            font-size: 1.2rem;
            font-weight: bold;
            border: none;
            background: #f5bc70;
            padding: 0.8rem 1.9rem;
            border-radius: 60px;
            cursor: pointer;
            transition: 0.1s linear;
            box-shadow: 0 5px 0 #8b5a2b;
            color: #2c1a0b;
            font-family: inherit;
        }

        button:active {
            transform: translateY(2px);
            box-shadow: 0 2px 0 #8b5a2b;
        }

        button:disabled {
            opacity: 0.55;
            transform: none;
            cursor: not-allowed;
            filter: grayscale(0.1);
        }

        .reset-btn {
            background: #3c6e47;
            color: #ffefc0;
            box-shadow: 0 5px 0 #1c3a1e;
        }

        .game-message {
            background: #1f2a17c9;
            backdrop-filter: blur(8px);
            border-radius: 60px;
            text-align: center;
            padding: 12px;
            margin-top: 20px;
            font-weight: bold;
            font-size: 1.2rem;
            color: #ffefb9;
            letter-spacing: 0.5px;
        }

        footer {
            text-align: center;
            margin-top: 1rem;
            font-size: 0.7rem;
            color: #442f18;
            font-weight: 500;
        }

        @media (max-width: 580px) {
            .box {
                width: 100px;
                height: 115px;
            }
            .box-icon {
                font-size: 2.4rem;
            }
            .box-label {
                font-size: 1rem;
            }
            .stat-number {
                font-size: 2rem;
            }
            button {
                padding: 0.5rem 1.2rem;
                font-size: 1rem;
            }
        }
    </style>
</head>
<body>
<div class="game-container">
    <h1>🎁 ТАИНСТВЕННЫЙ ЯЩИК 🎁</h1>
    <div style="display: flex; justify-content: center;">
        <div class="sub">Один ящик — сюрприз! Выбирай, меняй решение или открывай</div>
    </div>

    <!-- Статистика побед/поражений -->
    <div class="stats-panel">
        <div class="stat-card">
            <span>🏆 УГАДАНО</span>
            <div class="stat-number" id="winCount">0</div>
        </div>
        <div class="stat-card">
            <span>❌ НЕ УГАДАНО</span>
            <div class="stat-number" id="loseCount">0</div>
        </div>
        <div class="stat-card">
            <span>📊 ТОЧНОСТЬ</span>
            <div class="stat-number" id="accuracy">0%</div>
            <div class="accuracy">всего игр</div>
        </div>
    </div>

    <!-- 3 ящика -->
    <div class="boxes-area" id="boxesContainer">
        <!-- динамически через js создадим 3 ящика, но можно и разметка, но для наглядности сгенерим скриптом -->
    </div>

    <!-- Панель действий -->
    <div class="action-buttons">
        <button id="confirmBtn" disabled>✅ Подтвердить и открыть</button>
        <button id="changeBtn" disabled>🔄 Изменить выбор → открыть другой</button>
        <button id="resetBtn" class="reset-btn">🎲 Новая игра / Сброс</button>
    </div>

    <div class="game-message" id="gameMessage">
        ✨ Выберите один из ящиков, чтобы начать ✨
    </div>
    <footer>⚡ Приз случайный каждый раунд. Выберите ящик → подтвердите или смените выбор → статистика обновится.</footer>
</div>

<script>
    // --- СОСТОЯНИЕ ИГРЫ ---
    let currentPrizeBox = null;      // индекс ящика с призом (0,1,2)
    let selectedBoxIndex = null;     // какой ящик выбрал игрок (после клика)
    let gameActive = true;            // игра активна? (пока не подтвержден финальный выбор)
    let roundFinished = false;        // после того как открыли результат (пока не сбросим)
    let pendingDecision = false;      // выбрал ящик, но еще не подтвердил/сменил (индикатор фазы выбора)
    
    // Статистика
    let winTotal = 0;
    let loseTotal = 0;
    
    // DOM элементы
    const boxesContainer = document.getElementById('boxesContainer');
    const confirmBtn = document.getElementById('confirmBtn');
    const changeBtn = document.getElementById('changeBtn');
    const resetBtn = document.getElementById('resetBtn');
    const gameMessageDiv = document.getElementById('gameMessage');
    const winSpan = document.getElementById('winCount');
    const loseSpan = document.getElementById('loseCount');
    const accuracySpan = document.getElementById('accuracy');
    
    // Вспомогательные функции обновления UI статистики
    function updateStatsUI() {
        winSpan.innerText = winTotal;
        loseSpan.innerText = loseTotal;
        let total = winTotal + loseTotal;
        if (total === 0) {
            accuracySpan.innerText = '0%';
        } else {
            let percent = Math.round((winTotal / total) * 100);
            accuracySpan.innerText = `${percent}%`;
        }
    }
    
    // Генератор случайного приза (честный, непредсказуемый)
    function generateRandomPrize() {
        return Math.floor(Math.random() * 3);   // 0,1,2 равновероятно
    }
    
    // Сброс / новая игра: генерируем новый приз, очищаем выборы, возвращаем активное состояние
    function resetGame() {
        // генерируем новый тайный приз
        currentPrizeBox = generateRandomPrize();
        selectedBoxIndex = null;
        gameActive = true;
        roundFinished = false;
        pendingDecision = false;
        
        // разблокируем все ящики визуально, убираем состояния
        renderBoxes();
        
        // управление кнопками: после сброса ящики активны, но подтверждение и смена выключены (пока нет выбора)
        confirmBtn.disabled = true;
        changeBtn.disabled = true;
        
        // сообщение
        gameMessageDiv.innerHTML = '🎲 Новый раунд! В одном из ящиков спрятан приз. Сделайте выбор 🎲';
        // снимаем любые дополнительные флаги
    }
    
    // Рендер ящиков на основе текущего состояния (selectedBoxIndex, roundFinished, currentPrizeBox и т.д.)
    // Если игра закончена (roundFinished == true) показываем содержимое: где был приз, а также если выбранный ящик не приз — показываем пустышку.
    // По условию: после финального открытия показываем правду: ящик с призом открыт и показывает приз, другие либо пусты.
    // Для эстетики: когда игра не закончена, ящики закрыты, и только выделяем выбранный.
    function renderBoxes() {
        if (!boxesContainer) return;
        // Создаем массив ящиков
        let boxesHtml = '';
        for (let i = 0; i < 3; i++) {
            let isSelected = (selectedBoxIndex === i);
            let isRevealed = roundFinished;   // если раунд завершен, показываем содержимое всех или только призового?
            // Дизайн: после подтверждения выбора показываем на всех ящиках правду: приз открыт на том, где приз, а на остальных - "пусто"
            // но если игрок не угадал, то на его выбранном показываем пусто и на призовом - приз
            let additionalClass = '';
            let contentIcon = '📦';      // закрытый вид
            let labelText = `Ящик ${i+1}`;
            
            if (!roundFinished) {
                // ИГРА НЕ ЗАВЕРШЕНА: все ящики закрытые, но выбранный имеет выделение
                if (isSelected) {
                    additionalClass = 'selected';
                }
                contentIcon = '🎁?';
                labelText = `Ящик ${i+1}`;
            } else {
                // РАУНД ЗАВЕРШЕН: показываем правду, все открыто
                additionalClass = 'disabled-box revealed-prize';
                if (i === currentPrizeBox) {
                    contentIcon = '🏆✨';   // приз
                    labelText = `ПРИЗ! 🎉`;
                } else {
                    contentIcon = '🍂❌';
                    labelText = `Пусто`;
                }
                // если завершено, то дополнительно блокируем клики через pointer-events? но проще через CSS и отключение обработчиков
                // добавим класс disabled-box для всего
            }
            
            // при завершении игры добавим эффект отличия (уже добавили)
            let additionalClasses = `box ${additionalClass}`;
            if (roundFinished) additionalClasses += ' disabled-box';
            
            // Если раунд не завершен и игру не заблокировали (ящики кликабельны, кроме случаев если roundFinished)
            let clickHandler = !roundFinished ? `onclick="selectBox(${i})"` : '';
            
            boxesHtml += `
                <div class="${additionalClasses}" ${clickHandler} style="cursor: ${!roundFinished ? 'pointer' : 'default'}">
                    <div class="box-icon">${contentIcon}</div>
                    <div class="box-label">${labelText}</div>
                </div>
            `;
        }
        boxesContainer.innerHTML = boxesHtml;
        
        // если игра активна, но уже выбран ящик (pending) — делаем кнопки активными
        if (!roundFinished && selectedBoxIndex !== null && gameActive && !pendingDecision === false) {
            // по факту pendingDecision — флаг что игрок выбрал ящик, но не завершил игру. confirm/change доступны
            // лучше явно:
        }
        // синхронизация кнопок отдельно
    }
    
    // обработчик выбора ящика (только когда игра активна и раунд не завершен и нет финального решения)
    function selectBox(index) {
        // проверки: нельзя выбирать, если игра не активна, или раунд завершен, либо уже есть финальный выбор (roundFinished)
        if (roundFinished) {
            gameMessageDiv.innerHTML = '🎮 Игра уже завершена, нажмите "Новая игра" для следующего раунда.';
            return;
        }
        if (!gameActive) return;
        // если уже выбран ящик и игра не закончена, можно сменить выбор? по классике можно перевыбрать до подтверждения
        // реализуем: повторный клик меняет выбранный ящик
        if (selectedBoxIndex === index) {
            gameMessageDiv.innerHTML = `📦 Вы снова выбрали ящик ${index+1}. Подтвердите или смените выбор.`;
        } else {
            gameMessageDiv.innerHTML = `🧐 Вы выбрали ящик №${index+1}. Теперь подтвердите открытие, либо нажмите "Изменить выбор" для открытия другого случайного (кроме текущего).`;
        }
        selectedBoxIndex = index;
        pendingDecision = true;  // фаза ожидания финального решения
        
        // сделать активными кнопки "подтвердить" и "сменить выбор"
        confirmBtn.disabled = false;
        changeBtn.disabled = false;
        
        // перерисовать ящики с выделением
        renderBoxes();
    }
    
    // Функция которая завершает игру, принимая финальный ящик (который в итоге открывает игрок)
    // finalBoxIndex — ящик, который будет открыт (либо текущий выбранный, либо измененный)
    // mode: 'confirm' или 'change'
    function finishGame(finalBoxIndex, mode) {
        if (roundFinished) {
            gameMessageDiv.innerHTML = 'Раунд уже завершен, начните новую игру.';
            return;
        }
        if (!gameActive) return;
        if (finalBoxIndex === undefined || finalBoxIndex === null) return;
        
        // определяем победа или поражение
        const isWin = (finalBoxIndex === currentPrizeBox);
        
        // обновляем статистику
        if (isWin) {
            winTotal++;
            gameMessageDiv.innerHTML = `🎉 ПОБЕДА! 🎉 Ящик №${finalBoxIndex+1} содержал приз! ${mode === 'confirm' ? 'Вы подтвердили свой выбор.' : 'Вы сменили выбор и угадали!'} 🎉`;
        } else {
            loseTotal++;
            gameMessageDiv.innerHTML = `😭 ПРОИГРЫШ... В ящике №${finalBoxIndex+1} оказалось пусто. Приз был в ящике №${currentPrizeBox+1}. ${mode === 'confirm' ? 'Вы подтвердили неудачный выбор.' : 'Вы изменили выбор, но не угадали.'}`;
        }
        
        // игра завершена, раунд финиширован
        roundFinished = true;
        gameActive = false;   // больше нельзя выбирать до ресета
        pendingDecision = false;
        
        // отключаем кнопки действий
        confirmBtn.disabled = true;
        changeBtn.disabled = true;
        
        // перерисовываем ящики в открытом режиме (показать все содержимое)
        renderBoxes();
        updateStatsUI();
    }
    
    // Подтверждение: открыть выбранный ящик
    function confirmChoice() {
        if (roundFinished) {
            gameMessageDiv.innerHTML = 'Игра уже окончена, сбросьте для новой.';
            return;
        }
        if (selectedBoxIndex === null) {
            gameMessageDiv.innerHTML = 'Сначала выберите ящик!';
            return;
        }
        // финальный выбор — текущий выбранный ящик
        finishGame(selectedBoxIndex, 'confirm');
    }
    
    // Сменить выбор: открыть другой ящик (не тот, который выбрал игрок). Выбираем случайный из оставшихся двух.
    function changeAndOpen() {
        if (roundFinished) {
            gameMessageDiv.innerHTML = 'Игра окончена, начните заново.';
            return;
        }
        if (selectedBoxIndex === null) {
            gameMessageDiv.innerHTML = 'Вы не выбрали ящик! Сначала кликните на ящик.';
            return;
        }
        // алгоритм смены: из двух оставшихся ящиков выбираем случайный (это честно, без обмана)
        const remaining = [];
        for (let i = 0; i < 3; i++) {
            if (i !== selectedBoxIndex) remaining.push(i);
        }
        if (remaining.length !== 2) {
            // подстраховка
            const alternative = (selectedBoxIndex + 1) % 3;
            const finalBox = alternative;
            finishGame(finalBox, 'change');
            return;
        }
        // выбираем случайный из двух оставшихся
        const randomIndex = Math.floor(Math.random() * remaining.length);
        const newBox = remaining[randomIndex];
        finishGame(newBox, 'change');
    }
    
    // Инициализация игры + события кнопок
    function initGame() {
        // генерируем первоначальный приз
        currentPrizeBox = generateRandomPrize();
        selectedBoxIndex = null;
        gameActive = true;
        roundFinished = false;
        pendingDecision = false;
        confirmBtn.disabled = true;
        changeBtn.disabled = true;
        renderBoxes();
        updateStatsUI();
        gameMessageDiv.innerHTML = '✨ Выберите ящик, чтобы начать игру ✨';
    }
    
    // связываем глобальные функции для onclick из HTML (чтобы работало в рендере)
    window.selectBox = selectBox;
    window.confirmChoice = confirmChoice;
    window.changeAndOpen = changeAndOpen;
    
    // назначим обработчики кнопок
    confirmBtn.onclick = () => confirmChoice();
    changeBtn.onclick = () => changeAndOpen();
    resetBtn.onclick = () => {
        resetGame();
        // Дополнительно гарантируем генерацию приза
        currentPrizeBox = generateRandomPrize();
        selectedBoxIndex = null;
        gameActive = true;
        roundFinished = false;
        pendingDecision = false;
        confirmBtn.disabled = true;
        changeBtn.disabled = true;
        renderBoxes();
        gameMessageDiv.innerHTML = '🔁 Новая игра! Приз перемешан. Удачи! 🔁';
        // статистика не сбрасывается по условию — ведется общая статистика за все попытки
        // только ресет раунда, но статистика побед/поражений сохраняется
    };
    
    // начальный запуск
    initGame();
    
    // синхронная безопасная проверка при любом рендере дополнительно
    // также после сброса, если надо сохранить статы без изменений
</script>
</body>
</html>

ну и попутно парадокс Монти Холла можете опробовать

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
    <title>Парадокс Монти Холла | 3 ящика — ведущий открывает пустой</title>
    <style>
        * {
            box-sizing: border-box;
            user-select: none;
        }

        body {
            background: linear-gradient(135deg, #0b2b1f 0%, #1a3f2a 100%);
            min-height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            font-family: 'Segoe UI', 'Poppins', system-ui, sans-serif;
            margin: 0;
            padding: 20px;
        }

        .game-container {
            max-width: 1200px;
            width: 100%;
            background: rgba(253, 245, 220, 0.95);
            border-radius: 3rem 2rem 3rem 2rem;
            box-shadow: 0 30px 40px rgba(0, 0, 0, 0.4), inset 0 1px 3px rgba(255, 250, 210, 0.8);
            padding: 1.8rem 1.8rem 2rem;
            transition: all 0.2s;
        }

        h1 {
            text-align: center;
            font-size: 1.9rem;
            margin: 0;
            color: #c97e2a;
            text-shadow: 2px 2px 0 #412a0e;
            letter-spacing: 1px;
        }

        .paradox-badge {
            text-align: center;
            background: #f3cf7a;
            display: inline-block;
            width: auto;
            margin: 0 auto 1rem;
            padding: 0.3rem 1.8rem;
            border-radius: 60px;
            font-weight: bold;
            font-size: 0.9rem;
            color: #2c4727;
            box-shadow: inset 0 0 2px #aa7733, 0 2px 6px rgba(0,0,0,0.2);
        }

        .stats-panel {
            display: flex;
            justify-content: center;
            gap: 2rem;
            margin: 1rem 0 1.5rem;
            flex-wrap: wrap;
        }

        .stat-card {
            background: #2a2b26;
            border-radius: 2rem;
            padding: 0.6rem 1.6rem;
            min-width: 140px;
            text-align: center;
            box-shadow: 0 7px 0 #131210;
            color: #fae67a;
        }

        .stat-card span:first-child {
            font-size: 1rem;
            font-weight: 600;
            display: block;
        }

        .stat-number {
            font-size: 2.5rem;
            font-weight: 800;
            line-height: 1;
            color: #ffd966;
            text-shadow: 0 2px 0 #5a3e1a;
            font-family: monospace;
        }

        .prob-hint {
            font-size: 0.7rem;
            background: #00000066;
            border-radius: 20px;
            padding: 0.2rem 0.6rem;
            margin-top: 5px;
        }

        .boxes-area {
            display: flex;
            flex-wrap: wrap;
            justify-content: center;
            gap: 1.8rem;
            margin: 2rem 0 1rem;
        }

        .box {
            background: linear-gradient(145deg, #cb9e6b, #b87a3a);
            width: 170px;
            height: 180px;
            border-radius: 28px;
            cursor: pointer;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            transition: 0.2s ease;
            box-shadow: 0 12px 0 #6a3f18;
            border: 1px solid #ffdd99;
            position: relative;
        }

        .box:hover:not(.disabled-box):not(.opened-empty) {
            transform: translateY(-5px);
            box-shadow: 0 15px 0 #6a3f18;
            background: linear-gradient(145deg, #dbb17a, #c58a48);
        }

        .box.selected {
            background: #fad893;
            box-shadow: 0 0 0 4px #ffedb0, 0 12px 0 #6a3f18;
            transform: scale(0.98);
        }

        .box.opened-empty {
            background: #8b6946;
            filter: grayscale(0.2);
            box-shadow: 0 5px 0 #4c3219;
            cursor: default;
        }

        .disabled-box {
            cursor: default;
            opacity: 0.85;
        }

        .box-icon {
            font-size: 4rem;
            filter: drop-shadow(3px 5px 0 rgba(0,0,0,0.3));
        }

        .box-label {
            font-size: 1.3rem;
            font-weight: bold;
            background: #3a2612;
            color: #ffecb3;
            padding: 0.2rem 1rem;
            border-radius: 40px;
            margin-top: 8px;
        }

        .revealed-prize {
            background: radial-gradient(circle at 30% 25%, #ffdd88, #da942a);
            box-shadow: 0 5px 0 #784d1c;
        }

        .action-buttons {
            display: flex;
            justify-content: center;
            gap: 1.4rem;
            flex-wrap: wrap;
            margin: 20px 0 15px;
        }

        button {
            font-size: 1.15rem;
            font-weight: bold;
            border: none;
            background: #efb76b;
            padding: 0.7rem 1.7rem;
            border-radius: 60px;
            cursor: pointer;
            transition: 0.08s linear;
            box-shadow: 0 5px 0 #8b5528;
            color: #2c1a0b;
            font-family: inherit;
        }

        button:active {
            transform: translateY(2px);
            box-shadow: 0 2px 0 #8b5528;
        }

        button:disabled {
            opacity: 0.5;
            transform: none;
            cursor: not-allowed;
        }

        .reset-btn {
            background: #3f6b4a;
            color: #ffefc0;
            box-shadow: 0 5px 0 #21482a;
        }

        .game-message {
            background: #1a2f1ad9;
            backdrop-filter: blur(8px);
            border-radius: 56px;
            text-align: center;
            padding: 12px;
            margin-top: 15px;
            font-weight: bold;
            font-size: 1.1rem;
            color: #fff0c0;
        }

        .theory-note {
            text-align: center;
            font-size: 0.7rem;
            margin-top: 18px;
            background: #e9dbc6;
            width: fit-content;
            margin-left: auto;
            margin-right: auto;
            padding: 5px 15px;
            border-radius: 50px;
            color: #4c3a24;
            font-weight: 500;
        }

        @media (max-width: 620px) {
            .box {
                width: 100px;
                height: 115px;
            }
            .box-icon {
                font-size: 2.4rem;
            }
            .box-label {
                font-size: 0.9rem;
            }
            .stat-number {
                font-size: 1.8rem;
            }
            button {
                padding: 0.5rem 1rem;
                font-size: 0.9rem;
            }
        }
    </style>
</head>
<body>
<div class="game-container">
    <h1>🎩 ПАРАДОКС МОНТИ ХОЛЛА 🎩</h1>
    <div style="display: flex; justify-content: center;">
        <div class="paradox-badge">📐 Ведущий ЗНАЕТ где приз и открывает ПУСТОЙ ящик</div>
    </div>

    <div class="stats-panel">
        <div class="stat-card">
            <span>🏆 ПОБЕД (угадал)</span>
            <div class="stat-number" id="winCount">0</div>
            <div class="prob-hint">⭐ итог</div>
        </div>
        <div class="stat-card">
            <span>❌ ПОРАЖЕНИЙ</span>
            <div class="stat-number" id="loseCount">0</div>
        </div>
        <div class="stat-card">
            <span>📊 УСПЕХ</span>
            <div class="stat-number" id="accuracy">0%</div>
            <div class="prob-hint">всего партий</div>
        </div>
    </div>

    <!-- три ящика динамически -->
    <div class="boxes-area" id="boxesContainer"></div>

    <div class="action-buttons">
        <button id="stayBtn" disabled>🔒 ОСТАТЬСЯ ПРИ СВОЁМ</button>
        <button id="switchBtn" disabled>🔄 СМЕНИТЬ ВЫБОР (рекомендуется!)</button>
        <button id="resetBtn" class="reset-btn">🎲 НОВАЯ ИГРА</button>
    </div>

    <div class="game-message" id="gameMessage">
        🧠 Выберите ящик. Ведущий откроет пустой, после чего вы сможете остаться или сменить выбор.
    </div>
    <div class="theory-note">
        📐 Математика: Изначальный шанс 33% — после открытия пустого ящика смена выбора даёт 66.7% победы!
    </div>
</div>

<script>
    // ---------- СОСТОЯНИЕ ИГРЫ (МОНТИ ХОЛЛ) ----------
    let prizeBox = null;            // индекс ящика с призом (0,1,2)
    let playerFirstChoice = null;   // первый выбор игрока
    let openedEmptyBox = null;      // какой ящик открыл ведущий (пустой, не приз, не выбор игрока)
    let gamePhase = "selection";     // 'selection' -> игрок выбирает первый ящик
                                     // 'offer' -> ведущий открыл пустой, предлагает выбор: остаться или сменить
                                     // 'finished' -> раунд завершён, результат показан
    let finalDecisionMade = false;   // финальное решение принято (остался/сменил)

    // Статистика побед / поражений
    let totalWins = 0;
    let totalLosses = 0;

    // DOM элементы
    const boxesContainer = document.getElementById('boxesContainer');
    const stayBtn = document.getElementById('stayBtn');
    const switchBtn = document.getElementById('switchBtn');
    const resetBtn = document.getElementById('resetBtn');
    const gameMessageDiv = document.getElementById('gameMessage');
    const winSpan = document.getElementById('winCount');
    const loseSpan = document.getElementById('loseCount');
    const accuracySpan = document.getElementById('accuracy');

    // ----- Вспомогательные функции -----
    function updateStatsUI() {
        winSpan.innerText = totalWins;
        loseSpan.innerText = totalLosses;
        const totalGames = totalWins + totalLosses;
        if (totalGames === 0) {
            accuracySpan.innerText = '0%';
        } else {
            const percent = Math.round((totalWins / totalGames) * 100);
            accuracySpan.innerText = `${percent}%`;
        }
    }

    // Генерация случайного приза (абсолютно случайно)
    function randomPrizeBox() {
        return Math.floor(Math.random() * 3);
    }

    // Логика ведущего: открывает пустой ящик из оставшихся (не приз и не первый выбор игрока)
    // возвращает индекс открытого ящика
    function getHostOpenedBox(prizeIdx, firstChoiceIdx) {
        const candidates = [];
        for (let i = 0; i < 3; i++) {
            if (i !== prizeIdx && i !== firstChoiceIdx) {
                candidates.push(i);
            }
        }
        // всегда есть хотя бы один, в классическом парадоксе — 1 или 2 варианта
        // если candidates.length === 1 (игрок не угадал приз первым ходом), то открывается единственный.
        // если candidates.length === 2 (игрок угадал приз первым ходом), то ведущий случайно выбирает любой из двух пустых.
        if (candidates.length === 0) {
            // на всякий случай (не может быть)
            return (prizeIdx === 0 ? 1 : 0);
        }
        const randomIndex = Math.floor(Math.random() * candidates.length);
        return candidates[randomIndex];
    }

    // Начать новый раунд (сброс всех состояний, генерация приза)
    function newRound() {
        prizeBox = randomPrizeBox();
        playerFirstChoice = null;
        openedEmptyBox = null;
        gamePhase = "selection";
        finalDecisionMade = false;
        
        // кнопки управления в начальной фазе
        stayBtn.disabled = true;
        switchBtn.disabled = true;
        
        // отрисовать интерфейс ящиков (закрытые, без выделений)
        renderBoxes();
        
        gameMessageDiv.innerHTML = "🎁 Выберите первый ящик. Ведущий затем откроет пустой и предложит выбор.";
    }
    
    // Рендер ящиков в зависимости от фазы игры:
    // - selection: все закрыты, возможен клик (выбор первого ящика)
    // - offer: ведущий уже открыл пустой ящик (openedEmptyBox показывается как открытый пустой)
    //          выбранный игроком первый ящик выделяется, но уже заблокирован для кликов
    //          два неоткрытых ящика (первый выбор игрока + второй неоткрытый) выглядят целыми.
    // - finished: показываем результат: приз открыт на prizeBox, остальные открыты (пусто)
    function renderBoxes() {
        if (!boxesContainer) return;
        let html = '';
        for (let i = 0; i < 3; i++) {
            let additionalClasses = "box";
            let icon = "🎁";
            let label = `Ящик ${i+1}`;
            let clickable = false;
            let clickHandler = "";
            
            // --- ФАЗА ВЫБОРА ПЕРВОГО ЯЩИКА (selection) ---
            if (gamePhase === "selection") {
                clickable = true;
                if (playerFirstChoice === i) {
                    additionalClasses += " selected";
                }
                icon = "❓";
                label = `Ящик ${i+1}`;
            }
            // --- ФАЗА ПРЕДЛОЖЕНИЯ (offer) ведущий уже открыл пустой ящик ---
            else if (gamePhase === "offer") {
                // ящик, который открыл ведущий (пустой) показываем как открытый "пусто"
                if (openedEmptyBox === i) {
                    additionalClasses += " opened-empty disabled-box";
                    icon = "🍂";
                    label = "Пусто";
                    clickable = false;
                } 
                // первый выбор игрока (ещё закрыт, но выделен)
                else if (playerFirstChoice === i) {
                    additionalClasses += " selected";
                    icon = "❓";
                    label = `Ваш выбор → ${i+1}`;
                    clickable = false;   // в фазе offer клики на ящики не меняют решение
                }
                // третий ящик (тот, который не выбрал игрок и не открыт ведущим) — альтернатива для смены
                else {
                    icon = "❓";
                    label = `Ящик ${i+1}`;
                    clickable = false;
                }
            }
            // --- ФАЗА ЗАВЕРШЕНА (finished) ---
            else if (gamePhase === "finished") {
                additionalClasses += " disabled-box";
                if (i === prizeBox) {
                    additionalClasses += " revealed-prize";
                    icon = "🏆✨";
                    label = "ПРИЗ!";
                } else {
                    additionalClasses += " opened-empty";
                    icon = "🍂";
                    label = "Пусто";
                }
                clickable = false;
            }
            
            // Добавляем обработчик клика, если кликабельно
            if (clickable && gamePhase === "selection") {
                clickHandler = `onclick="selectFirstBox(${i})"`;
            } else {
                clickHandler = "";
            }
            
            html += `<div class="${additionalClasses}" style="cursor: ${clickable ? 'pointer' : 'default'}" ${clickHandler}>
                        <div class="box-icon">${icon}</div>
                        <div class="box-label">${label}</div>
                    </div>`;
        }
        boxesContainer.innerHTML = html;
    }
    
    // ------ 1. Игрок выбирает первый ящик ------
    window.selectFirstBox = function(boxIndex) {
        if (gamePhase !== "selection") {
            gameMessageDiv.innerHTML = "Сейчас нельзя выбрать, игра уже на стадии предложения или завершена. Нажмите 'Новая игра'.";
            return;
        }
        if (playerFirstChoice !== null) {
            // на всякий случай, но по логике интерфейса вы можете перевыбрать до того как ведущий сработает?
            // по классике: игрок делает единственный первый выбор, но добавим свободу перевыбора до перехода
            playerFirstChoice = boxIndex;
            renderBoxes();
            gameMessageDiv.innerHTML = `Вы выбрали ящик №${boxIndex+1}. Теперь нажмите «Ведущий открывает пустой ящик» (кнопка ниже), чтобы продолжить.`;
            return;
        }
        playerFirstChoice = boxIndex;
        renderBoxes();
        // После выбора первого ящика предлагаем следующий шаг: ведущий открывает пустой.
        // В интерфейсе сделаем кнопку "Открыть пустой ящик" — но по правилам парадокса ведущий открывает сразу.
        // Чтобы не усложнять, сделаем автоматический переход после выбора? Нет: удобнее кнопка "Раунд: Ведущий открывает пустой"
        // Добавим скрытую логику: после выбора игроком, появляется кнопка "Ведущий открывает пустой"?
        // Но по UI правильнее добавить новую кнопку? Либо автоматически вызвать открытие. Сделаем автоматически через 0.1с для плавности, но управление через кнопку "Далее".
        // Для чистоты парадокса добавим кнопку "🎭 Ведущий, открой пустой ящик", которая появляется после выбора. Но чтобы не засорять, превратим одну из кнопок.
        // Лучше сделаем третью кнопку "Ведущий открывает пустой" временную? Упростим: после выбора первого ящика автоматически вызываем открытие.
        // Так игроку не нужно лишних нажатий.
        gameMessageDiv.innerHTML = `✅ Вы выбрали ящик №${boxIndex+1}. Ведущий (который знает где приз) открывает заведомо пустой ящик...`;
        // Автоматический вызов открытия ведущим (через микро-задержку для анимации)
        setTimeout(() => {
            if (gamePhase === "selection" && playerFirstChoice !== null) {
                hostOpensEmpty();
            }
        }, 80);
    };
    
    // 2. Ведущий открывает пустой ящик (классический шаг)
    function hostOpensEmpty() {
        if (gamePhase !== "selection" || playerFirstChoice === null) {
            // неверное состояние
            if (playerFirstChoice === null) gameMessageDiv.innerHTML = "Сначала выберите ящик!";
            return;
        }
        // Вычисляем, какой ящик должен открыть ведущий
        openedEmptyBox = getHostOpenedBox(prizeBox, playerFirstChoice);
        // переключаем фазу игры на "предложение"
        gamePhase = "offer";
        // делаем кнопки "Остаться" и "Сменить" активными
        stayBtn.disabled = false;
        switchBtn.disabled = false;
        // отрисовать ящики: открытый пустой показывается, остальные два закрыты (выбор игрока и альтернатива)
        renderBoxes();
        gameMessageDiv.innerHTML = `🎤 Ведущий открыл ящик №${openedEmptyBox+1} — там пусто! Теперь решайте: остаться при своём ящике №${playerFirstChoice+1} или сменить выбор на другой закрытый ящик? (шанс победы при смене = 66.7%)`;
    }
    
    // 3. Игрок решает: остаться при своём первом выборе
    function stayWithChoice() {
        if (gamePhase !== "offer") {
            gameMessageDiv.innerHTML = "Сейчас нельзя принять решение — игра не в фазе предложения. Начните новый раунд.";
            return;
        }
        const finalBox = playerFirstChoice;
        const isWin = (finalBox === prizeBox);
        finishRound(isWin, "stay");
    }
    
    // 4. Игрок решает сменить выбор (на другой закрытый ящик, который не открывал ведущий и не его первый выбор)
    function switchChoice() {
        if (gamePhase !== "offer") {
            gameMessageDiv.innerHTML = "Невозможно сменить выбор сейчас. Начните новый раунд.";
            return;
        }
        // Находим оставшийся ящик: ни первый выбор игрока, ни открытый ведущим
        let switchedBox = null;
        for (let i = 0; i < 3; i++) {
            if (i !== playerFirstChoice && i !== openedEmptyBox) {
                switchedBox = i;
                break;
            }
        }
        if (switchedBox === null) {
            // fallback (ошибка)
            switchedBox = (playerFirstChoice === 0 ? 1 : 0);
        }
        const isWin = (switchedBox === prizeBox);
        finishRound(isWin, "switch");
    }
    
    // 5. Завершение раунда: обновить статистику, показать результат, заблокировать кнопки выбора
    function finishRound(isWin, decisionType) {
        if (gamePhase === "finished") return;
        
        if (isWin) {
            totalWins++;
            gameMessageDiv.innerHTML = `🎉 ПОБЕДА! 🎉 Вы ${decisionType === "stay" ? "остались при своём выборе" : "сменили выбор"} и выиграли приз! (${decisionType === "switch" ? "Правильная стратегия: смена даёт 66.7%" : "Везение!"})`;
        } else {
            totalLosses++;
            gameMessageDiv.innerHTML = `💔 ПОРАЖЕНИЕ. Приз был в ящике №${prizeBox+1}. ${decisionType === "stay" ? "Вы остались при своём первом выборе" : "Вы сменили выбор, но не угадали"}. Попробуйте снова.`;
        }
        
        gamePhase = "finished";
        finalDecisionMade = true;
        // отключаем кнопки выбора в завершённой игре
        stayBtn.disabled = true;
        switchBtn.disabled = true;
        // отобразить все ящики открытыми
        renderBoxes();
        updateStatsUI();
    }
    
    // Полный сброс игры (новая игра)
    function resetFullGame() {
        // Не сбрасываем статистику! По условию задачи статистика ведется за всё время
        // Очищаем состояние раунда
        prizeBox = randomPrizeBox();
        playerFirstChoice = null;
        openedEmptyBox = null;
        gamePhase = "selection";
        finalDecisionMade = false;
        stayBtn.disabled = true;
        switchBtn.disabled = true;
        renderBoxes();
        gameMessageDiv.innerHTML = "🔄 Новая игра! Выберите любой ящик первым шагом. Ведущий откроет пустой, и вы сможете изменить выбор или остаться.";
        // статистика UI уже актуальна
        updateStatsUI();
    }
    
    // Назначение событий и инициализация
    function init() {
        // глобальные функции для onclick
        window.selectFirstBox = selectFirstBox;
        window.hostOpensEmpty = hostOpensEmpty;
        window.stayWithChoice = stayWithChoice;
        window.switchChoice = switchChoice;
        
        stayBtn.onclick = () => stayWithChoice();
        switchBtn.onclick = () => switchChoice();
        resetBtn.onclick = () => resetFullGame();
        
        // старт первого раунда
        prizeBox = randomPrizeBox();
        playerFirstChoice = null;
        gamePhase = "selection";
        finalDecisionMade = false;
        stayBtn.disabled = true;
        switchBtn.disabled = true;
        renderBoxes();
        gameMessageDiv.innerHTML = "✨ Выберите ящик — ведущий затем откроет пустой и предложит выбор. (Смена выбора даёт 66% успеха!) ✨";
        updateStatsUI();
    }
    
    init();
</script>
</body>
</html>

если вы считаете что я занимаюсь ерундой, так поделитесь каким то своим проектом! - посмотреть, почитать код, а то фантазия что сделать у меня иссякла)))

Загрузи ИИ

в голову ? интерфейс илона маска пока это не умеет вроде, и нет уверенности что это надежно…

Вы правда этого хотите?

Вспоминается анекдот:

– О, привет! Как здоровье?
– Тебя правда это интересует?
– Разумеется!
– Ну, … начнём с анализов …

абсолютно точно! даже если его вообще не пойму, может это натолкнет меня на какие то интересные мысли… а то все темы кажется уже пересмотрел… давно…

прям вообще кризис, скинул выше какой ерундой я занимаюсь…

Я пытаюсь сделать нечто вроде Excel (можно просто надстройку над тем же Excel, но не хочется забиваться на проприетарный и весьма не бесплатный базовый продукт) которая бы делал примерно то же самое, но:

  1. автоматически выводила бы значения в читабельном виде (т.е. насчитала 0.000023 А, а выдала для чтения 23 μA. При этом, разумеется внутри должна хранить в базовых величинах, чтобы, если надо использовать это значение в дальнейших расчётах.
  2. умела бы считать не только с числами, а интервалами по стандарту IEEE 1788-2015. Т.е., чтобы я мог не просто вводить номинал резистора, а, скажем 4.7kΩ , 5% и результат она должна получить тоже интервалом.

Как-то так. Чем бы дитя не тешилось …

Или по варианту анекдота о Ржевском, картах, дите :grinning_face:

а код какой то, который я еще не видел, получается не подадите ?)))

@BABOS - не грусти!

Ня, наслаждатесь!

Ну так вероятность попадания 33 процента с каждой попытки у среднестатистического человека.

наверняка вас не сковывает даже договор о не разглашении, а коды жмотят))) или вовсе нету…
Diskless скидывает плохие картинки в личку! если не хотите травмировать сознание, лучше не открывайте его сообщения)))

спс, я конечно говорил даже если там не пойму не чего… но там очень очень древняя программа))) если все таки она там есть…

а у вас то сколько ?))) я вот решил дальше познавать какого играть с … рандомом в кости))) еще и угадывая какой ящик меньше всего выпадет, и выяснить что не так с моей удачей)) такой результат не всегда

вот на таком коде

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
    <title>ЭКСПЕРИМЕНТ: Приз предопределён (слепая игра)</title>
    <style>
        * { box-sizing: border-box; user-select: none; }
        body {
            background: linear-gradient(145deg, #1a472a 0%, #0e2a1a 100%);
            min-height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            font-family: 'Segoe UI', system-ui, sans-serif;
            margin: 0;
            padding: 20px;
        }
        .game-container {
            max-width: 1300px;
            width: 100%;
            background: rgba(255, 248, 225, 0.95);
            border-radius: 2rem;
            padding: 1.5rem;
            box-shadow: 0 25px 45px rgba(0,0,0,0.5);
        }
        h1 { text-align: center; color: #f7b42c; text-shadow: 2px 2px 0 #7a2e00; margin: 0 0 0.5rem 0; font-size: 1.5rem; }
        .warning-banner { background: #7a2e00; color: #ffefb9; text-align: center; padding: 8px; border-radius: 2rem; margin-bottom: 1rem; font-size: 0.8rem; }
        .progress-area {
            background: #2d2b26;
            border-radius: 2rem;
            padding: 0.8rem;
            margin-bottom: 1rem;
            text-align: center;
            color: #ffefb9;
        }
        .progress-bar { background: #4a3720; border-radius: 1rem; height: 20px; overflow: hidden; margin-top: 0.5rem; }
        .progress-fill { background: #f7b42c; width: 0%; height: 100%; transition: width 0.3s; border-radius: 1rem; }
        .bet-area {
            background: #1e2a1a;
            border-radius: 1.5rem;
            padding: 1rem;
            margin-bottom: 1rem;
            text-align: center;
            border: 2px solid #ffd966;
        }
        .bet-buttons { display: flex; gap: 1rem; justify-content: center; margin: 0.8rem 0; flex-wrap: wrap; }
        .bet-btn {
            background: #f5bc70;
            border: none;
            padding: 0.6rem 1.8rem;
            border-radius: 2rem;
            font-weight: bold;
            cursor: pointer;
            font-size: 1.1rem;
        }
        .bet-btn.active { background: #4caf50; color: white; box-shadow: 0 0 0 2px gold; }
        .bet-btn:disabled { opacity: 0.5; cursor: not-allowed; }
        
        .stats-grid {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
            gap: 0.8rem;
            margin-bottom: 1rem;
        }
        .stat-card {
            background: #2d2b26;
            border-radius: 1.2rem;
            padding: 0.5rem;
            text-align: center;
            color: #f9e2a1;
            box-shadow: 0 5px 0 #0f0e0c;
        }
        .stat-number { font-size: 1.8rem; font-weight: bold; color: #ffd966; font-family: monospace; }
        .stat-label { font-size: 0.65rem; opacity: 0.8; }
        
        .boxes-area { display: flex; justify-content: center; gap: 1.5rem; margin: 1.2rem 0; flex-wrap: wrap; }
        .box {
            background: #d9ae6c;
            width: 120px;
            height: 130px;
            border-radius: 1.2rem;
            cursor: pointer;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            box-shadow: 0 10px 0 #7a4a1e;
            transition: 0.1s;
        }
        .box:hover:not(.disabled) { transform: translateY(-4px); background: #e7bc7c; }
        .box.selected { background: #f5cd94; box-shadow: 0 0 0 3px #ffdd88, 0 10px 0 #7a4a1e; }
        .disabled { cursor: default; opacity: 0.7; transform: none; }
        .box-icon { font-size: 2.5rem; }
        .box-label { font-size: 1rem; font-weight: bold; background: #492d14; color: #ffeaac; padding: 0.2rem 0.6rem; border-radius: 2rem; margin-top: 5px; }
        
        .action-buttons { display: flex; justify-content: center; gap: 0.8rem; margin: 1rem 0; flex-wrap: wrap; }
        button {
            font-size: 0.9rem;
            font-weight: bold;
            background: #f5bc70;
            padding: 0.5rem 1rem;
            border-radius: 2rem;
            cursor: pointer;
            border: none;
            box-shadow: 0 3px 0 #8b5a2b;
        }
        button:active { transform: translateY(2px); }
        button:disabled { opacity: 0.5; cursor: not-allowed; }
        .reset-btn { background: #3c6e47; color: white; }
        .report-btn { background: #2c5282; color: white; }
        .game-message { background: #1f2a17c9; border-radius: 2rem; padding: 0.8rem; margin: 1rem 0; text-align: center; font-weight: bold; color: #ffefb9; font-size: 0.9rem; }
        .verdict {
            background: #0a0f0a;
            border-radius: 1rem;
            padding: 0.8rem;
            margin-top: 1rem;
            text-align: center;
            font-weight: bold;
            font-size: 0.95rem;
        }
        .report-area {
            background: #1a1f1a;
            border-radius: 1rem;
            padding: 0.8rem;
            margin-top: 0.8rem;
            font-family: monospace;
            font-size: 0.7rem;
            color: #aaffaa;
            max-height: 150px;
            overflow-y: auto;
            display: none;
        }
        footer { text-align: center; margin-top: 1rem; font-size: 0.6rem; color: #442f18; }
        @media (max-width: 600px) { .box { width: 80px; height: 90px; } .box-icon { font-size: 1.8rem; } .stat-number { font-size: 1.3rem; } }
    </style>
</head>
<body>
<div class="game-container">
    <h1>🎲 СЛЕПОЙ ЭКСПЕРИМЕНТ 🎲</h1>
    <div class="warning-banner">🔮 ВСЕ 100 ПРИЗОВ СГЕНЕРИРОВАНЫ ЗАРАНЕЕ! Вы играете вслепую. Результат узнаете в конце.</div>
    
    <div class="progress-area">
        <span id="roundCounter">0</span> / 100 раундов
        <div class="progress-bar"><div class="progress-fill" id="progressFill"></div></div>
    </div>
    
    <div class="bet-area" id="betArea">
        <strong>🎯 ВАША СТАВКА:</strong><br>
        <span style="font-size: 0.8rem;">Какой ящик выпадет РЕЖЕ ВСЕГО за 100 раундов?</span>
        <div class="bet-buttons" id="betButtons">
            <button id="bet1" class="bet-btn">📦 Ящик №1</button>
            <button id="bet2" class="bet-btn">📦 Ящик №2</button>
            <button id="bet3" class="bet-btn">📦 Ящик №3</button>
        </div>
        <div id="betStatus" style="font-size: 0.75rem; margin-top: 0.3rem;">⚡ Сделайте ставку → «Начать серию» → играйте 100 раундов</div>
    </div>
    
    <!-- Статистика ПОКА скрывает реальные призы (видны только ВАШИ действия) -->
    <div class="stats-grid">
        <div class="stat-card"><span>🏆 УГАДАНО</span><div class="stat-number" id="winCount">0</div></div>
        <div class="stat-card"><span>❌ НЕ УГАДАНО</span><div class="stat-number" id="loseCount">0</div></div>
        <div class="stat-card"><span>📊 ТОЧНОСТЬ</span><div class="stat-number" id="accuracy">0%</div></div>
        <div class="stat-card" style="background:#4a3720;"><span>🔒 ПРИЗ В №1</span><div class="stat-number" id="prize1">???</div><div class="stat-label">скрыто до конца</div></div>
        <div class="stat-card" style="background:#4a3720;"><span>🔒 ПРИЗ В №2</span><div class="stat-number" id="prize2">???</div><div class="stat-label">скрыто до конца</div></div>
        <div class="stat-card" style="background:#4a3720;"><span>🔒 ПРИЗ В №3</span><div class="stat-number" id="prize3">???</div><div class="stat-label">скрыто до конца</div></div>
        <div class="stat-card"><span>📦 ВЫ ОТКРЫЛИ №1</span><div class="stat-number" id="open1">0</div></div>
        <div class="stat-card"><span>📦 ВЫ ОТКРЫЛИ №2</span><div class="stat-number" id="open2">0</div></div>
        <div class="stat-card"><span>📦 ВЫ ОТКРЫЛИ №3</span><div class="stat-number" id="open3">0</div></div>
    </div>
    
    <div class="boxes-area" id="boxesContainer"></div>
    <div class="action-buttons">
        <button id="confirmBtn" disabled>✅ Подтвердить</button>
        <button id="changeBtn" disabled>🔄 Изменить выбор</button>
        <button id="nextRoundBtn" class="reset-btn" disabled>▶ След. раунд</button>
        <button id="startSeriesBtn" class="reset-btn" style="background:#2c5282;">🎬 Начать слепую серию</button>
    </div>
    <div class="game-message" id="gameMessage">✨ Сделайте ставку → нажмите «Начать слепую серию» ✨</div>
    
    <div class="report-area" id="reportArea"></div>
    
    <div style="display: flex; gap: 0.8rem; justify-content: center; margin-top: 0.8rem; flex-wrap: wrap;">
        <button id="showReportBtn" class="report-btn" style="background:#6b46c0;">📋 Показать отчёт</button>
        <button id="exportCSVBtn" class="report-btn" style="background:#276749;">📎 Экспорт CSV</button>
    </div>
    
    <div class="verdict" id="verdict"></div>
    <footer>⚡ ВСЕ ПРИЗЫ СГЕНЕРИРОВАНЫ ДО НАЧАЛА ИГРЫ. Вы играете вслепую. В конце узнаете результат и увидите, совпала ли ставка.</footer>
</div>

<script>
    // ========== СОСТОЯНИЕ ==========
    let pregeneratedPrizes = [];     // 100 призов, сгенерированных заранее
    let currentRoundIndex = 0;       // 0..99
    let currentPrizeBox = null;
    let selectedBoxIndex = null;
    let gameActive = false;
    let roundFinished = false;
    
    // Статистика (реальная, но скрытая до конца)
    let prizeLocation = [0, 0, 0];
    let playerOpened = [0, 0, 0];
    let winTotal = 0, loseTotal = 0;
    
    // История для CSV
    let roundHistory = [];
    
    let seriesActive = false;
    let betBox = null;
    let seriesStarted = false;
    
    // DOM
    const boxesContainer = document.getElementById('boxesContainer');
    const confirmBtn = document.getElementById('confirmBtn');
    const changeBtn = document.getElementById('changeBtn');
    const nextRoundBtn = document.getElementById('nextRoundBtn');
    const startSeriesBtn = document.getElementById('startSeriesBtn');
    const gameMessageDiv = document.getElementById('gameMessage');
    const verdictDiv = document.getElementById('verdict');
    const reportArea = document.getElementById('reportArea');
    
    const winSpan = document.getElementById('winCount');
    const loseSpan = document.getElementById('loseCount');
    const accuracySpan = document.getElementById('accuracy');
    const prize1Span = document.getElementById('prize1');
    const prize2Span = document.getElementById('prize2');
    const prize3Span = document.getElementById('prize3');
    const open1Span = document.getElementById('open1');
    const open2Span = document.getElementById('open2');
    const open3Span = document.getElementById('open3');
    const roundCounterSpan = document.getElementById('roundCounter');
    const progressFill = document.getElementById('progressFill');
    const betStatusDiv = document.getElementById('betStatus');
    
    const bet1Btn = document.getElementById('bet1');
    const bet2Btn = document.getElementById('bet2');
    const bet3Btn = document.getElementById('bet3');
    const showReportBtn = document.getElementById('showReportBtn');
    const exportCSVBtn = document.getElementById('exportCSVBtn');
    
    // Обновление UI (только победы/поражения и открытые ящики, призы скрыты)
    function updateStatsUI() {
        winSpan.innerText = winTotal;
        loseSpan.innerText = loseTotal;
        let total = winTotal + loseTotal;
        accuracySpan.innerText = total === 0 ? '0%' : `${Math.round((winTotal / total) * 100)}%`;
        
        // Призы показываем как "???" до конца серии
        if (!seriesActive && seriesStarted) {
            // Серия завершена — показываем реальные призы
            prize1Span.innerText = prizeLocation[0];
            prize2Span.innerText = prizeLocation[1];
            prize3Span.innerText = prizeLocation[2];
        } else {
            prize1Span.innerText = '???';
            prize2Span.innerText = '???';
            prize3Span.innerText = '???';
        }
        
        open1Span.innerText = playerOpened[0];
        open2Span.innerText = playerOpened[1];
        open3Span.innerText = playerOpened[2];
        roundCounterSpan.innerText = currentRoundIndex;
        progressFill.style.width = `${(currentRoundIndex / 100) * 100}%`;
    }
    
    // Генерация 100 призов ДО начала игры
    function generateFullPrizeList() {
        const prizes = [];
        for (let i = 0; i < 100; i++) {
            prizes.push(Math.floor(Math.random() * 3));
        }
        return prizes;
    }
    
    function startNewRound() {
        if (!seriesActive) return false;
        if (currentRoundIndex >= 100) {
            finishSeries();
            return false;
        }
        
        // Берём следующий приз из предопределённого списка
        currentPrizeBox = pregeneratedPrizes[currentRoundIndex];
        
        // НЕ добавляем в prizeLocation сейчас — добавим в конце серии, чтобы не было подглядывания
        // Но для внутреннего учёта побед нам нужно знать приз. Он есть в currentPrizeBox.
        
        selectedBoxIndex = null;
        gameActive = true;
        roundFinished = false;
        confirmBtn.disabled = true;
        changeBtn.disabled = true;
        nextRoundBtn.disabled = true;
        
        renderBoxes();
        gameMessageDiv.innerHTML = `🎲 Раунд #${currentRoundIndex+1} из 100. Приз спрятан! Выберите ящик.`;
    }
    
    function finishRound(finalBoxIndex) {
        if (roundFinished) return;
        
        const isWin = (finalBoxIndex === currentPrizeBox);
        if (isWin) winTotal++;
        else loseTotal++;
        
        playerOpened[finalBoxIndex]++;
        
        // Сохраняем историю
        roundHistory.push({
            roundNum: currentRoundIndex + 1,
            prizeBox: currentPrizeBox + 1,
            playerFinalBox: finalBoxIndex + 1,
            isWin: isWin
        });
        
        updateStatsUI();
        
        gameMessageDiv.innerHTML = `📊 Раунд #${currentRoundIndex+1}: вы открыли №${finalBoxIndex+1} → ${isWin ? 'ПОБЕДА!' : 'ПРОИГРЫШ'}`;
        
        roundFinished = true;
        gameActive = false;
        confirmBtn.disabled = true;
        changeBtn.disabled = true;
        renderBoxes(true); // показываем результат раунда (где был приз)
        
        currentRoundIndex++;
        updateStatsUI();
        
        if (currentRoundIndex >= 100) {
            finishSeries();
        } else {
            nextRoundBtn.disabled = false;
        }
    }
    
    function selectBox(index) {
        if (!seriesActive || !gameActive || roundFinished) {
            gameMessageDiv.innerHTML = !seriesActive ? 'Сначала начните серию!' : 'Завершите этот раунд';
            return;
        }
        selectedBoxIndex = index;
        confirmBtn.disabled = false;
        changeBtn.disabled = false;
        gameMessageDiv.innerHTML = `Вы выбрали ящик №${index+1}. Подтвердите или смените.`;
        renderBoxes();
    }
    
    function confirmChoice() {
        if (!seriesActive || !gameActive || roundFinished) return;
        if (selectedBoxIndex === null) { gameMessageDiv.innerHTML = 'Выберите ящик!'; return; }
        finishRound(selectedBoxIndex);
    }
    
    function changeAndOpen() {
        if (!seriesActive || !gameActive || roundFinished) return;
        if (selectedBoxIndex === null) { gameMessageDiv.innerHTML = 'Выберите ящик!'; return; }
        const remaining = [0,1,2].filter(i => i !== selectedBoxIndex);
        const newBox = remaining[Math.floor(Math.random() * remaining.length)];
        finishRound(newBox);
    }
    
    function nextRound() {
        if (!seriesActive) return;
        if (currentRoundIndex >= 100) { finishSeries(); return; }
        if (!roundFinished) { gameMessageDiv.innerHTML = 'Завершите текущий раунд!'; return; }
        startNewRound();
    }
    
    function finishSeries() {
        seriesActive = false;
        gameActive = false;
        confirmBtn.disabled = true;
        changeBtn.disabled = true;
        nextRoundBtn.disabled = true;
        startSeriesBtn.disabled = false;
        [bet1Btn, bet2Btn, bet3Btn].forEach(btn => btn.disabled = false);
        
        // Теперь, когда серия завершена, подсчитываем реальное расположение призов
        prizeLocation = [0, 0, 0];
        for (let i = 0; i < pregeneratedPrizes.length; i++) {
            prizeLocation[pregeneratedPrizes[i]]++;
        }
        updateStatsUI(); // теперь покажет реальные призы
        
        if (betBox === null) {
            verdictDiv.innerHTML = '⚠️ Ставка не была сделана. Результат не определён.';
            return;
        }
        
        const minCount = Math.min(...prizeLocation);
        const rarestBoxes = [];
        for (let i = 0; i < 3; i++) if (prizeLocation[i] === minCount) rarestBoxes.push(i);
        const isBetWon = rarestBoxes.includes(betBox);
        
        verdictDiv.innerHTML = `
            <span style="font-size:1.2rem;">${isBetWon ? '✅ ВЫ ВЫИГРАЛИ СТАВКУ! ✅' : '❌ СТАВКА НЕ ВЫИГРАЛА ❌'}</span><br>
            📊 Ваша ставка: Ящик №${betBox+1} будет самым редким.<br>
            📈 РЕАЛЬНЫЙ результат за 100 раундов:<br>
            ▸ Ящик №1 выпал ${prizeLocation[0]} раз<br>
            ▸ Ящик №2 выпал ${prizeLocation[1]} раз<br>
            ▸ Ящик №3 выпал ${prizeLocation[2]} раз<br>
            🎯 Самый редкий: ящик(и) №${rarestBoxes.map(b=>b+1).join(', ')} (${minCount} раз).<br>
            ${isBetWon ? '🎉 Ваш ящик — среди самых редких! СТАВКА ОПРАВДАЛАСЬ! 🎉' : '😞 Ваш ящик не оказался самым редким.'}
        `;
        gameMessageDiv.innerHTML = '🏁 Серия из 100 раундов завершена! Призы были предопределены с самого начала. Нажмите «Показать отчёт».';
        seriesStarted = true;
    }
    
    function startSeries() {
        if (betBox === null) {
            gameMessageDiv.innerHTML = '❌ Сначала сделайте ставку!';
            return;
        }
        
        // Генерируем ВСЕ 100 призов ДО начала игры
        pregeneratedPrizes = generateFullPrizeList();
        
        // Сброс статистики
        winTotal = 0; loseTotal = 0;
        prizeLocation = [0, 0, 0]; // временно пусто, заполнится в конце
        playerOpened = [0, 0, 0];
        roundHistory = [];
        currentRoundIndex = 0;
        seriesActive = true;
        seriesStarted = true;
        
        [bet1Btn, bet2Btn, bet3Btn].forEach(btn => btn.disabled = true);
        startSeriesBtn.disabled = true;
        updateStatsUI();
        verdictDiv.innerHTML = '';
        reportArea.style.display = 'none';
        
        // Запускаем первый раунд
        currentPrizeBox = pregeneratedPrizes[0];
        selectedBoxIndex = null;
        gameActive = true;
        roundFinished = false;
        confirmBtn.disabled = true;
        changeBtn.disabled = true;
        nextRoundBtn.disabled = true;
        
        renderBoxes();
        gameMessageDiv.innerHTML = `🎬 СЛЕПАЯ СЕРИЯ НАЧАЛАСЬ! 100 призов уже сгенерированы. Ставка на ящик №${betBox+1}. Раунд #1 из 100. Выберите ящик!`;
    }
    
    function setBet(boxIndex) {
        if (seriesActive) {
            gameMessageDiv.innerHTML = 'Нельзя изменить ставку во время серии!';
            return;
        }
        betBox = boxIndex;
        [bet1Btn, bet2Btn, bet3Btn].forEach(btn => btn.classList.remove('active'));
        if (boxIndex === 0) bet1Btn.classList.add('active');
        else if (boxIndex === 1) bet2Btn.classList.add('active');
        else bet3Btn.classList.add('active');
        betStatusDiv.innerHTML = `✅ Ставка: Ящик №${boxIndex+1} будет самым редким. Нажмите «Начать слепую серию»!`;
    }
    
    function generateReport() {
        if (!seriesStarted && currentRoundIndex === 0) {
            return "📭 Нет данных. Сначала сделайте ставку и проведите 100 раундов.";
        }
        const minCount = Math.min(...prizeLocation);
        const rarestBoxes = [];
        for (let i = 0; i < 3; i++) if (prizeLocation[i] === minCount) rarestBoxes.push(i+1);
        const isBetWon = betBox !== null && rarestBoxes.includes(betBox+1);
        
        let report = `═══════════════════════════════════════\n`;
        report += `🎲 СЛЕПОЙ ЭКСПЕРИМЕНТ (100 раундов, призы предопределены)\n`;
        report += `═══════════════════════════════════════\n\n`;
        report += `📅 Дата: ${new Date().toLocaleString()}\n\n`;
        report += `🎯 ВАША СТАВКА: Ящик №${betBox !== null ? betBox+1 : 'не сделана'} — будет самым редким\n\n`;
        report += `📊 РЕАЛЬНЫЕ РЕЗУЛЬТАТЫ (все призы были сгенерированы ДО вашей игры):\n`;
        report += `   ▸ Ящик №1 выпал ${prizeLocation[0]} раз (${(prizeLocation[0]/1).toFixed(1)}%)\n`;
        report += `   ▸ Ящик №2 выпал ${prizeLocation[1]} раз (${(prizeLocation[1]/1).toFixed(1)}%)\n`;
        report += `   ▸ Ящик №3 выпал ${prizeLocation[2]} раз (${(prizeLocation[2]/1).toFixed(1)}%)\n\n`;
        report += `🎲 Самый редкий ящик(и): №${rarestBoxes.join(', ')} (${minCount} раз)\n\n`;
        report += `🏆 РЕЗУЛЬТАТ СТАВКИ: ${isBetWon ? '✅ ВЫИГРАНА! ✅' : '❌ ПРОИГРАНА ❌'}\n\n`;
        report += `📦 ВАША ИГРА (какие ящики вы открывали):\n`;
        report += `   ▸ Открыли ящик №1: ${playerOpened[0]} раз\n`;
        report += `   ▸ Открыли ящик №2: ${playerOpened[1]} раз\n`;
        report += `   ▸ Открыли ящик №3: ${playerOpened[2]} раз\n\n`;
        report += `🏅 Точность угадывания приза: ${winTotal}/${winTotal+loseTotal} = ${winTotal+loseTotal === 0 ? 0 : Math.round((winTotal/(winTotal+loseTotal))*100)}%\n`;
        report += `═══════════════════════════════════════\n`;
        report += `💬 ВЫВОД: Вы играли вслепую, не зная призов заранее. Результат ставки зависит только от случайности.`;
        return report;
    }
    
    function showReport() {
        const report = generateReport();
        reportArea.innerHTML = report.replace(/\n/g, '<br>');
        reportArea.style.display = 'block';
        navigator.clipboard.writeText(report).then(() => {
            gameMessageDiv.innerHTML = '✅ Отчёт скопирован в буфер! Вставьте его в чат.';
        }).catch(() => {
            gameMessageDiv.innerHTML = '📋 Отчёт показан ниже — скопируйте вручную.';
        });
    }
    
    function exportCSV() {
        if (roundHistory.length === 0) {
            gameMessageDiv.innerHTML = 'Нет данных для экспорта. Сначала проведите раунды.';
            return;
        }
        let csv = "Раунд,Где был приз (реально),Какой ящик открыл игрок,Победа?\n";
        roundHistory.forEach(r => {
            csv += `${r.roundNum},${r.prizeBox},${r.playerFinalBox},${r.isWin ? "Да" : "Нет"}\n`;
        });
        const blob = new Blob([csv], {type: 'text/csv'});
        const url = URL.createObjectURL(blob);
        const a = document.createElement('a');
        a.href = url;
        a.download = `blind_experiment_100_rounds_${Date.now()}.csv`;
        a.click();
        URL.revokeObjectURL(url);
        gameMessageDiv.innerHTML = '📁 CSV файл скачан.';
    }
    
    function renderBoxes(reveal = false) {
        let html = '';
        for (let i = 0; i < 3; i++) {
            let isSelected = (selectedBoxIndex === i);
            let contentIcon = '🎁?';
            let labelText = `Ящик ${i+1}`;
            let addClass = '';
            if (!roundFinished && gameActive) {
                if (isSelected) addClass = 'selected';
            } else if (roundFinished && reveal) {
                addClass = 'disabled';
                if (i === currentPrizeBox) { contentIcon = '🏆✨'; labelText = 'ПРИЗ!'; }
                else { contentIcon = '🍂❌'; labelText = 'Пусто'; }
            } else if (roundFinished && !reveal) {
                addClass = 'disabled';
            }
            let clickable = (!roundFinished && gameActive && seriesActive);
            html += `<div class="box ${addClass}" ${clickable ? `onclick="selectBox(${i})"` : ''} style="cursor: ${clickable ? 'pointer' : 'default'}">
                        <div class="box-icon">${contentIcon}</div>
                        <div class="box-label">${labelText}</div>
                    </div>`;
        }
        boxesContainer.innerHTML = html;
    }
    
    // Назначение обработчиков
    window.selectBox = selectBox;
    window.confirmChoice = confirmChoice;
    window.changeAndOpen = changeAndOpen;
    
    confirmBtn.onclick = () => confirmChoice();
    changeBtn.onclick = () => changeAndOpen();
    nextRoundBtn.onclick = () => nextRound();
    startSeriesBtn.onclick = () => startSeries();
    showReportBtn.onclick = () => showReport();
    exportCSVBtn.onclick = () => exportCSV();
    
    bet1Btn.onclick = () => setBet(0);
    bet2Btn.onclick = () => setBet(1);
    bet3Btn.onclick = () => setBet(2);
    
    // Инициализация
    seriesActive = false;
    betBox = null;
    seriesStarted = false;
    updateStatsUI();
    renderBoxes();
    gameMessageDiv.innerHTML = '✨ Сделайте ставку → «Начать слепую серию» → играйте 100 раундов (призы уже предопределены, но вы их не видите) ✨';
</script>
</body>
</html>

вот с такой статистикой сейчас удалось завершить

═══════════════════════════════════════
🎲 СЛЕПОЙ ЭКСПЕРИМЕНТ (100 раундов, призы предопределены)
═══════════════════════════════════════

📅 Дата: 03.06.2026, 10:22:53

🎯 ВАША СТАВКА: Ящик №1 — будет самым редким

📊 РЕАЛЬНЫЕ РЕЗУЛЬТАТЫ (все призы были сгенерированы ДО вашей игры):
   ▸ Ящик №1 выпал 26 раз (26.0%)
   ▸ Ящик №2 выпал 38 раз (38.0%)
   ▸ Ящик №3 выпал 36 раз (36.0%)

🎲 Самый редкий ящик(и): №1 (26 раз)

🏆 РЕЗУЛЬТАТ СТАВКИ: ✅ ВЫИГРАНА! ✅

📦 ВАША ИГРА (какие ящики вы открывали):
   ▸ Открыли ящик №1: 2 раз
   ▸ Открыли ящик №2: 72 раз
   ▸ Открыли ящик №3: 26 раз

🏅 Точность угадывания приза: 40/100 = 40%
═══════════════════════════════════════
💬 ВЫВОД: Вы играли вслепую, не зная призов заранее. Результат ставки зависит только от случайности.

что то меня заинтересовал рандом, и как его побеждать, с таким не большим количеством вариантов, а там может рулетку сделаю, и буду учиться 37 чисел угадывать (вроде 37 с зеро)

p.s. это еще не точно, но кажется научился угадывать какой ящик выпадет менее всего, открывая их определенным образом… однако точность угадывания при этом у меня бывает разная, может у кого то так же получится угадать… статистика копируется в буфер автоматом, после того как нажмете показать отчет

BABOS! Иди работай . Тогда желание заниматься херней пройдет.

Штирлиц вот на больное давите! вы думаете я не пытаюсь устроиться ? пока что только предложение ползать на коленях вижу на ххру, при этом за копейки…
но я занимаюсь воспитанием наших работодателей, некоторые и правда даже меняют отношение, еще чуть чуть, и может даже не будут приглашать на собеседование кучу народа, а проводить его дистанционно, ну или платить начнут подъемные… за свое отношение, а так же вылижут свои объявления, по которым можно оценить, стоит ли работать у них, какой объем работ, и все ли они описали, или все таки пусть подъемные платят…)))
после того как очередной работодатель сказал мне что что бы получать больше, я был обязан еще и научиться продавать себя… при этом он не воспитал, и не обучил ни одного работника, я немного офигел, и понял как себя надо вести с ними))) сейчас менталитет у них измениться, и если я подойду кому, пойду, но не раньше чем месяца через 3, а то сейчас занимаюсь еще своим здоровьем)))

Я хотел вообще в паблик, но постеснялся, чтобы не травмировать Вас лично. А чем плоха картинка, которая отражает (возможно) Ваш внутренний мир?

Типа, научил его онанизму?

тем что она вообще не отражает меня, и вообще вредна для сознания! то что не скинули сюда правильно, а то еще других покалечите…

Т.е. вы занимаетесь тролингом не только тут. Вам боком выйдет воспитание работодателей. Они достаточно быстро положат Вас в черный список людей, которые просто морочат голову.

Прежде чем делать выводы - покажи картинку другу и спроси - отражает она твой внутренний мир или нет. Самокритика помогает самовоспитанию личности.

это будет замечательно, потому что они создают объявление заново, и если я их добавил в черный список, все равно выходит что иногда я снова натыкаюсь на них…

если DetSimen не против, и отпуск есть,(что бы в это время на них поработать) и возможно он бы подошел им, не смотря на то что вроде любой подойдет, они наверняка те еще привереды, и возьмут человека только с большим опытом https://hh.ru/vacancy/133720309 и главное оплата 300к в месяц а не за проект, объемы которого не понятны… можно было бы провести эксперимент, реально ли найти работу или нет))