PHP猜数字游戏:如何让随机数在游戏结束前保持不变
解决PHP猜数字游戏随机数每次重置的问题
嘿,这个问题其实很典型——你现在的代码每次页面加载(包括提交表单/按回车)都会重新执行$randomNum = rand(0, 150);,所以随机数自然每次都变,用户根本没法猜对。咱们用**会话(Session)**就能搞定,把随机数存在会话里,直到用户猜对再重置。
核心思路
会话可以在用户的多个请求之间保存数据,所以我们只需要:
- 第一次加载页面时生成随机数并存入会话
- 后续请求直接从会话里取这个随机数
- 用户猜对后,清除会话里的随机数,下次加载就会生成新的
修改后的完整代码
<?php session_start(); // 必须在输出任何HTML之前启动会话 // 初始化随机数:只有会话里没有的时候才生成 if (!isset($_SESSION['randomNum'])) { $_SESSION['randomNum'] = rand(0, 150); } $randomNum = $_SESSION['randomNum']; ?> <!DOCTYPE html> <html> <head> <title>Guess Gaming</title> </head> <body> <h1>Guess the correct Number</h1> <p> <?php if(empty($_GET["guess"])){ echo "Missing guess parameter."; } else { $guess = $_GET["guess"]; if(is_numeric($guess)){ // 注意用==而不是===:GET参数是字符串,$randomNum是整数,严格相等会不匹配 if((int)$guess == $randomNum){ echo "Congratulations-- You are right"; unset($_SESSION['randomNum']); // 猜对后清除会话,下次生成新数 } elseif((int)$guess < $randomNum){ echo "Your guess is too low."; } else { echo "Your guess is too high."; } } else { echo htmlspecialchars($guess) . " isn't numeric."; } } ?> </p> <p> <!-- 这里可以注释掉,不然用户直接看到答案啦 😄 --> <!-- <?php echo $randomNum; ?> --> </p> </body> </html>
几个关键细节说明
session_start()的位置:必须放在所有HTML输出之前,否则会报错,因为会话需要发送HTTP头。- 类型转换:把
$_GET["guess"]转成整数(int)$guess,再和$randomNum比较,避免字符串和整数的类型问题(比如用户输入"10",和整数10用是相等的,但用=就不相等)。 htmlspecialchars():输出用户输入的内容时加上这个,防止XSS攻击,是好习惯哦。- 隐藏答案:原代码里直接输出
$randomNum,用户一眼就看到答案了,建议注释掉或者删掉~
这样修改后,随机数会一直保持到用户猜对,之后刷新页面就会生成新的随机数,完美解决你的问题!
内容的提问来源于stack exchange,提问作者user2613041




