当前位置: 首页 > news >正文

11.14 脚本网页游戏 猜黑红

   一  博主想起小时候和爷爷一起玩的游戏。索性记复刻一下,以后的模型优化,我们还可以增加音色什么 

      在此提供一个基础的蓝本。

  二  以下为单页面即可玩

 

<!DOCTYPE html>

<html lang="zh-CN">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>猜黑红扑克牌游戏</title>

    <style>

        * {

            box-sizing: border-box;

            margin: 0;

            padding: 0;

            font-family: 'Microsoft YaHei', sans-serif;

        }

        

        body {

            color: #fff;

            min-height: 100vh;

            padding: 10px;

            display: flex;

            flex-direction: column;

            align-items: center;

            touch-action: manipulation;

            transition: background 0.5s ease;

        }

        

        .container {

            width: 100%;

            max-width: 900px;

            display: flex;

            flex-direction: column;

            gap: 15px;

        }

        

        header {

            text-align: center;

            padding: 10px;

            background: rgba(0, 0, 0, 0.3);

            border-radius: 10px;

            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);

        }

        

        h1 {

            font-size: 1.8rem;

            margin-bottom: 5px;

            text-shadow: 0 2px 4px rgba(0, 0, 0, 0.5);

            color: #ffd700;

        }

        

        .game-info {

            display: flex;

            justify-content: space-between;

            background: rgba(0, 0, 0, 0.3);

            padding: 10px;

            border-radius: 10px;

            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);

        }

        

        .player-info, .ai-info {

            display: flex;

            flex-direction: column;

            align-items: center;

            gap: 5px;

        }

        

        .card-count {

            font-size: 1.2rem;

            font-weight: bold;

        }

        

        .player-area, .ai-area {

            display: flex;

            flex-direction: column;

            gap: 10px;

            background: rgba(0, 0, 0, 0.3);

            padding: 15px;

            border-radius: 10px;

            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);

        }

        

        .area-title {

            text-align: center;

            font-size: 1.2rem;

            color: #ffd700;

            margin-bottom: 5px;

        }

        

        .hand-cards {

            display: flex;

            flex-wrap: nowrap;

            overflow-x: auto;

            gap: 2px;

            justify-content: flex-start;

            min-height: 90px;

            padding: 5px;

            -webkit-overflow-scrolling: touch;

        }

        

        .card {

            width: 60px;

            height: 85px;

            border-radius: 6px;

            display: flex;

            flex-direction: column;

            justify-content: space-between;

            padding: 5px;

            font-weight: bold;

            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);

            transition: transform 0.3s, box-shadow 0.3s;

            cursor: pointer;

            position: relative;

            overflow: hidden;

            flex-shrink: 0;

        }

        

        .card::before {

            content: '';

            position: absolute;

            top: 0;

            left: 0;

            right: 0;

            bottom: 0;

            background: linear-gradient(135deg, rgba(255,255,255,0.1), rgba(255,255,255,0.05));

            z-index: 1;

            pointer-events: none;

        }

        

        .card.red {

            background: linear-gradient(135deg, #f8f8f8, #e0e0e0);

            color: #d40000;

            border: 2px solid #d40000;

        }

        

        .card.black {

            background: linear-gradient(135deg, #f8f8f8, #e0e0e0);

            color: #000;

            border: 2px solid #000;

        }

        

        .card.back {

            background: linear-gradient(135deg, #1a3a5f, #2a5a8f);

            color: white;

            border: 2px solid #ffd700;

        }

        

        .card.selected {

            transform: translateY(-10px);

            box-shadow: 0 8px 16px rgba(0, 0, 0, 0.5);

            border: 2px solid #ffd700;

        }

        

        .card-value {

            font-size: 1rem;

            z-index: 2;

        }

        

        .card-suit {

            font-size: 1.4rem;

            align-self: center;

            z-index: 2;

        }

        

        .card-corner {

            font-size: 0.7rem;

            z-index: 2;

        }

        

        .game-area {

            display: flex;

            flex-direction: column;

            align-items: center;

            gap: 15px;

            background: rgba(0, 0, 0, 0.3);

            padding: 15px;

            border-radius: 10px;

            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);

        }

        

        .betting-area {

            display: flex;

            gap: 10px;

            align-items: center;

            margin: 5px 0;

        }

        

        .bet-cards {

            display: flex;

            gap: 5px;

            min-height: 90px;

            flex-wrap: wrap;

            justify-content: center;

        }

        

        .controls {

            display: flex;

            gap: 10px;

            flex-wrap: wrap;

            justify-content: center;

        }

        

        button {

            padding: 10px 20px;

            border: none;

            border-radius: 25px;

            font-size: 0.9rem;

            font-weight: bold;

            cursor: pointer;

            transition: all 0.3s;

            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);

            min-width: 120px;

        }

        

        .primary-btn {

            background: linear-gradient(135deg, #ff6b6b, #ff8e8e);

            color: white;

        }

        

        .secondary-btn {

            background: linear-gradient(135deg, #4ecdc4, #6ae6dd);

            color: white;

        }

        

        .choice-btn {

            background: linear-gradient(135deg, #ffd166, #ffdc87);

            color: #333;

            padding: 12px 20px;

            font-size: 0.9rem;

        }

        

        button:hover {

            transform: translateY(-2px);

            box-shadow: 0 6px 12px rgba(0, 0, 0, 0.4);

        }

        

        button:active {

            transform: translateY(1px);

        }

        

        button:disabled {

            background: #666;

            cursor: not-allowed;

            transform: none;

            box-shadow: none;

        }

        

        .message {

            padding: 10px;

            background: rgba(0, 0, 0, 0.5);

            border-radius: 8px;

            text-align: center;

            min-height: 50px;

            display: flex;

            align-items: center;

            justify-content: center;

            font-size: 1rem;

            margin: 5px 0;

            width: 100%;

        }

        

        .zoom-controls {

            position: fixed;

            bottom: 15px;

            right: 15px;

            display: flex;

            gap: 8px;

            flex-direction: column;

            align-items: center;

        }

        

        .zoom-btn {

            width: 40px;

            height: 40px;

            border-radius: 50%;

            display: flex;

            align-items: center;

            justify-content: center;

            font-size: 1.2rem;

            background: rgba(0, 0, 0, 0.5);

            color: white;

            border: 2px solid #ffd700;

        }

        

        .theme-btn {

            width: 40px;

            height: 40px;

            border-radius: 50%;

            display: flex;

            align-items: center;

            justify-content: center;

            font-size: 1.2rem;

            background: rgba(0, 0, 0, 0.5);

            color: white;

            border: 2px solid #ffd700;

            margin-top: 10px;

        }

        

        @media (max-width: 480px) {

            .container {

                gap: 10px;

            }

            

            h1 {

                font-size: 1.5rem;

            }

            

            .card {

                width: 50px;

                height: 70px;

            }

            

            .card-suit {

                font-size: 1.2rem;

            }

            

            .card-value {

                font-size: 0.9rem;

            }

            

            button {

                padding: 8px 15px;

                font-size: 0.8rem;

                min-width: 100px;

            }

            

            .choice-btn {

                padding: 10px 15px;

                font-size: 0.8rem;

            }

            

            .hand-cards {

                min-height: 75px;

            }

        }

        

        .current-turn {

            border: 2px solid #ffd700;

            box-shadow: 0 0 10px #ffd700;

        }

        

        .selection-count {

            margin-top: 5px;

            font-size: 0.9rem;

            color: #ffd700;

        }

        

        .result-message {

            background: rgba(255, 215, 0, 0.2);

            border: 1px solid #ffd700;

            padding: 10px;

            border-radius: 5px;

            margin: 5px 0;

        }

    </style>

</head>

<body>

    <div class="container">

        <header>

            <h1>猜黑红扑克牌游戏</h1>

            <p>选择黑色多、红色多还是一样多,猜对赢得所有牌,猜错则输掉牌!</p>

        </header>

        

        <div class="game-info">

            <div class="player-info">

                <h2>玩家</h2>

                <div class="card-count">手牌: <span id="player-count">26</span>张</div>

            </div>

            <div class="ai-info">

                <h2>AI对手</h2>

                <div class="card-count">手牌: <span id="ai-count">26</span>张</div>

            </div>

        </div>

        

        <div class="ai-area">

            <div class="area-title">AI的手牌</div>

            <div class="hand-cards" id="ai-cards">

                <!-- AI的牌将由JS生成 -->

            </div>

        </div>

        

        <div class="game-area">

            <div class="area-title">出牌区</div>

            <div class="betting-area">

                <div class="bet-cards" id="bet-cards">

                    <!-- 出牌区的牌将由JS生成 -->

                </div>

            </div>

            

            <div class="message" id="game-message">

                游戏准备开始,请点击"开始游戏"按钮

            </div>

            

            <div class="controls">

                <button id="start-btn" class="primary-btn">开始游戏</button>

                <button id="restart-btn" class="secondary-btn">重新开始</button>

                <button id="play-cards-btn" class="primary-btn" disabled>出牌</button>

                <button id="guess-black-btn" class="choice-btn" disabled>猜黑色多</button>

                <button id="guess-red-btn" class="choice-btn" disabled>猜红色多</button>

                <button id="guess-equal-btn" class="choice-btn" disabled>猜一样多</button>

            </div>

        </div>

        

        <div class="player-area">

            <div class="area-title">你的手牌</div>

            <div class="hand-cards" id="player-cards">

                <!-- 玩家的牌将由JS生成 -->

            </div>

            <div class="selection-count" id="selection-count">已选择 0 张牌 (最多7张)</div>

        </div>

    </div>

    

    <div class="zoom-controls">

        <button class="zoom-btn" id="zoom-in">+</button>

        <button class="zoom-btn" id="zoom-out">-</button>

        <button class="zoom-btn" id="reset-zoom">100%</button>

        <button class="theme-btn" id="change-theme">🎨</button>

    </div>

 

    <script>

        // 游戏状态

        const gameState = {

            playerCards: [],

            aiCards: [],

            betCards: [],

            currentPlayer: 'player', // 'player' 或 'ai'

            gameStarted: false,

            maxBetCards: 7,

            currentBetCount: 0,

            playerSelectedCards: [],

            aiErrorRate: 0.2, // AI有20%的概率猜错

            betCardsRevealed: false // 出牌区的牌是否已揭晓

        };

        

        // 扑克牌花色和点数

        const suits = ['♠', '♥', '♦', '♣'];

        const values = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'];

        

        // 预定义的背景颜色数组

        const backgroundThemes = [

            'linear-gradient(135deg, #1a2a3a, #2d4a5c)',

            'linear-gradient(135deg, #2d1a3a, #5c2d4a)',

            'linear-gradient(135deg, #3a2a1a, #5c4a2d)',

            'linear-gradient(135deg, #1a3a2a, #2d5c4a)',

            'linear-gradient(135deg, #3a1a2a, #5c2d4a)',

            'linear-gradient(135deg, #2a1a3a, #4a2d5c)',

            'linear-gradient(135deg, #1a3a3a, #2d5c5c)',

            'linear-gradient(135deg, #3a3a1a, #5c5c2d)',

            'linear-gradient(135deg, #3a1a1a, #5c2d2d)',

            'linear-gradient(135deg, #1a1a3a, #2d2d5c)',

            'linear-gradient(135deg, #3a2a3a, #5c4a5c)',

            'linear-gradient(135deg, #2a3a1a, #4a5c2d)',

            'linear-gradient(135deg, #1a2a2a, #2d4a4a)',

            'linear-gradient(135deg, #2a1a1a, #4a2d2d)',

            'linear-gradient(135deg, #1a1a1a, #2d2d2d)'

        ];

        

        // DOM元素

        const playerCardsEl = document.getElementById('player-cards');

        const aiCardsEl = document.getElementById('ai-cards');

        const betCardsEl = document.getElementById('bet-cards');

        const playerCountEl = document.getElementById('player-count');

        const aiCountEl = document.getElementById('ai-count');

        const gameMessageEl = document.getElementById('game-message');

        const selectionCountEl = document.getElementById('selection-count');

        

        // 按钮

        const startBtn = document.getElementById('start-btn');

        const restartBtn = document.getElementById('restart-btn');

        const playCardsBtn = document.getElementById('play-cards-btn');

        const guessBlackBtn = document.getElementById('guess-black-btn');

        const guessRedBtn = document.getElementById('guess-red-btn');

        const guessEqualBtn = document.getElementById('guess-equal-btn');

        const zoomInBtn = document.getElementById('zoom-in');

        const zoomOutBtn = document.getElementById('zoom-out');

        const resetZoomBtn = document.getElementById('reset-zoom');

        const changeThemeBtn = document.getElementById('change-theme');

        

        // 初始化游戏

        function initGame() {

            gameState.gameStarted = false;

            gameState.playerCards = [];

            gameState.aiCards = [];

            gameState.betCards = [];

            gameState.currentPlayer = 'player';

            gameState.currentBetCount = 0;

            gameState.playerSelectedCards = [];

            gameState.betCardsRevealed = false;

            

            // 创建一副扑克牌

            const deck = [];

            for (let suit of suits) {

                for (let value of values) {

                    const isRed = suit === '♥' || suit === '♦';

                    deck.push({

                        suit: suit,

                        value: value,

                        isRed: isRed,

                        color: isRed ? 'red' : 'black',

                        id: `${suit}-${value}` // 添加唯一标识符

                    });

                }

            }

            

            // 洗牌

            shuffleDeck(deck);

            

            // 发牌给玩家和AI

            for (let i = 0; i < deck.length; i++) {

                if (i % 2 === 0) {

                    gameState.playerCards.push(deck[i]);

                } else {

                    gameState.aiCards.push(deck[i]);

                }

            }

            

            // 更新UI

            updateUI();

            

            // 更新消息

            gameMessageEl.textContent = "游戏已准备,请点击'开始游戏'按钮";

            

            // 启用/禁用按钮

            startBtn.disabled = false;

            playCardsBtn.disabled = true;

            guessBlackBtn.disabled = true;

            guessRedBtn.disabled = true;

            guessEqualBtn.disabled = true;

            

            // 更新选择计数

            updateSelectionCount();

        }

        

        // 洗牌函数

        function shuffleDeck(deck) {

            for (let i = deck.length - 1; i > 0; i--) {

                const j = Math.floor(Math.random() * (i + 1));

                [deck[i], deck[j]] = [deck[j], deck[i]];

            }

        }

        

        // 开始游戏

        function startGame() {

            if (gameState.gameStarted) return;

            

            gameState.gameStarted = true;

            gameState.currentPlayer = 'player';

            gameMessageEl.textContent = "你的回合:请选择1-7张牌出牌";

            

            // 启用/禁用按钮

            startBtn.disabled = true;

            playCardsBtn.disabled = false;

            guessBlackBtn.disabled = true;

            guessRedBtn.disabled = true;

            guessEqualBtn.disabled = true;

            

            updateUI();

        }

        

        // 更新UI

        function updateUI() {

            // 更新玩家手牌

            playerCardsEl.innerHTML = '';

            gameState.playerCards.forEach((card, index) => {

                const cardEl = createCardElement(card, index, 'player');

                playerCardsEl.appendChild(cardEl);

            });

            

            // 更新AI手牌(背面显示)

            aiCardsEl.innerHTML = '';

            gameState.aiCards.forEach((card, index) => {

                const cardEl = createCardElement(card, index, 'ai');

                aiCardsEl.appendChild(cardEl);

            });

            

            // 更新出牌区

            betCardsEl.innerHTML = '';

            gameState.betCards.forEach((card, index) => {

                const cardEl = createCardElement(card, index, 'bet');

                betCardsEl.appendChild(cardEl);

            });

            

            // 更新牌数

            playerCountEl.textContent = gameState.playerCards.length;

            aiCountEl.textContent = gameState.aiCards.length;

            

            // 高亮当前回合的玩家区域

            document.querySelector('.player-area').classList.toggle('current-turn', gameState.currentPlayer === 'player');

            document.querySelector('.ai-area').classList.toggle('current-turn', gameState.currentPlayer === 'ai');

            

            // 更新选择计数

            updateSelectionCount();

        }

        

        // 创建卡牌元素

        function createCardElement(card, index, owner) {

            const cardEl = document.createElement('div');

            

            // 决定卡牌显示方式

            let displayType = 'front';

            if (owner === 'ai') {

                // AI的手牌始终显示背面

                displayType = 'back';

            } else if (owner === 'bet') {

                // 出牌区的牌:如果已揭晓则显示正面,否则显示背面

                displayType = gameState.betCardsRevealed ? 'front' : 'back';

            }

            

            cardEl.className = `card ${displayType === 'back' ? 'back' : card.color}`;

            cardEl.dataset.id = card.id; // 添加数据标识

            

            if (displayType === 'back') {

                // 显示背面

                cardEl.innerHTML = `

                    <div class="card-corner"></div>

                    <div class="card-suit"></div>

                    <div class="card-value"></div>

                `;

            } else {

                // 显示正面

                cardEl.innerHTML = `

                    <div class="card-corner">${card.value}${card.suit}</div>

                    <div class="card-suit">${card.suit}</div>

                    <div class="card-value">${card.value}${card.suit}</div>

                `;

            }

            

            // 如果是玩家的牌,添加点击事件

            if (owner === 'player' && gameState.currentPlayer === 'player' && gameState.gameStarted) {

                cardEl.addEventListener('click', () => selectCard(card.id));

            }

            

            // 如果牌被选中,添加选中样式

            if (gameState.playerSelectedCards.includes(card.id)) {

                cardEl.classList.add('selected');

            }

            

            return cardEl;

        }

        

        // 更新选择计数显示

        function updateSelectionCount() {

            const count = gameState.playerSelectedCards.length;

            const max = Math.min(gameState.maxBetCards, gameState.playerCards.length);

            selectionCountEl.textContent = `已选择 ${count} 张牌 (最多${max}张)`;

        }

        

        // 选择卡牌

        function selectCard(cardId) {

            if (gameState.currentPlayer !== 'player' || !gameState.gameStarted) return;

            

            const maxSelect = Math.min(gameState.maxBetCards, gameState.playerCards.length);

            

            if (gameState.playerSelectedCards.includes(cardId)) {

                // 取消选择

                gameState.playerSelectedCards = gameState.playerSelectedCards.filter(id => id !== cardId);

            } else {

                // 选择牌

                if (gameState.playerSelectedCards.length < maxSelect) {

                    gameState.playerSelectedCards.push(cardId);

                } else {

                    gameMessageEl.textContent = `最多只能选择${maxSelect}张牌`;

                    return;

                }

            }

            

            updateUI();

            

            // 更新消息

            if (gameState.playerSelectedCards.length > 0) {

                gameMessageEl.textContent = `已选择 ${gameState.playerSelectedCards.length} 张牌,点击"出牌"按钮确认`;

            } else {

                gameMessageEl.textContent = "你的回合:请选择1-7张牌出牌";

            }

        }

        

        // 玩家出牌

        function playerPlayCards() {

            if (gameState.currentPlayer !== 'player' || !gameState.gameStarted) return;

            

            if (gameState.playerSelectedCards.length === 0) {

                gameMessageEl.textContent = "请至少选择一张牌出牌";

                return;

            }

            

            if (gameState.playerSelectedCards.length > gameState.maxBetCards) {

                gameMessageEl.textContent = `每次最多只能出${gameState.maxBetCards}张牌`;

                return;

            }

            

            // 将选中的牌移到出牌区

            const selectedCards = gameState.playerCards.filter(card => 

                gameState.playerSelectedCards.includes(card.id)

            );

            

            // 从玩家手牌中移除选中的牌

            gameState.playerCards = gameState.playerCards.filter(card => 

                !gameState.playerSelectedCards.includes(card.id)

            );

            

            // 添加到出牌区

            gameState.betCards = selectedCards;

            gameState.currentBetCount = selectedCards.length;

            gameState.playerSelectedCards = [];

            gameState.betCardsRevealed = false; // 出牌区的牌未揭晓

            

            // 切换到AI猜测

            gameState.currentPlayer = 'ai';

            gameMessageEl.textContent = "AI正在思考...";

            

            // 禁用出牌按钮

            playCardsBtn.disabled = true;

            

            // 更新UI

            updateUI();

            

            // AI在1.5秒后做出猜测

            setTimeout(aiGuess, 1500);

        }

        

        // AI猜测

        function aiGuess() {

            if (gameState.currentPlayer !== 'ai' || !gameState.gameStarted) return;

            

            // 计算黑色和红色牌的数量

            let blackCount = 0;

            let redCount = 0;

            

            gameState.betCards.forEach(card => {

                if (card.isRed) {

                    redCount++;

                } else {

                    blackCount++;

                }

            });

            

            // AI根据概率做出猜测,但有20%的概率故意猜错

            let aiGuess;

            const shouldMakeError = Math.random() < gameState.aiErrorRate;

            

            if (shouldMakeError) {

                // AI故意猜错

                if (blackCount > redCount) {

                    aiGuess = Math.random() > 0.5 ? 'red' : 'equal';

                } else if (redCount > blackCount) {

                    aiGuess = Math.random() > 0.5 ? 'black' : 'equal';

                } else {

                    aiGuess = Math.random() > 0.5 ? 'black' : 'red';

                }

            } else {

                // AI正常猜测

                if (blackCount > redCount) {

                    aiGuess = 'black';

                } else if (redCount > blackCount) {

                    aiGuess = 'red';

                } else {

                    aiGuess = 'equal';

                }

            }

            

            // 显示AI的猜测

            let guessText = '';

            if (aiGuess === 'black') {

                guessText = '黑色多';

            } else if (aiGuess === 'red') {

                guessText = '红色多';

            } else {

                guessText = '一样多';

            }

            gameMessageEl.textContent = `AI猜测是${guessText}`;

            

            // 判断猜测结果

            const correctGuess = (aiGuess === 'black' && blackCount > redCount) || 

                                (aiGuess === 'red' && redCount > blackCount) ||

                                (aiGuess === 'equal' && blackCount === redCount);

            

            // 1秒后显示结果

            setTimeout(() => {

                // 揭晓牌面

                gameState.betCardsRevealed = true;

                updateUI();

                

                if (correctGuess) {

                    // AI猜对了,牌给AI

                    gameState.aiCards = gameState.aiCards.concat(gameState.betCards);

                    gameMessageEl.innerHTML = `<div class="result-message">AI猜对了!AI获得了${gameState.betCards.length}张牌</div>`;

                } else {

                    // AI猜错了,牌给玩家

                    gameState.playerCards = gameState.playerCards.concat(gameState.betCards);

                    gameMessageEl.innerHTML = `<div class="result-message">AI猜错了!你获得了${gameState.betCards.length}张牌</div>`;

                }

                

                // 显示实际结果

                let actualResult = '';

                if (blackCount > redCount) {

                    actualResult = `实际是黑色多(${blackCount}黑 ${redCount}红)`;

                } else if (redCount > blackCount) {

                    actualResult = `实际是红色多(${blackCount}黑 ${redCount}红)`;

                } else {

                    actualResult = `实际是一样多(${blackCount}黑 ${redCount}红)`;

                }

                gameMessageEl.innerHTML += `<div class="result-message">${actualResult}</div>`;

                

                gameState.betCards = [];

                

                // 检查游戏是否结束

                if (checkGameOver()) {

                    return;

                }

                

                // 延迟2秒后切换到AI出牌

                setTimeout(() => {

                    // 切换到AI出牌,玩家猜测

                    gameState.currentPlayer = 'ai';

                    

                    // 2秒后AI出牌

                    setTimeout(aiPlayCards, 2000);

                }, 2000);

            }, 1000);

        }

        

        // AI出牌

        function aiPlayCards() {

            if (gameState.currentPlayer !== 'ai' || !gameState.gameStarted) return;

            

            gameMessageEl.textContent = "AI正在出牌...";

            

            // AI随机选择1-7张牌(不超过手牌数)

            const maxCards = Math.min(gameState.maxBetCards, gameState.aiCards.length);

            const numCards = Math.floor(Math.random() * maxCards) + 1;

            

            // 随机选择牌

            const selectedCards = [];

            for (let i = 0; i < numCards; i++) {

                if (gameState.aiCards.length === 0) break;

                const randomIndex = Math.floor(Math.random() * gameState.aiCards.length);

                selectedCards.push(gameState.aiCards[randomIndex]);

                gameState.aiCards.splice(randomIndex, 1);

            }

            

            // 添加到出牌区

            gameState.betCards = selectedCards;

            gameState.currentBetCount = selectedCards.length;

            gameState.betCardsRevealed = false; // 出牌区的牌未揭晓

            

            // 更新UI

            updateUI();

            

            gameMessageEl.textContent = `AI出了${numCards}张牌,请猜测是黑色多、红色多还是一样多`;

            

            // 切换到玩家猜测

            gameState.currentPlayer = 'player';

            

            // 启用猜测按钮

            guessBlackBtn.disabled = false;

            guessRedBtn.disabled = false;

            guessEqualBtn.disabled = false;

        }

        

        // 玩家猜测

        function playerGuess(guess) {

            if (gameState.currentPlayer !== 'player' || !gameState.gameStarted) return;

            

            // 计算黑色和红色牌的数量

            let blackCount = 0;

            let redCount = 0;

            

            gameState.betCards.forEach(card => {

                if (card.isRed) {

                    redCount++;

                } else {

                    blackCount++;

                }

            });

            

            // 显示玩家的猜测

            let guessText = '';

            if (guess === 'black') {

                guessText = '黑色多';

            } else if (guess === 'red') {

                guessText = '红色多';

            } else {

                guessText = '一样多';

            }

            gameMessageEl.textContent = `你猜测是${guessText}`;

            

            // 判断猜测结果

            const correctGuess = (guess === 'black' && blackCount > redCount) || 

                                (guess === 'red' && redCount > blackCount) ||

                                (guess === 'equal' && blackCount === redCount);

            

            // 禁用猜测按钮

            guessBlackBtn.disabled = true;

            guessRedBtn.disabled = true;

            guessEqualBtn.disabled = true;

            

            // 1秒后显示结果

            setTimeout(() => {

                // 揭晓牌面

                gameState.betCardsRevealed = true;

                updateUI();

                

                if (correctGuess) {

                    // 玩家猜对了,牌给玩家

                    gameState.playerCards = gameState.playerCards.concat(gameState.betCards);

                    gameMessageEl.innerHTML = `<div class="result-message">你猜对了!你获得了${gameState.betCards.length}张牌</div>`;

                } else {

                    // 玩家猜错了,牌给AI

                    gameState.aiCards = gameState.aiCards.concat(gameState.betCards);

                    gameMessageEl.innerHTML = `<div class="result-message">你猜错了!AI获得了${gameState.betCards.length}张牌</div>`;

                }

                

                // 显示实际结果

                let actualResult = '';

                if (blackCount > redCount) {

                    actualResult = `实际是黑色多(${blackCount}黑 ${redCount}红)`;

                } else if (redCount > blackCount) {

                    actualResult = `实际是红色多(${blackCount}黑 ${redCount}红)`;

                } else {

                    actualResult = `实际是一样多(${blackCount}黑 ${redCount}红)`;

                }

                gameMessageEl.innerHTML += `<div class="result-message">${actualResult}</div>`;

                

                gameState.betCards = [];

                

                // 检查游戏是否结束

                if (checkGameOver()) {

                    return;

                }

                

                // 延迟2秒后切换到玩家出牌

                setTimeout(() => {

                    // 切换到玩家出牌,AI猜测

                    gameState.currentPlayer = 'player';

                    gameMessageEl.textContent = "你的回合:请选择1-7张牌出牌";

                    

                    // 启用出牌按钮

                    playCardsBtn.disabled = false;

                    

                    updateUI();

                }, 2000);

            }, 1000);

        }

        

        // 检查游戏是否结束

        function checkGameOver() {

            if (gameState.playerCards.length === 0) {

                gameMessageEl.textContent = "游戏结束!AI获胜!";

                endGame();

                return true;

            } else if (gameState.aiCards.length === 0) {

                gameMessageEl.textContent = "游戏结束!你获胜了!";

                endGame();

                return true;

            }

            return false;

        }

        

        // 结束游戏

        function endGame() {

            gameState.gameStarted = false;

            

            // 禁用所有游戏按钮

            playCardsBtn.disabled = true;

            guessBlackBtn.disabled = true;

            guessRedBtn.disabled = true;

            guessEqualBtn.disabled = true;

        }

        

        // 页面缩放功能

        let currentZoom = 100;

        

        function zoomPage(zoomLevel) {

            document.body.style.zoom = `${zoomLevel}%`;

            currentZoom = zoomLevel;

        }

        

        // 随机切换背景主题

        function changeBackgroundTheme() {

            const randomIndex = Math.floor(Math.random() * backgroundThemes.length);

            document.body.style.background = backgroundThemes[randomIndex];

        }

        

        // 事件监听器

        startBtn.addEventListener('click', startGame);

        restartBtn.addEventListener('click', initGame);

        playCardsBtn.addEventListener('click', playerPlayCards);

        guessBlackBtn.addEventListener('click', () => playerGuess('black'));

        guessRedBtn.addEventListener('click', () => playerGuess('red'));

        guessEqualBtn.addEventListener('click', () => playerGuess('equal'));

        

        zoomInBtn.addEventListener('click', () => {

            if (currentZoom < 150) {

                zoomPage(currentZoom + 10);

            }

        });

        

        zoomOutBtn.addEventListener('click', () => {

            if (currentZoom > 50) {

                zoomPage(currentZoom - 10);

            }

        });

        

        resetZoomBtn.addEventListener('click', () => {

            zoomPage(100);

        });

        

        changeThemeBtn.addEventListener('click', changeBackgroundTheme);

        

        // 初始化游戏

        initGame();

        

        // 页面加载时随机选择背景主题

        window.addEventListener('load', changeBackgroundTheme);

    </script>

</body>

</html>

 

 

http://www.dtcms.com/a/609858.html

相关文章:

  • 网站引导页的作用网络营销msn是什么
  • 余姚网站开发wordpress头像同步
  • vxe-table 配置 ajax 加载列表数据,配置分页和查询搜索表单
  • worldpress 建站直播app定制开发
  • Java IDEA学习之路:第九周课程笔记归纳
  • Node.js 配置管理:生物启发式系统与跨维度架构
  • 《强量化 Transformers:开启计算机视觉新篇》
  • 免费做店招的网站国外用wordpress
  • 网站制作器手机版北京网页设计制作
  • 互联网服务的全链路架构流程解析
  • ARM与x86交叉编译实战排错指南
  • Agentic RL 如何让语⾔ 模型成为⾃主智能体
  • k8s之Headless浅谈
  • 安卓Telephony中的 phoneId、subId、simSlotIndex含义对比
  • dw做的网站怎么传到网络上去哪里有做ppt模板下载网站
  • 快速建站费用wordpress 注册简码
  • 从出厂到交付:能源设备运输如何实现全程风险可视化?
  • Kubernetes环境部署Redis集群
  • 公司门禁使用操作说明书
  • Wireshark网络数据包分析工具完整教程与实战案例
  • 以往届优秀展商为镜,探2026航空发动机与燃气轮机展——新奥能源
  • 先买空间再写网站广州番禺伤人案
  • 人工智能之数据分析 numpy:第二章 简介与安装
  • 地图可视化实践录:使用Turf.js简化路线
  • 从零开始搭建Linux Web服务器
  • 南通网站建设制作html网页设计表格代码范文
  • Chrome 插件框架 Plasmo 基本使用示例
  • 一小时学做网站杭州高端网站设计
  • LinuxC语言文件i/o笔记(第十八天)
  • 上海网站设计哪家强常州做上市公司律所