如何将用户输入持续存入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>
关键改进说明
- 用数组存历史猜测:
$_SESSION['guesses']会累积所有猜过的字母,不会每次覆盖,这样就能记住之前猜对的内容了。 - 修正匹配逻辑:遍历秘密单词的每个字符,检查是否在历史猜测数组里,这样之前猜对的字母会一直显示,不会被重置。
- 优化输出:用
implode(' ', $display)把数组转成你想要的空格分隔格式,比如秘密单词是cat,猜过c和a后就会显示c a _。 - 额外小优化:加了重复猜测过滤(同一个字母猜多次不会重复添加)、输入长度限制(只能输入单个字母),还有换单词时自动重置猜测记录。
测试验证
按照你的示例场景:
- 玩家1输入
cat提交后,显示_ _ _ - 玩家2猜
c,显示c _ _ - 玩家2猜
a,显示c a _ - 玩家2猜
s,显示还是c a _,完全符合你的预期~
内容的提问来源于stack exchange,提问作者L8th
相关产品推荐
相关产品推荐

