评论

收藏

[PHP] PHP版贪吃蛇小游戏

开发技术 开发技术 发布于:2023-03-15 14:08 | 阅读数:271 | 评论:0

QQ截图20230315140948.jpg
不依赖任何扩展,打开就能运行
PHP代码如下:
<?php
class snake
{
  /**
   * 构造方法
   */
  public function __construct()
  {
    $this->app = "http://" . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
  }
 
  /**
   * 读取session模拟的虚拟缓存显示到屏幕上
   * [url=home.php?mod=space&uid=155549]@Return[/url] html
   */
  public function printtt()
  {
    $score = !$this->get("score") ? 0 : $this->get("score"); //得分
    //html长字符串
    $html = <<<MAP_STRING
  <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<title>snake</title>
<style>
table{
  background-color:#000;
  }
  table td{
  padding:1px 1px 1px 1px;
  width:16px;height:12px;
  color:red;
  }
  table tr{
  background-color:#000;
  }
  .sn{
  background:#fff;
  }
  .bright{background:#fff;}
  button{font-size:20px;}
  marquee{width:400px;height:400px;font-size:50px;color:red;background:#000;text-align:center;}
</style>
<p>php贪吃蛇->[分数:{$score}]</p>
MAP_STRING;
    $map = "<table>";
    //初始化高亮区域$bright,包括蛇体和食物
    if (!$this->get("snake")) {
      $bright = [];
    } else {
      $bright = array_merge($this->get("snake"), [$this->get("food")]);
    }
    //标记蛇体和食物高亮
    for ($i = 0; $i < 30; $i++) {
      $map .= "<tr>";
      for ($j = 0; $j < 30; $j++) {
        if (in_array([$j, $i], $bright)) {
          $map .= "<td class='bright'></td>";
        } else {
          $map .= "<td></td>";
        }
      }
      $map .= "</tr>";
    }
    $map .= "</table>";
    //控制区域长字符串
    $controll = <<<CONTROLL
  <a href="{$this->app}?isOn=on"><button>start</button></a>
  ........................
  <a href="{$this->app}?isOn=on&direction=up"><button>up</button></a>
  <br><a href="{$this->app}?isOn=off"><button>stop</button></a>
  ...............
  <a href="{$this->app}?isOn=on&direction=left"><button>left</button></a>
  <a href="{$this->app}?isOn=on&direction=right"><button>right</button></a>
  <br>............................................
  <a href="{$this->app}?isOn=on&direction=down"><button>down</button></a>
CONTROLL;
    if (isset($_GET["isOn"]) && $_GET["isOn"] == "on") {
      header("refresh: 1"); //每一秒刷新一次页面
    }
    if (isset($_GET["msg"])) {
      //收到游戏结束的消息
      echo $html . "<marquee direction=up>{$_GET["msg"]}</marquee>" . $controll;
    } else {
      //游戏画面显示
      echo $html . $map . $controll;
    }
  }
 
  /**
   * 设置虚拟显存session中的数据
   * [url=home.php?mod=space&uid=952169]@Param[/url] string $k
   * @param string $v
   */
  public function set($k, $v)
  {
    $_SESSION[$k] = $v;
  }
 
  /**
   * 读取虚拟缓存session中的数据
   * @param  string $k
   * @return string|bool
   */
  public function get($k)
  {
    return isset($_SESSION[$k]) ? $_SESSION[$k] : false;
  }
 
  /**
   * 贪吃蛇算法,添头去尾、吃食物、撞墙判断、咬自己判断
   * @return void
   */
  public function cpu()
  {
    session_start();
    //游戏若暂停状态则不需计算不需修改虚拟缓存
    if (!(isset($_GET["isOn"]) && $_GET["isOn"] == "on")) {
      return;
    }
    //初始化蛇体和食物
    if (!$this->get("snake")) {
      $this->set("snake", [
        [29, 29]
      ]);
      $this->set("score", 0);
      $this->getFood();
      return;
    }
    //初始化运动方向
    if (!isset($_GET["direction"])) {
      $this->set("direction", "left");
    } else {
      $this->set("direction", $_GET["direction"]);
    }
    $snake = $this->get("snake");
    //计算蛇头坐标
    switch ($this->get("direction")) {
      case "up": {
          $snakeHead = [
            $snake[0][0],
            $snake[0][1] - 1
          ];
          break;
        }
      case "down": {
          $snakeHead = [
            $snake[0][0],
            $snake[0][1] + 1
          ];
          break;
        }
      case "left": {
          $snakeHead = [
            $snake[0][0] - 1,
            $snake[0][1]
          ];
          break;
        }
      case "right": {
          $snakeHead = [
            $snake[0][0] + 1,
            $snake[0][1]
          ];
          break;
        }
    }
    //咬到自己,游戏结束
    if (in_array($snakeHead, $snake)) {
      $this->gameOver();
      return;
    }
    //添加蛇头坐标
    array_unshift($snake, $snakeHead);
    //撞墙,游戏结束
    if ($snake[0][0] < 0 || $snake[0][1] < 0 || $snake[0][0] > 29 || $snake[0][1] > 29) {
      $this->gameOver();
      return;
    }
    //咬到食物得一分
    if (in_array($this->get("food"), $snake)) {
      $this->getFood();
      $this->set("score", $this->get("score") + 1);
    } else {
      unset($snake[count($snake) - 1]);
    }
    $this->set("snake", $snake);
  }
 
  /**
   * 取得食物
   * @return void
   */
  public function getFood()
  {
    $food = [mt_rand(1, 29), mt_rand(1, 29)];
    $this->set("food", $food);
    if (in_array($food, $this->get("snake"))) {
      $this->getFood();
    }
  }
   
  /**
   * 游戏结束
   * @return void
   */
  public function gameOver()
  {
    session_unset();
    header("location:" . $this->app . "?msg=gameover");
  }
 
  /**
   * 程序入口
   * @return void
   */
  public function main()
  {
    $this->cpu();
    $this->printtt();
  }
}
(new snake())->main();

关注下面的标签,发现更多相似文章