PHP猜数字游戏

简介: PHP猜数字游戏

猜数字游戏


参考:https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/First_steps/A_first_splash


注意:这里是 JavaScript 的实现,经供参考


人生建议:好好看看里面写的一些内容


我想让你创建一个可以猜数字的游戏,它会在1~100以内随机选择一个数, 然后让玩家挑战在10轮以内猜出这个数字,每一轮都要告诉玩家正确或者错误, 如果出错了,则告诉他数字是低了还是高了,并且还要告诉玩家之前猜的数字是什么。 一旦玩家猜测正确,或者他们用完了回合,游戏将结束。 游戏结束后,可以让玩家选择再次开始。


展示



下面将用三种方法来实现


方法一:Cookie


但是他有个非常大的缺点,就是我们可以查看到答案


打开开发者控制台,找到相应的cookie就可以找到答案了



<?php
if (empty($_COOKIE['num']) || empty($_GET['num'])) {
  // 在游戏开始时执行生成随机数
  $num = rand(0, 100);
  // 不能存在文件中,因为有可能同时有多个用户使用
  // file_put_contents('number.txt', $num);
  // 因为 cookie 是每个用户自己保存,每个用户存的是属于自己的要猜的数字
  setcookie('num', $num);
} else {
  // 用户来试一试 猜了一次
  // 还是通过cookie记录之前输入的内容
  $count = empty($_COOKIE['count']) ? 0 : (int)$_COOKIE['count'];
  if ($count < 10) {
    // 对比用户提交的数字和用户 Cookie 中存放的被猜的数字
    // $_GET['num'] => 用户试一试的数字
    // $_COOKIE['num'] => 被猜的数字
    $result = (int)$_GET['num'] - (int)$_COOKIE['num'];
    if ($result == 0) {
      $message = '猜对了';
      // 重新开始,删除cookie即可
      setcookie('num');
      setcookie('count');
    } elseif ($result > 0) {
      $message = '太大了';
    } else {
      $message = '太小了';
    }
    setcookie('count', $count + 1);
  } else {
    // 游戏结束
    $message = 'looooooooooooow!';
    setcookie('num');
    setcookie('count');
  }
}
// ============== 判断 请求方式 辨别是第几次请求 ====================================
// if ($_SERVER['REQUEST_METHOD'] === 'GET') {
//   // 在游戏开始时执行生成随机数
//   $num = rand(0, 100);
//   // 不能存在文件中,因为有可能同时有多个用户使用
//   // file_put_contents('number.txt', $num);
//   // 因为 cookie 是每个用户自己保存,每个用户存的是属于自己的要猜的数字
//   setcookie('num', $num);
// } else {
//   // 用户来试一试
//   // 对比用户提交的数字和用户 Cookie 中存放的被猜的数字
//   // $_POST['num'] => 用户试一试的数字
//   // $_COOKIE['num'] => 被猜的数字
//   $result = (int)$_POST['num'] - (int)$_COOKIE['num'];
//   if ($result == 0) {
//     echo '猜对了';
//   } elseif ($result > 0) {
//     echo '太大了';
//   } else {
//     echo '太小了';
//   }
// }
?>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>猜数字</title>
  <style>
    body {
      padding: 100px 0;
      background-color: #2b3b49;
      color: #fff;
      text-align: center;
      font-size: 2.5em;
    }
    input {
      padding: 5px 20px;
      height: 50px;
      background-color: #3b4b59;
      border: 1px solid #c0c0c0;
      box-sizing: border-box;
      color: #fff;
      font-size: 20px;
    }
    button {
      padding: 5px 20px;
      height: 50px;
      font-size: 16px;
    }
  </style>
</head>
<body>
  <h1>猜数字游戏</h1>
  <p>Hi,我已经准备了一个0~100的数字,你需要在仅有的10机会之内猜对它。</p>
  <?php if (isset($message)): ?>
  <p><?php echo $message; ?></p>
  <?php endif ?>
  <form action="index.php" method="get">
    <input type="number" min="0" max="100" name="num" placeholder="随便猜">
    <button type="submit">试一试</button>
  </form>
</body>
</html>


方法二:Session


区别于上面单纯cookie可以看到答案的方法,用session方式就相对安全多了,把密码放在服务器中,只给客户端相应的ID



