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

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

内容简介:游戏逻辑开发进度:□□□□□□□□□□□□本章结束开发进度:■■■■□□□□□□□□教程需要

游戏逻辑开发进度:□□□□□□□□□□□□

本章结束开发进度:■■■■□□□□□□□□

开发环境

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

引入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 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来写个联机对战游戏呀!(二)单机游戏架构


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

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

Design systems

Design systems

Not all design systems are equally effective. Some can generate coherent user experiences, others produce confusing patchwork designs. Some inspire teams to contribute to them, others are neglected. S......一起来看看 《Design systems》 这本书的介绍吧!

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具