CodeAE 发表于 2023-3-15 14:08:34

PHP版贪吃蛇小游戏


不依赖任何扩展,打开就能运行
PHP代码如下:
<?php
class snake
{
    /**
   * 构造方法
   */
    public function __construct()
    {
      $this->app = "http://" . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
    }

    /**
   * 读取session模拟的虚拟缓存显示到屏幕上
   * @Return 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中的数据
   * @Param string $k
   * @param string $v
   */
    public function set($k, $v)
    {
      $_SESSION[$k] = $v;
    }

    /**
   * 读取虚拟缓存session中的数据
   * @paramstring $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", [
               
            ]);
            $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,
                        $snake - 1
                  ];
                  break;
                }
            case "down": {
                  $snakeHead = [
                        $snake,
                        $snake + 1
                  ];
                  break;
                }
            case "left": {
                  $snakeHead = [
                        $snake - 1,
                        $snake
                  ];
                  break;
                }
            case "right": {
                  $snakeHead = [
                        $snake + 1,
                        $snake
                  ];
                  break;
                }
      }
      //咬到自己,游戏结束
      if (in_array($snakeHead, $snake)) {
            $this->gameOver();
            return;
      }
      //添加蛇头坐标
      array_unshift($snake, $snakeHead);
      //撞墙,游戏结束
      if ($snake < 0 || $snake < 0 || $snake > 29 || $snake > 29) {
            $this->gameOver();
            return;
      }
      //咬到食物得一分
      if (in_array($this->get("food"), $snake)) {
            $this->getFood();
            $this->set("score", $this->get("score") + 1);
      } else {
            unset($snake);
      }
      $this->set("snake", $snake);
    }

    /**
   * 取得食物
   * @return void
   */
    public function getFood()
    {
      $food = ;
      $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();https://www.52pojie.cn/thread-1714806-1-18.html
页: [1]
查看完整版本: PHP版贪吃蛇小游戏