<?php
// 找一个属于当前访问者的箱子
// 并且把箱子的钥匙(session_id)交给用户(cookie)
session_start();
if (empty($_SESSION['num']) || empty($_GET['num'])) {
  $num = rand(0, 100);
  // 存在 cookie 中不保险,存在服务端的箱子里
  $_SESSION['num'] = $num;
} else {
  $count = empty($_SESSION['count']) ? 0 : $_SESSION['count'];
  if ($count < 10) {
    $result = (int)$_GET['num'] - $_SESSION['num'];
    if ($result == 0) {
      $message = '猜对了';
      unset($_SESSION['num']);
      unset($_SESSION['count']);
    } elseif ($result > 0) {
      $message = '太大了';
    } else {
      $message = '太小了';
    }
    $_SESSION['count'] = $count + 1;
  } else {
    $message = '次数用完了!';
    unset($_SESSION['num']);
    unset($_SESSION['count']);
  }
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>猜数字</title>
  <style>
    body {
      padding: 100px 0;
      background-color: #2b3b49;
      color: #fff;
      text-align: center;
      font-size: 2.5em;
    }
    input {
      padding: 5px 20px;
      height: 50px;
      background-color: #3b4b59;
      border: 1px solid #c0c0c0;
      box-sizing: border-box;
      color: #fff;
      font-size: 20px;
    }
    button {
      padding: 5px 20px;
      height: 50px;
      font-size: 16px;
    }
  </style>
</head>
<body>
  <h1>猜数字游戏</h1>
  <p>Hi,我已经准备了一个0~100的数字,你需要在仅有的10机会之内猜对它。</p>
  <?php if (isset($message)): ?>
  <p><?php echo $message; ?></p>
  <?php endif ?>
  <form action="session.php" method="get">
    <input type="number" min="0" max="100" name="num" placeholder="随便猜">
    <button type="submit">试一试</button>
  </form>
</body>
</html>


方法三:JavaScript


<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>猜数字游戏</title>
    <style>
      html {
        font-family: sans-serif;
      }
      body {
        width: 50%;
        max-width: 800px;
        min-width: 480px;
        margin: 0 auto;
      }
      .lastResult {
        color: white;
        padding: 3px;
      }
    </style>
  </head>
  <body>
    <h1>猜数字游戏</h1>
    <p>我刚才随机选定了一个100以内的自然数。看你能否在 10 次以内猜中它。每次我都会告诉你所猜的结果是高了还是低了。</p>
    <div class="form">
      <label for="guessField">请猜数:</label><input type="text" id="guessField" class="guessField">
      <input type="submit" value="我猜" class="guessSubmit">
    </div>
    <div class="resultParas">
      <p class="guesses"></p>
      <p class="lastResult"></p>
      <p class="lowOrHi"></p>
    </div>
    <script>
      let randomNumber = Math.floor(Math.random() * 100) + 1;
      const guesses = document.querySelector('.guesses');
      const lastResult = document.querySelector('.lastResult');
      const lowOrHi = document.querySelector('.lowOrHi');
      const guessSubmit = document.querySelector('.guessSubmit');
      const guessField = document.querySelector('.guessField');
      let guessCount = 1;
      let resetButton;
      function checkGuess() {
        let userGuess = Number(guessField.value);
        if (guessCount === 1) {
          guesses.textContent = '上次猜的数:';
        }
        guesses.textContent += userGuess + ' ';
        if (userGuess === randomNumber) {
          lastResult.textContent = '恭喜你!猜对了!';
          lastResult.style.backgroundColor = 'green';
          lowOrHi.textContent = '';
          setGameOver();
        } else if (guessCount === 10) {
          lastResult.textContent = '!!!游戏结束!!!';
          lowOrHi.textContent = '';
          setGameOver();
        } else {
          lastResult.textContent = '你猜错了!';
          lastResult.style.backgroundColor = 'red';
          if(userGuess < randomNumber) {
            lowOrHi.textContent = '你刚才猜低了!' ;
          } else if(userGuess > randomNumber) {
            lowOrHi.textContent = '你刚才猜高了!';
          }
        }
        guessCount++;
        guessField.value = '';
        guessField.focus();
      }
      guessSubmit.addEventListener('click', checkGuess);
      function setGameOver() {
        guessField.disabled = true;
        guessSubmit.disabled = true;
        resetButton = document.createElement('button');
        resetButton.textContent = '开始新游戏';
        document.body.appendChild(resetButton);
        resetButton.addEventListener('click', resetGame);
      }
      function resetGame() {
        guessCount = 1;
        const resetParas = document.querySelectorAll('.resultParas p');
        for(let i = 0 ; i < resetParas.length ; i++) {
          resetParas[i].textContent = '';
        }
        resetButton.parentNode.removeChild(resetButton);
        guessField.disabled = false;
        guessSubmit.disabled = false;
        guessField.value = '';
        guessField.focus();
        lastResult.style.backgroundColor = 'white';
        randomNumber = Math.floor(Math.random() * 100) + 1;
      }
    </script>
  </body>
</html>


相关文章
|
7月前
|
程序员 PHP
PHP循环结构
PHP循环结构
58 0
|
26天前
|
Java PHP
04 PHP流程控制语句
路老师分享PHP语言知识,助你入门并深入理解PHP。本文详细介绍了条件控制语句(if、if...else、elseif、switch)、循环控制语句(for、while、do...while)及跳转语句(break、continue),并通过实例帮助你更好地掌握这些知识点。关注路老师的知乎和加入技术QQ群,获取更多技术资源和交流机会。制作不易,欢迎点赞和支持!
16 4
04 PHP流程控制语句
|
4月前
|
数据处理 PHP 开发者
PHP中实现简易计算器功能
【8月更文挑战第31天】在编程的世界里,将理论应用到实践是检验知识掌握程度的试金石。本文将通过一个简单的PHP项目——构建一个简易计算器,引导你理解PHP的基本语法及其在实际应用中的运用。我们将从零开始,逐步搭建起这个计算器,并在过程中加深对PHP数据处理和函数使用的理解。无论你是初学者还是希望温故而知新的开发者,这篇文章都将为你提供一次愉快的编程之旅。
|
5月前
|
存储 Serverless PHP
|
存储 PHP 索引
PHP循环(一)
PHP循环(一)
70 0
|
存储 PHP 索引
PHP循环(二)
PHP循环(二)
85 0
|
PHP
letcode两数之和php版本
letcode两数之和php版本
104 0