<!DOCTYPE html>
<html lang=”zh-TW”>
<head>
<meta charset=”UTF-8″>
<meta name=”viewport” content=”width=device-width, initial-scale=1.0″>
<title>找不同小遊戲</title>
<!– 引入 Tailwind CSS 方便快速排版與設計響應式介面 –>
<script src=”https://cdn.tailwindcss.com”></script>
<style>
/* 匯入圓潤可愛的字體 */
@import url(‘https://fonts.googleapis.com/css2?family=Nunito:wght@400;700;900&display=swap’);
body {
font-family: ‘Nunito’, ‘微軟正黑體’, sans-serif;
/* 柔和的背景色 */
background-color: #fff0f5;
overflow-x: hidden;
}
/* 無邊框、圓角與柔和陰影設計 */
.game-card {
background: white;
border-radius: 30px;
box-shadow: 0 15px 35px rgba(255, 105, 180, 0.15);
transition: transform 0.3s ease;
}
.game-card:hover {
transform: translateY(-5px);
}
/* 遊戲圖示的樣式 */
.emoji-item {
font-size: 4rem;
cursor: pointer;
transition: all 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
user-select: none;
display: flex;
justify-content: center;
align-items: center;
background-color: #f8f9fa;
border-radius: 20px;
aspect-ratio: 1 / 1;
}
@media (max-width: 640px) {
.emoji-item {
font-size: 3rem;
}
}
.emoji-item:active {
transform: scale(0.85);
}
/* 點對時的歡呼動畫 */
.correct-anim {
animation: tada 1s ease-in-out forwards;
background-color: #d4edda !important; /* 變成淺綠色背景 */
}
/* 點錯時的搖晃動畫 */
.wrong-anim {
animation: shake 0.5s ease-in-out;
background-color: #f8d7da !important; /* 變成淺紅色背景 */
}
@keyframes tada {
0% { transform: scale(1); }
10%, 20% { transform: scale(0.9) rotate(-3deg); }
30%, 50%, 70%, 90% { transform: scale(1.2) rotate(5deg); }
40%, 60%, 80% { transform: scale(1.2) rotate(-5deg); }
100% { transform: scale(1.1) rotate(0); }
}
@keyframes shake {
0%, 100% { transform: translateX(0); }
20%, 60% { transform: translateX(-10px); }
40%, 80% { transform: translateX(10px); }
}
</style>
</head>
<body class=”min-h-screen flex flex-col items-center justify-center p-4 sm:p-8″>
<!– 標題區 –>
<header class=”text-center mb-8″>
<h1 class=”text-3xl sm:text-5xl font-black text-pink-500 mb-3 drop-shadow-sm”>👀 找找看,哪裡不一樣? 👀</h1>
<p class=”text-lg sm:text-xl text-gray-600 font-bold bg-white/60 inline-block px-6 py-2 rounded-full shadow-sm”>
請點擊<span class=”text-pink-500″>「右邊(或下方)」</span>圖片中,長得不一樣的圖案!
</p>
</header>
<!– 遊戲進度 –>
<div class=”mb-4 text-pink-400 font-bold text-xl”>
關卡 <span id=”current-level”>1</span> / 3
</div>
<!– 遊戲主要區域 –>
<main class=”w-full max-w-5xl flex flex-col lg:flex-row gap-8 justify-center items-center”>
<!– 左側:標準答案區 –>
<div class=”game-card w-full max-w-sm p-6 sm:p-8 relative”>
<div class=”absolute -top-4 -left-4 bg-blue-400 text-white font-bold px-4 py-1 rounded-full shadow-md transform -rotate-6″>標準圖案</div>
<div id=”left-grid” class=”grid grid-cols-2 gap-4 mt-2″>
<!– 圖案會由 JS 動態生成 –>
</div>
</div>
<!– 中間裝飾箭頭 –>
<div class=”hidden lg:block text-5xl text-pink-300 font-bold”>
👉
</div>
<div class=”block lg:hidden text-5xl text-pink-300 font-bold transform rotate-90″>
👉
</div>
<!– 右側:挑戰區 (玩家點擊這裡) –>
<div class=”game-card w-full max-w-sm p-6 sm:p-8 relative border-4 border-transparent hover:border-pink-200 cursor-default”>
<div class=”absolute -top-4 -right-4 bg-pink-500 text-white font-bold px-4 py-1 rounded-full shadow-md transform rotate-6″>點擊這裡找不同</div>
<div id=”right-grid” class=”grid grid-cols-2 gap-4 mt-2″>
<!– 圖案會由 JS 動態生成 –>
</div>
</div>
</main>
<!– 訊息提示區 –>
<div id=”message-container” class=”h-20 mt-8 flex items-center justify-center”>
<p id=”message” class=”text-2xl sm:text-3xl font-bold opacity-0 transition-opacity duration-300″></p>
</div>
<!– 控制按鈕 –>
<button id=”next-btn” onclick=”nextLevel()” class=”hidden bg-gradient-to-r from-pink-400 to-pink-500 hover:from-pink-500 hover:to-pink-600 text-white font-bold py-3 px-10 rounded-full shadow-lg transform transition hover:scale-105 active:scale-95 text-xl”>
下一關 ➡️
</button>
<button id=”restart-btn” onclick=”resetGame()” class=”hidden bg-gradient-to-r from-blue-400 to-blue-500 hover:from-blue-500 hover:to-blue-600 text-white font-bold py-3 px-10 rounded-full shadow-lg transform transition hover:scale-105 active:scale-95 text-xl”>
再玩一次 🔄
</button>
<script>
// 遊戲資料設定 (包含南瓜和打開的紙箱等元素)
const levels = [
{
original: [‘🐶’, ‘🎃’, ‘📦’, ‘🍎’],
changed: [‘🐶’, ‘🎃’, ‘🎁’, ‘🍎’], // 📦 變成 🎁
diffIndex: 2
},
{
original: [‘🚗’, ‘🍎’, ‘🐸’, ‘🌟’],
changed: [‘🚙’, ‘🍎’, ‘🐸’, ‘🌟’], // 🚗 變成 🚙
diffIndex: 0
},
{
original: [‘🎈’, ‘🍦’, ‘🍔’, ‘🐶’],
changed: [‘🎈’, ‘🍦’, ‘🌭’, ‘🐶’], // 🍔 變成 🌭
diffIndex: 2
}
];
let currentLevelIndex = 0;
let isWaitingForNext = false; // 防止重複點擊
const leftGrid = document.getElementById(‘left-grid’);
const rightGrid = document.getElementById(‘right-grid’);
const messageEl = document.getElementById(‘message’);
const nextBtn = document.getElementById(‘next-btn’);
const restartBtn = document.getElementById(‘restart-btn’);
const levelDisplay = document.getElementById(‘current-level’);
// 初始化遊戲並渲染關卡
function renderLevel() {
isWaitingForNext = false;
leftGrid.innerHTML = ”;
rightGrid.innerHTML = ”;
hideMessage();
nextBtn.classList.add(‘hidden’);
restartBtn.classList.add(‘hidden’);
levelDisplay.innerText = currentLevelIndex + 1;
const currentData = levels[currentLevelIndex];
// 渲染左側 (標準)
currentData.original.forEach(emoji => {
const div = document.createElement(‘div’);
div.className = ’emoji-item shadow-sm’;
div.innerText = emoji;
leftGrid.appendChild(div);
});
// 渲染右側 (挑戰)
currentData.changed.forEach((emoji, index) => {
const div = document.createElement(‘div’);
div.className = ’emoji-item shadow-sm hover:bg-pink-50 hover:shadow-md’;
div.innerText = emoji;
// 綁定點擊事件
div.onclick = () => handleItemClick(div, index, currentData.diffIndex);
rightGrid.appendChild(div);
});
}
// 處理玩家點擊圖案
function handleItemClick(element, clickedIndex, correctIndex) {
if (isWaitingForNext) return; // 如果已經答對,不讓玩家繼續點
// 清除之前的動畫狀態
element.classList.remove(‘wrong-anim’);
void element.offsetWidth; // 觸發重繪 (Reflow),讓動畫可以重複播放
if (clickedIndex === correctIndex) {
// 答對了
isWaitingForNext = true;
element.classList.add(‘correct-anim’);
showMessage(‘🎉 太棒了!你找到不一樣的地方了! 🎉’, ‘text-green-500’);
// 顯示下一關或重玩按鈕
setTimeout(() => {
if (currentLevelIndex < levels.length – 1) {
nextBtn.classList.remove(‘hidden’);
} else {
showMessage(‘🏆 恭喜過關!你太厲害了! 🏆’, ‘text-pink-500’);
restartBtn.classList.remove(‘hidden’);
}
}, 1000);
} else {
// 答錯了
element.classList.add(‘wrong-anim’);
showMessage(‘Oops! 好像不是這個喔,再仔細看一看~ 👀’, ‘text-red-400’);
}
}
// 顯示訊息
function showMessage(text, colorClass) {
messageEl.innerText = text;
messageEl.className = `text-2xl sm:text-3xl font-bold transition-opacity duration-300 opacity-100 ${colorClass}`;
}
// 隱藏訊息
function hideMessage() {
messageEl.classList.remove(‘opacity-100’);
messageEl.classList.add(‘opacity-0’);
}
// 下一關
function nextLevel() {
if (currentLevelIndex < levels.length – 1) {
currentLevelIndex++;
renderLevel();
}
}
// 重新開始遊戲
function resetGame() {
currentLevelIndex = 0;
renderLevel();
}
// 網頁載入完成後,自動開始第一關
window.onload = renderLevel;
</script>
</body>
</html>