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]