用Swoole来写个联机对战游戏呀!(二)单机游戏架构

栏目: PHP · 发布时间: 5年前

内容简介:教程需要在合适的位置新建一个文件夹为了后续开发的方便,我们需要为我们的项目引入

教程需要 PHP-7.x 版本支持,由于不是面向基础小白, PHP 环境需要童鞋们自行安装配置,以下是一些有可能有帮助的资料:

引入Composer

在合适的位置新建一个文件夹 HideAndSeek 作为我们的项目根目录。

为了后续开发的方便,我们需要为我们的项目引入 composer 的自动加载机制,并在项目根目录运行以下命令:

composer init
复制代码
  • 小提示:没有安装 composer 的童鞋需要自行安装喔: pkg.phpcomposer.com/#how-to-ins…
  • 启用国内镜像地址,下载速度更快。
  • 国内镜像一: 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 install
复制代码

composer 就会为我们创建 vendor 文件夹,里面会有一个 autoload.php 文件,这个文件就是用来实现类自动加载机制。

建立项目结构

下一步就是编写游戏的逻辑,实现一个单机版的捉迷藏。

在上面创建的文件夹 HideAndSeek 中新建一个 test.php 文件

HideAndSeek
└─test.php
复制代码

为什么要新建这个 test.php 呢?因为我们现在对整个项目的架构毫无头绪,所以需要将这个游戏逻辑拆分成几个步骤,并且将逻辑预先写在 test.php 文件中。

赵童鞋设想的游戏逻辑是这样的:

  1. 每个玩家要有一个ID,用来区别玩家。
  2. 要有一个游戏控制器,用来创建玩家、执行移动逻辑、判断游戏是否结束。
  3. 使用游戏控制器创建玩家,游戏开始。
  4. 使用游戏控制器控制某个玩家进行移动。

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

<?php
namespace App\Manager;
class Game
{
}
复制代码

我们现在要思考一下游戏还需要哪些实体类,我们捉迷藏游戏有玩家,有地图,所以游戏还需要两个实体类:一个是 玩家类 ,另一个是 地图类 ,没错,这就是面向对象编程,而不是面向运气编程。

app 文件夹下新建 Model 文件夹,用来存放各种游戏实体类,并在其中新建 Player 类和 Map 类:

<?php
namespace App\Model;
class Player
{
}
复制代码
<?php
namespace App\Model;
class Map
{
}
复制代码

完善各类代码

现在我们需要思考一下,这三个类各自的属性和方法需要有哪些。

Map类

我们先从最简单的 Map 类开始:

Map
Map
Map

由于生成一个地图的算法有点复杂,我们现在的重点只在于编写游戏逻辑,所以地图数据可以先写死。

<?php
namespace 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 类:

  1. Player 对象应该有一个自己的唯一ID。
  2. Player 对象需要有自己的坐标,用来标识他在地图的位置。
  3. Player 对象需要有自己的类型,分为 寻找者躲藏者
  4. Player 类中需要有四个方向常量用来控制当前坐标,分别是 右。
<?php
namespace App\Model;
class Player
{
    const UP = 'up';
    const DOWN = 'down';
    const LEFT = 'left';
    const RIGHT = 'right';

    const PLAYER_TYPE_SEEK = 1;
    const PLAYER_TYPE_HIDE = 2;

    private $id;
    private $type = self::PLAYER_TYPE_SEEK;
    private $x;
    private $y;

    public function __construct($id, $x, $y)
    {
        $this->id = $id;
        $this->x = $x;
        $this->y = $y;
    }

    public function setType($type)
    {
        $this->type = $type;
    }

    public function getId()
    {
        return $this->id;
    }
}
复制代码

Game类

最后轮到我们的游戏控制器 Game 类啦~

  1. 新建一个 Game 对象时需要生成一个地图并且保存地图数据。
  2. Game 中需要一个数组保存两个玩家数据。
  3. Game 中需要实现 createPlayer() 方法用来添加玩家。
  4. Game中 需要实现 playerMove() 方法操作玩家移动。
<?php
namespace App\Manager;

use App\Model\Map;

class Game
{
    private $gameMap = [];
    private $players = [];

    public function __construct()
    {
        $this->gameMap = new Map(12, 12);
    }

    public function createPlayer($playerId, $x, $y)
    {
    }

    public function playerMove($playerId, $direction)
    {
    }
}
复制代码

童鞋们先尝试实现一下 createPlayer 方法和 playerMove 方法应该怎么实现,我们下一章再来揭秘。

当前目录结构:

HideAndSeek
├── app
│   ├── Manager
│   │   └── Game.php
│   └── Model
│       ├── Map.php
│       └── Player.php
├── composer.json
├── test.php
└── vendor
    ├── autoload.php
    └── composer
复制代码
用Swoole来写个联机对战游戏呀!(二)单机游戏架构

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Python高性能(第2版)

Python高性能(第2版)

[加] 加布丽埃勒•拉纳诺(Gabriele Lanaro) / 袁国忠 / 人民邮电出版社 / 2018-8 / 59.00元

本书是一本Python性能提升指南,展示了如何利用Python的原生库以及丰富的第三方库来构建健壮的应用程序。书中阐释了如何利用各种剖析器来找出Python应用程序的性能瓶颈,并应用正确的算法和高效的数据结构来解决它们;介绍了如何有效地利用NumPy、Pandas和Cython高性能地执行数值计算;解释了异步编程的相关概念,以及如何利用响应式编程实现响应式应用程序;概述了并行编程的概念,并论述了如......一起来看看 《Python高性能(第2版)》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具