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) {

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

} 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) {

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

} else if (redCount > blackCount) {

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

} 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>

posted @ 2025-12-14 12:43  clnchanpin  阅读(2)  评论(0)    收藏  举报