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

如何将用户输入持续存入PHP的$_SESSION数组并实现猜词游戏功能?

搞定你的PHP猜词游戏:解决单次猜测显示问题

嘿,我帮你捋捋这个猜词游戏的问题~你的代码现在每次只能显示单个字母,没法累积之前猜对的内容,主要是这几个地方出了问题:

核心问题拆解

  • 会话只存单次猜测:你用$_SESSION['guess'] = $_POST['guess']直接覆盖了之前的猜测,所以每次只有最新输入的字母,没法保留历史猜过的内容。
  • 匹配逻辑不对:循环里只判断当前字符是否等于这次猜的字母,之前猜对的字母会被重新替换成下划线,比如第一次猜中c,第二次猜a的时候,c会被当成没猜中,又变成_。
  • 输出方式不合适:用print_r($found)输出数组,看起来是零散的元素,不是你想要的空格分隔的字符串。

修正后的完整代码

<?php
session_start();

// 初始化会话变量,避免未定义报错
if (!isset($_SESSION['word'])) {
    $_SESSION['word'] = '';
}
if (!isset($_SESSION['guesses'])) {
    $_SESSION['guesses'] = []; // 用数组存所有猜过的字母,不覆盖
}

// 玩家1提交秘密单词
if (isset($_POST['player1'], $_POST['word'])) {
    $_SESSION['word'] = strtolower(trim($_POST['word']));
    $_SESSION['guesses'] = []; // 换单词时重置猜测记录
}

// 玩家2提交猜测字母
if (isset($_POST['player2'], $_POST['guess'])) {
    $new_guess = strtolower(trim($_POST['guess']));
    // 只允许单个字母,且不重复添加相同猜测
    if (!in_array($new_guess, $_SESSION['guesses']) && strlen($new_guess) === 1) {
        $_SESSION['guesses'][] = $new_guess;
    }
}

$word = $_SESSION['word'];
$guesses = $_SESSION['guesses'];
$display = [];

if (!empty($word)) {
    // 把秘密单词拆成单个字符遍历
    foreach (str_split($word) as $char) {
        // 检查当前字符是否在历史猜测列表里
        if (in_array($char, $guesses)) {
            $display[] = $char;
        } else {
            $display[] = '_';
        }
    }
    // 把数组拼成空格分隔的字符串,比如"c a _"
    echo implode(' ', $display);
} else {
    echo "请玩家1先输入秘密单词哦~";
}
?>

<!-- 配套的HTML表单,方便测试 -->
<form method="post">
    <?php if (empty($_SESSION['word'])): ?>
        <label>玩家1:输入秘密单词</label>
        <input type="text" name="word" required>
        <button type="submit" name="player1">提交</button>
    <?php else: ?>
        <label>玩家2:猜单个字母</label>
        <input type="text" name="guess" maxlength="1" required>
        <button type="submit" name="player2">猜</button>
        <br><br>当前结果:<?php echo implode(' ', $display); ?>
    <?php endif; ?>
</form>

关键改进说明

  1. 用数组存历史猜测:$_SESSION['guesses']会累积所有猜过的字母,不会每次覆盖,这样就能记住之前猜对的内容了。
  2. 修正匹配逻辑:遍历秘密单词的每个字符,检查是否在历史猜测数组里,这样之前猜对的字母会一直显示,不会被重置。
  3. 优化输出:用implode(' ', $display)把数组转成你想要的空格分隔格式,比如秘密单词是cat,猜过c和a后就会显示c a _。
  4. 额外小优化:加了重复猜测过滤(同一个字母猜多次不会重复添加)、输入长度限制(只能输入单个字母),还有换单词时自动重置猜测记录。

测试验证

按照你的示例场景:

  • 玩家1输入cat提交后,显示_ _ _
  • 玩家2猜c,显示c _ _
  • 玩家2猜a,显示c a _
  • 玩家2猜s,显示还是c a _,完全符合你的预期~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:44:27