游戏逻辑开发进度:□□□□□□□□□□□□
本章结束开发进度:■■■■□□□□□□□□
开发环境教程需要PHP-7.x版本支持,由于不是面向基础小白,PHP环境需要童鞋们自行安装配置,以下是一些有可能有帮助的资料:
Windows:https://www.apachefriends.org...Linux:https://lnmp.org/install.htmlMac:不存在的。。赵童鞋没玩过引入Composer在合适的位置新建一个文件夹HideAndSeek作为我们的项目根目录。
为了后续开发的方便,我们需要为我们的项目引入composer的自动加载机制,并在项目根目录运行以下命令:
composer init小提示:没有安装composer的童鞋需要自行安装喔:https://pkg.phpcomposer.com/#...启用国内镜像地址,下载速度更快。国内镜像一:composer config -g repo.packagist composer https://packagist.phpcomposer.com国内镜像二:composer config -g repo.packagist composer https://packagist.laravel-china.org经过几次回车之后,composer就会为我们生成一个composer.json文件,需要在这个文件中增加以下代码:
"autoload": { "psr-4": { "App\\": "app" }},再运行一次composer命令:
composer installcomposer就会为我们创建vendor文件夹,里面会有一个autoload.php文件,这个文件就是用来实现类自动加载机制。
建立项目结构下一步就是编写游戏的逻辑,实现一个单机版的捉迷藏。
在上面创建的文件夹HideAndSeek中新建一个test.php文件
HideAndSeek└─test.php为什么要新建这个test.php呢?因为我们现在对整个项目的架构毫无头绪,所以需要将这个游戏逻辑拆分成几个步骤,并且将逻辑预先写在test.php文件中。
赵童鞋设想的游戏逻辑是这样的:
每个玩家要有一个ID,用来区别玩家。要有一个游戏控制器,用来创建玩家、执行移动逻辑、判断游戏是否结束。使用游戏控制器创建玩家,游戏开始。使用游戏控制器控制某个玩家进行移动。test.php文件:
$redId = "red_player";$blueId = "blue_player";//创建游戏控制器$game = new Game();//添加玩家$game->createPlayer($redId, 6, 1);//添加玩家$game->createPlayer($blueId, 6, 10);//移动坐标$game->playerMove($redId, 'up');现在就很明显了,我们首要任务就是先实现这样一个游戏控制器。
在HideAndSeek文件夹中创建app文件夹,app文件夹用来存放我们项目的各种类文件。并在app文件夹中创建Manager文件夹用来存放所有管理者类的类文件,在Manager文件夹中创建Game游戏控制器类。
为了composer能够自动加载类文件,需要在Game类编写命名空间代码:namespace App\Manager,细心的童鞋已经发现了,我们上面在composer.json文件中新增代码时,就有提到App这个词,不了解自动加载机制的童鞋可以自行搜索一下composer psr-4。
<?phpnamespace App\Manager;class Game{}我们现在要思考一下游戏还需要哪些实体类,我们捉迷藏游戏有玩家,有地图,所以游戏还需要两个实体类:一个是玩家类,另一个是地图类,没错,这就是面向对象编程,而不是面向运气编程。
在app文件夹下新建Model文件夹,用来存放各种游戏实体类,并在其中新建Player类和Map类:
<?phpnamespace App\Model;class Player{}<?phpnamespace App\Model;class Map{}完善各类代码现在我们需要思考一下,这三个类各自的属性和方法需要有哪些。
Map类我们先从最简单的Map类开始:
Map对象应该在创建的时候可以指定长和宽,并生成一个地图。Map对象中应该有一个数组,用来保存完整的地图数据,我们假设这个数组中,0是墙,1是路。Map类中需要有一个方法来获取地图数据。由于生成一个地图的算法有点复杂,我们现在的重点只在于编写游戏逻辑,所以地图数据可以先写死。
<?phpnamespace App\Model;class Map{ private $width; private $height; private $map = [ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], [0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0], [0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0], [0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0], [0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0], [0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0], [0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0], [0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0], [0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], ]; public function __construct($width, $height) { $this->width = $width; $this->height = $height; } public function getMapData() { return $this->map; }}Player类第二个轮到我们的Player类:
...