Compare commits

...

8 Commits

@ -1,24 +0,0 @@
from flask import Flask, request, jsonify, session
import random
app = Flask(__name__)
app.secret_key = 'your-secret-key-here' # 用于加密session
@app.route('/guess', methods=['POST'])
def guess():
# 获取用户猜的数字
user_guess = request.json.get('number')
# 从session获取谜底没有则生成新的
if 'secret' not in session:
session['secret'] = random.randint(1, 100)
secret = session['secret']
# 比较并返回结果
if user_guess > secret:
return jsonify({'result': '太大'})
elif user_guess < secret:
return jsonify({'result': '太小'})
else:
# 猜对了清除session准备下一轮
session.pop('secret')
return jsonify({'result': '猜对了'})

@ -0,0 +1,96 @@
<!DOCTYPE html>
<html lang="zh-CN">
<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>
<!-- 引入Font Awesome -->
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"
/>
<!-- 引入自定义样式 -->
<link rel="stylesheet" href="style.css" />
</head>
<body class="bg-gray-100 min-h-screen flex flex-col items-center justify-center p-4">
<!-- 主题切换按钮 -->
<button
id="themeBtn"
class="fixed top-4 right-4 bg-white rounded-full p-2 shadow-md"
>
<<i class="fas fa-moon"></</i>
</button>
<!-- 游戏标题 -->
<h1 class="text-3xl font-bold text-blue-600 mb-8">你说我猜-数字小游戏</h1>
<!-- 游戏配置区 -->
<div class="w-full max-w-md bg-white rounded-lg shadow-md p-6 mb-6">
<h2 class="text-xl font-semibold mb-4">选题人操作区</h2>
<div class="flex flex-col space-y-3">
<!-- 生成随机数按钮 -->
<button
id="generateBtn"
class="bg-blue-500 hover:bg-blue-600 text-white font-bold py-2 px-4 rounded"
>
生成随机数1-100
</button>
<!-- 保密面板 -->
<div id="secretPanel" class="bg-gray-200 rounded p-3 text-center">
目标数:<span class="secret-num">●●●</span>
</div>
</div>
</div>
<!-- 猜数交互区 -->
<div class="w-full max-w-md bg-white rounded-lg shadow-md p-6 mb-6">
<h2 class="text-xl font-semibold mb-4">猜数人操作区</h2>
<div class="flex flex-col space-y-3">
<!-- 输入框 -->
<input
type="text"
id="guessInput"
placeholder="输入1-100的整数"
class="border border-gray-300 rounded py-2 px-3 focus:outline-none focus:ring-2 focus:ring-blue-500"
/>
<!-- 提交按钮 -->
<button
id="submitBtn"
class="bg-green-500 hover:bg-green-600 text-white font-bold py-2 px-4 rounded"
>
提交猜测
</button>
<!-- 提示按钮 -->
<button
id="hintBtn"
class="bg-purple-500 hover:bg-purple-600 text-white font-bold py-2 px-4 rounded mt-2"
>
获取提示(剩余:<span id="hintCount">0</span>次)
</button>
<!-- 猜数记录 -->
<div class="mt-4">
<h3 class="font-semibold mb-2">猜数记录</h3>
<ul id="guessHistory" class="max-h-40 overflow-y-auto text-sm"></ul>
</div>
</div>
</div>
<!-- 结果反馈区 -->
<div id="resultPanel" class="w-full max-w-md bg-white rounded-lg shadow-md p-6 text-center">
<h2 class="text-xl font-semibold mb-4">结果反馈</h2>
<p id="resultText" class="text-xl font-bold text-gray-500">等待开始游戏...</p>
<!-- 重新开始按钮 -->
<button
id="restartBtn"
class="mt-4 bg-red-500 hover:bg-red-600 text-white font-bold py-2 px-4 rounded hidden"
>
重新开始
</button>
</div>
<!-- 引入游戏逻辑 -->
<script src="script.js"></script>
</body>
</html>

