You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制高低猜数游戏用户操作次数为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();
}
?>

关键修改点说明

  1. 会话跟踪尝试次数:

    • 在Start_Again()里初始化$_SESSION['attempts'] = 0
    • 每次用户猜数时,递增$_SESSION['attempts'],确保次数跨请求保留
  2. 修复原代码的字符串拼接错误:

    • 原代码里的引号和点号混用导致语法问题,改成了简洁的变量嵌入写法<a href=\"?number=$num\">$num</a>
  3. 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等参数
  4. 用户体验优化:

    • 每次猜数后告诉用户剩余次数,让用户清楚自己的尝试进度

内容的提问来源于stack exchange,提问作者Stephanie Kostova

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:32:40