源代码
<?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 print() { $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->print(); } } (new snake())->main();
代码说明
不依赖任何扩展,打开就能运行
1.将代码复制到文本中,后缀改为php
2.放入项目或www中,浏览器上访问这个php文件
3.就可运行了。