@ -0,0 +1,237 @@
// 初始化游戏状态
const gameState = {
targetNum: null,
isGameOver: false,
guessHistory: [],
guessCount: 0, // 猜数次数统计
};
// DOM 元素获取
const generateBtn = document.getElementById('generateBtn');
const secretPanel = document.getElementById('secretPanel');
const secretNum = document.querySelector('.secret-num');
const guessInput = document.getElementById('guessInput');
const submitBtn = document.getElementById('submitBtn');
const guessHistory = document.getElementById('guessHistory');
const resultText = document.getElementById('resultText');
const restartBtn = document.getElementById('restartBtn');
const hintBtn = document.getElementById('hintBtn');
const hintCount = document.getElementById('hintCount');
const themeBtn = document.getElementById('themeBtn');
const themeIcon = themeBtn.querySelector('i');
let hintLeft = 0; // 剩余提示次数
// 1. 生成随机数逻辑
generateBtn.addEventListener('click', () => {
generateTargetNum();
});
function generateTargetNum(min = 1, max = 100) {
gameState.targetNum = Math.floor(Math.random() * (max - min + 1)) + min;
gameState.isGameOver = false;
gameState.guessHistory = [];
gameState.guessCount = 0; // 重置次数
hintLeft = 0; // 重置提示次数
hintCount.textContent = hintLeft;
// 重置UI
guessInput.value = '';
guessHistory.innerHTML = '';
resultText.textContent = '等待猜数...';
resultText.className = 'text-xl font-bold text-gray-500';
submitBtn.disabled = false;
restartBtn.classList.add('hidden');
// 保密面板重置
secretNum.textContent = '●●●';
secretPanel.title = '';
}
// 2. 猜数验证逻辑
submitBtn.addEventListener('click', () => {
const guessVal = guessInput.value.trim();
if (validateInput(guessVal)) {
const guessNum = parseInt(guessVal);
checkGuess(guessNum);
} else {
alert('请输入1-100的整数');
}
});
// 回车提交支持
guessInput.addEventListener('keypress', (e) => {
if (e.key === 'Enter') {
submitBtn.click();
}
});
function checkGuess(guessNum) {
if (gameState.isGameOver) return;
gameState.guessCount++; // 次数+1
const target = gameState.targetNum;
let result = '';
let resultClass = '';
if (guessNum > target) {
result = '大了!';
resultClass = 'text-red-600';
} else if (guessNum < target) {
result = '小了!';
resultClass = 'text-blue-600';
} else {
// 计算评级
let rank = '';
if (gameState.guessCount <= 5) rank = '大神';
else if (gameState.guessCount <= 8) rank = '优秀';
else if (gameState.guessCount <= 12) rank = '合格';
else rank = '再接再厉';
result = `恭喜猜对!目标数是 ${target},你用了 ${gameState.guessCount} 次猜对,评级:${rank}`;
resultClass = 'text-green-600';
gameState.isGameOver = true;
submitBtn.disabled = true;
restartBtn.classList.remove('hidden');
// 礼花特效
createFireworks();
// 更新最佳成绩
const currentDate = new Date().toLocaleDateString();
const bestRecord = localStorage.getItem('guessGameBest');
if (!bestRecord || gameState.guessCount < JSON.parse(bestRecord).count) {
localStorage.setItem(
'guessGameBest',
JSON.stringify({ count: gameState.guessCount, date: currentDate })
);
alert(`恭喜刷新最佳成绩!当前次数:${gameState.guessCount}次`);
}
}
// 每猜3次增加一次提示机会
if (gameState.guessCount % 3 === 0 && gameState.guessCount !== 0) {
hintLeft++;
hintCount.textContent = hintLeft;
}
// 记录历史
gameState.guessHistory.push({ num: guessNum, result });
// 更新UI
updateGameUI();
// 更新结果文本与动画
resultText.textContent = result;
resultText.className = `text-xl font-bold ${resultClass}`;
if (resultClass.includes('red') || resultClass.includes('blue')) {
resultText.classList.add('shake');
setTimeout(() => resultText.classList.remove('shake'), 500);
} else {
resultText.classList.add('scale');
setTimeout(() => resultText.classList.remove('scale'), 800);
}
}
// 3. 输入验证逻辑
function validateInput(val) {
const num = Number(val);
return !isNaN(num) && num >= 1 && num <= 100 && Number.isInteger(num);
}
// 4. 更新历史记录UI
function updateGameUI() {
guessHistory.innerHTML = '';
gameState.guessHistory.forEach((item, index) => {
const li = document.createElement('li');
li.className = 'py-1 border-b border-gray-200';
li.textContent = `第${index + 1}次:${item.num} → ${item.result}`;
guessHistory.appendChild(li);
});
}
// 5. 重新开始逻辑
restartBtn.addEventListener('click', () => {
generateTargetNum();
});
// 6. 提示按钮逻辑
hintBtn.addEventListener('click', () => {
if (hintLeft <= 0 || gameState.isGameOver) return;
hintLeft--;
hintCount.textContent = hintLeft;
const isOdd = gameState.targetNum % 2 === 1;
const range = getRangeHint();
alert(`提示:目标数是${isOdd ? '奇数' : '偶数'},且在${range[0]}-${range[1]}区间内`);
});
// 计算区间提示
function getRangeHint() {
const historyNums = gameState.guessHistory.map((item) => item.num);
let min = 1, max = 100;
historyNums.forEach((num) => {
const res = gameState.guessHistory.find((item) => item.num === num).result;
if (res.includes('大了')) max = Math.min(max, num - 1);
if (res.includes('小了')) min = Math.max(min, num + 1);
});
return [min, max];
}
// 7. 礼花特效函数
function createFireworks() {
const fireworks = document.createElement('div');
fireworks.className = 'fixed inset-0 flex items-center justify-center pointer-events-none';
fireworks.innerHTML = `
<div class="w-2 h-2 bg-red-500 rounded-full absolute"></div>
<div class="w-2 h-2 bg-green-500 rounded-full absolute"></div>
<div class="w-2 h-2 bg-blue-500 rounded-full absolute"></div>
<div class="w-2 h-2 bg-yellow-500 rounded-full absolute"></div>
<div class="w-2 h-2 bg-purple-500 rounded-full absolute"></div>
`;
document.body.appendChild(fireworks);
const dots = fireworks.querySelectorAll('div');
dots.forEach((dot) => {
const x = Math.random() * 100 - 50;
const y = Math.random() * 100 - 50;
dot.style.transform = `translate(${x}vw, ${y}vh)`;
dot.style.opacity = '0';
dot.style.transition = 'all 1s ease';
setTimeout(() => {
dot.style.opacity = '1';
dot.style.transform = `translate(${x * 0.5}vw, ${y * 0.5}vh) scale(2)`;
dot.style.opacity = '0';
}, 10);
});
setTimeout(() => {
document.body.removeChild(fireworks);
}, 1000);
}
// 8. 主题切换逻辑
themeBtn.addEventListener('click', () => {
document.documentElement.classList.toggle('dark-theme');
if (document.documentElement.classList.contains('dark-theme')) {
themeIcon.classList.remove('fa-moon');
themeIcon.classList.add('fa-sun');
} else {
themeIcon.classList.remove('fa-sun');
themeIcon.classList.add('fa-moon');
}
});
// 9. 保密面板悬浮显示
secretPanel.addEventListener('mouseenter', () => {
if (gameState.targetNum !== null) {
secretNum.textContent = gameState.targetNum;
secretPanel.title = '选题人请记住目标数哦~';
}
});
secretPanel.addEventListener('mouseleave', () => {
if (gameState.targetNum !== null && !gameState.isGameOver) {
secretNum.textContent = '●●●';
secretPanel.title = '';
}
});
// 10. 初始化时读取历史最佳
window.addEventListener('load', () => {
const bestRecord = localStorage.getItem('guessGameBest');
if (bestRecord) {
const { count, date } = JSON.parse(bestRecord);
alert(`你的历史最佳成绩:${count}次(${date}`);
}
});

@ -0,0 +1,57 @@
/* 输入框只允许数字输入 */
#guessInput::-webkit-outer-spin-button,
#guessInput::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}
/* 历史记录滚动条美化 */
#guessHistory::-webkit-scrollbar {
width: 4px;
}
#guessHistory::-webkit-scrollbar-thumb {
background-color: #ccc;
border-radius: 2px;
}
/* 动画关键帧 */
@keyframes shake {
0%, 100% { transform: translateX(0); }
25% { transform: translateX(-5px); }
75% { transform: translateX(5px); }
}
@keyframes scale {
0%, 100% { transform: scale(1); }
50% { transform: scale(1.1); }
}
.shake {
animation: shake 0.5s ease;
}
.scale {
animation: scale 0.8s ease;
}
/* 主题样式变量 */
:root {
--bg-color: #f5f5f5;
--text-color: #333;
--card-bg: #fff;
}
.dark-theme {
--bg-color: #1a1a1a;
--text-color: #fff;
--card-bg: #2d2d2d;
}
body {
background-color: var(--bg-color);
color: var(--text-color);
}
.bg-white {
background-color: var(--card-bg);
}
Loading…
Cancel
Save