如何限制高低猜数游戏用户操作次数为3次并实现MySQL存储?
解决高低猜数游戏的3次尝试限制与数据库存储问题
嘿,我看了你的代码,问题主要出在尝试次数没有持久化存储——每次请求时$count都会被重置为0,根本没法跟踪用户猜了几次。咱们一步步来改,实现3次限制+第三次后存用户信息到MySQL:
核心思路
- 用
$_SESSION保存尝试次数,会话变量能跨请求保留数据 - 每次用户提交猜测时,先递增尝试次数
- 判断次数是否达到3次:
- 没到3次:正常提示高低,继续游戏
- 到3次:不管猜对没猜对,都执行SQL存储用户信息,然后重置游戏
修改后的完整代码
<?php session_start(); // 初始化/重置游戏:生成随机数+重置尝试次数 function Start_Again() { $number = rand(1,100); $_SESSION['higherlower'] = $number; // 重置尝试次数为0 $_SESSION['attempts'] = 0; echo "Select a Number below."; Display_Form(); } // 显示数字选择表格 function Display_Form() { echo "<table>"; for ($num=1; $num < 101; $num++) { // 修复原代码的字符串拼接错误 echo "<td><a href=\"?number=$num\">$num</a></td>"; // 每10个数字换一行,比原正则更直观 if ($num % 10 == 0) { echo "</tr><tr>"; } } echo "</table>"; } // MySQL数据库连接配置(根据你的实际信息修改) $db_host = 'localhost'; $db_user = 'your_username'; $db_pass = 'your_password'; $db_name = 'your_database'; // 处理用户猜数请求 if (isset($_GET['number'])) { $User_Number = (int)$_GET['number']; // 强制转成整数,防止注入 $Actual_Number = $_SESSION['higherlower']; // 递增尝试次数(如果会话里没有,默认从1开始) $_SESSION['attempts'] = isset($_SESSION['attempts']) ? $_SESSION['attempts'] + 1 : 1; $currentAttempts = $_SESSION['attempts']; // 判断是否达到3次尝试 if ($currentAttempts >= 3) { // 准备存储用户信息到MySQL // 1. 连接数据库 $conn = mysqli_connect($db_host, $db_user, $db_pass, $db_name); if (!$conn) { die("数据库连接失败: " . mysqli_connect_error()); } // 2. 定义要存储的用户信息(可根据需求调整字段) // 示例:如果有登录用户用user_id,否则标记为guest $user_id = isset($_SESSION['user_id']) ? $_SESSION['user_id'] : 'guest'; $guess_num = $User_Number; $correct_num = $Actual_Number; $attempts_used = $currentAttempts; $is_success = ($User_Number == $Actual_Number) ? 1 : 0; // 3. 预处理SQL,防止SQL注入 $stmt = mysqli_prepare($conn, "INSERT INTO game_attempts (user_id, guess_number, correct_number, attempts_used, is_success, created_at) VALUES (?, ?, ?, ?, ?, NOW())"); mysqli_stmt_bind_param($stmt, "siiii", $user_id, $guess_num, $correct_num, $attempts_used, $is_success); // 执行SQL if (mysqli_stmt_execute($stmt)) { echo "游戏结束!你的尝试记录已保存。<br>"; } else { echo "保存记录失败: " . mysqli_error($conn); } // 关闭连接和语句 mysqli_stmt_close($stmt); mysqli_close($conn); // 重置游戏 Start_Again(); exit; // 提前退出,避免后续代码执行 } // 未达到3次,正常处理猜数结果 if ($User_Number < $Actual_Number) { echo "Higher! 你还有 " . (3 - $currentAttempts) . " 次机会<br>"; Display_Form(); } elseif ($User_Number > $Actual_Number) { echo "Lower! 你还有 " . (3 - $currentAttempts) . " 次机会<br>"; Display_Form(); } else { echo "Bingo, Correct Guess! 你只用了 $currentAttempts 次就猜对了<br>"; Start_Again(); } } elseif (!isset($_POST['higherlower'])) { // 首次加载页面,初始化游戏 Start_Again(); } ?>
关键修改点说明
会话跟踪尝试次数:
- 在
Start_Again()里初始化$_SESSION['attempts'] = 0 - 每次用户猜数时,递增
$_SESSION['attempts'],确保次数跨请求保留
- 在
修复原代码的字符串拼接错误:
- 原代码里的引号和点号混用导致语法问题,改成了简洁的变量嵌入写法
<a href=\"?number=$num\">$num</a>
- 原代码里的引号和点号混用导致语法问题,改成了简洁的变量嵌入写法
MySQL存储逻辑:
- 使用预处理语句防止SQL注入,这是必须的安全措施
- 示例中假设你有一个
game_attempts表,表结构参考:CREATE TABLE game_attempts ( id INT AUTO_INCREMENT PRIMARY KEY, user_id VARCHAR(50) NOT NULL, guess_number INT NOT NULL, correct_number INT NOT NULL, attempts_used INT NOT NULL, is_success TINYINT(1) NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); - 请根据自己的数据库信息修改
$db_host、$db_user等参数
用户体验优化:
- 每次猜数后告诉用户剩余次数,让用户清楚自己的尝试进度
内容的提问来源于stack exchange,提问作者Stephanie Kostova
相关产品推荐
相关产品推荐

