IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> 纯php实现贪吃蛇游戏(不使用JavaScript) -> 正文阅读

[PHP知识库]纯php实现贪吃蛇游戏(不使用JavaScript)

? ? ? ? 好久不写php了,最近有朋友说php只能写写增删改查,无法实现贪吃蛇游戏,忙里偷闲,写了个纯php版的贪吃蛇,不包含一句JavaScript代码,其实php也有写桌面应用的接口,不过今天我们这个demo就是我们常见的写增删改查的服务端php,下面还是先上效果图,再上代码。

?然后是代码

<?php
namespace snake;
/**
 * php贪吃蛇
 */
class snake{
	/**
	 * 构造方法
	 */
	public function __construct(){
		$this->app="http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
	}
	/**
	 * 读取session模拟的虚拟缓存显示到屏幕上
	 * @return [type] [description]
	 */
	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中的数据
	 * @param [type] $k [description]
	 * @param [type] $v [description]
	 */
	public function set($k,$v){
		$_SESSION[$k]=$v;
	}
	/**
	 * 读取虚拟缓存session中的数据
	 * @param  [type] $k [description]
	 * @return [type]    [description]
	 */
	public function get($k){
		return isset($_SESSION[$k])?$_SESSION[$k]:false;
	}
	/**
	 * 贪吃蛇算法,添头去尾、吃食物、撞墙判断、咬自己判断
	 * @return [type] [description]
	 */
	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 [type] [description]
	 */
	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 [type] [description]
	 */
	public function gameOver(){
		session_unset();
		header("location:".$this->app."?msg=gameover");
	}
	/**
	 * 程序入口
	 * @return [type] [description]
	 */
	public function main(){
		$this->cpu();
		$this->print();
	}
}
(new snake())->main();

? ? ? ? 贪吃蛇无非就是添头去尾,撞墙判断和吃自己判断,通过二维数组就能实现,主要是php不像JavaScript那样常驻内存,页面生成了php就停止运行了,也没有定时器,因此这个贪吃蛇是靠不断地刷新页面实现的的,控制方向啥的靠链接跳转挂参数实现的,$_GET变量存储方向等参数,蛇体数组和食物数组存储在$_SESSION里,这样通过header("refresh: 1")不断刷新页面,每次刷新的页面都根据$_SESSION中存储的数组进行调整,这样就完成了游戏的基本流程。

$this->cpu()方法负责计算蛇体位置数组和食物以及方向控制和得分情况

$this->print()方法负责通过页面自动刷新把数据显示在屏幕上

游戏结束的动画是通过html原生标签<marquee>实现的。

最后,这个代码都是在手机上写的,最近发现ios上新出了个phpwin的app,可以写php代码也可以运行。

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-04-18 17:20:14  更:2022-04-18 17:21:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 15:01:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码