热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用Swoole来写个联机对战游戏呀!(三)完善游戏功能

游戏逻辑开发进度:■■■■□□□□□□□□本章结束开发进度:■■■■■■■■□□□□

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

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

上一章的答案

createPlayer 方法其实就是创建一个 Player 对象,然后指定坐标,放入 $players 数组中,但是怎么区分 追捕者躲藏者 呢?我们可以用最简单粗暴的方法,先来后到。

Game类:

public function createPlayer($playerId, $x, $y)
{
    $player = new Player($playerId, $x, $y);
    if (!empty($this->players)) {
        $player->setType(Player::PLAYER_TYPE_HIDE);
    }
    $this->players[$playerId] = $player;
}

第一个添加的将会使用 Player 类默认的 追捕者 ,第二个添加的将 $player 对象设置为 躲藏者

playerMove() 方法也很简单,通过传入的 $direction 变量,增减对应 $playerxy 坐标,应该直接调用 $player 的移动方法,所以需要新增两部分代码:

Game类:

public function playerMove($playerId, $direction)
{
    $this->players[$playerId]->{$direction}();
}

Player类:

public function up()
{
    $this->x--;
}

public function down()
{
    $this->x++;
}

public function left()
{
    $this->y--;
}

public function right()
{
    $this->y++;
}

尝试打印地图

目前我们三个实体类的基础游戏逻辑就写得差不多了,但是我们的游戏到现在都还没运行过,我们需要一个能直观看到地图、玩家的画面。

请童鞋们自己尝试在 Game 类中新增 printGameMap() 方法,打印游戏地图。

  1. Game 类中有一个变量 $gameMap 就是我们的游戏地图对象。
  2. Map 类中也有了 getMapData() 方法能够获取地图数组数据,

Game类:

public function printGameMap()
{
    $mapData = $this->gameMap->getMapData();
    foreach ($mapData as $line) {
        foreach ($line as $value) {
            if (empty($value)) {
                echo "墙,";
            } else {
                echo "    ";
            }
        }
        echo PHP_EOL;
    }
}

打印地图的代码很简单,就是遍历我们的地图数据,当数组里的元素值为 0 的时候就是 ,否则就是 就不用输出文字啦~

回到我们的 test.php ,我们将在这里调用新写的 printGameMap() 方法输出地图数据。由于我们要使用了 composer 的自动加载机制,所以要先在 test.php 文件的开头加上以下代码:

require_once __DIR__ . '/vendor/autoload.php';

引入 autoload.php 文件后,我们就能愉快的使用命名空间了,童鞋们记得要引入 Game 类哦。

test.php:

createPlayer($redId, 6, 1);
//添加玩家
$game->createPlayer($blueId, 6, 10);
//移动坐标
$game->playerMove($redId, 'up');
//打印地图
$game->printGameMap();

在控制台输入以下代码,运行 test.php 文件:

php test.php

如果童鞋们的代码没问题的话,控制台应该会输出以下内容:

墙,墙,墙,墙,墙,墙,墙,墙,墙,墙,墙,墙,
墙,                                    墙,
墙,    墙,                         墙,墙,
墙,墙,墙,墙,    墙,       墙,   墙,墙,
墙,        墙,                         墙,
墙,                          墙,墙,墙,墙,
墙,            墙,                     墙,
墙,        墙,墙,    墙,              墙,
墙,        墙,               墙,   墙,墙,
墙,        墙,墙,        墙,   墙,   墙,
墙,                                     墙,
墙,墙,墙,墙,墙,墙,墙,墙,墙,墙,墙,墙,

加入玩家坐标

光输出地图的数据可是不够的,我们还要把玩家的坐标加在地图里面,请童鞋们优化 printGameMap() 方法,使他能够输出两个玩家的位置。

  1. Game 类中的变量 $players 保存了两个 Player 对象。
  2. Player 类中的变量 $x$y 保存了玩家的坐标, $type 保存了该对象的类型,但是好像是私有变量?如何获取类中的私有变量呢?

Player类:

public function getType()
{
    return $this->type;
}

public function getX()
{
    return $this->x;
}

public function getY()
{
    return $this->y;
}

我们首先需要在 Player 类中新增一个方法 getType() 获取对象的类型, getX()getY() 获取玩家的坐标数据。

在打印地图数据之前,将玩家的地图坐标,以及类型标识放进 $mapData 中,但由于我们的地图里 1 是路,玩家类型中 1追捕者 ,直接放进去就会搞混了玩家和路的值,所以我们要在玩家类型的值上进行 +1 操作再放进地图,并且增加一个文字映射数组。

  • test.phpcreatePlayer() 传入的坐标数据小心不要和地图上的 重叠了哦

Game类:

public function printGameMap()
{
    $mapData = $this->gameMap->getMapData();
    $fOnt= [2 => '追', 3 => '躲'];
    /* @var Player $player */
    foreach ($this->players as $player) {
        $mapData[$player->getX()][$player->getY()] = $player->getType() + 1;
    }
    foreach ($mapData as $line) {
        foreach ($line as $item) {
            if (empty($item)) {
                echo "墙,";
            } elseif ($item == 1) {
                echo "    ";
            } else {
                echo $font[$item] . ',';
            }
        }
        echo PHP_EOL;
    }
}

重新运行一次我们的 test.php 文件,应该就会输出以下内容:

墙,墙,墙,墙,墙,墙,墙,墙,墙,墙,墙,墙,
墙,                                    墙,
墙,    墙,                         墙,墙,
墙,墙,墙,墙,    墙,       墙,   墙,墙,
墙,        墙,                         墙,
墙,追,                      墙,墙,墙,墙,
墙,            墙,                 躲,墙,
墙,        墙,墙,    墙,              墙,
墙,        墙,               墙,  墙,墙,
墙,        墙,墙,        墙,   墙,   墙,
墙,                                    墙,
墙,墙,墙,墙,墙,墙,墙,墙,墙,墙,墙,墙,

追捕者躲藏者 就显示出来啦,并且由于我们打印地图前调用 playerMove() 方法移动 追捕者 并传入了 up追捕者 的坐标在地图上往上走了一步。

增加地图判断

我们尝试把 追捕者 再往上走两步试试,在 test.php 文件中再调用两次 playerMove() 方法并打印地图,运行 test.php 文件:

墙,墙,墙,墙,墙,墙,墙,墙,墙,墙,墙,墙,
墙,                                     墙,
墙,    墙,                         墙,墙,
墙,追,墙,墙,    墙,       墙,    墙,墙,
墙,        墙,                         墙,
墙,                          墙,墙,墙,墙,
墙,            墙,                  躲,墙,
墙,        墙,墙,    墙,              墙,
墙,        墙,              墙,    墙,墙,
墙,        墙,墙,      墙,    墙,    墙,
墙,                                     墙,
墙,墙,墙,墙,墙,墙,墙,墙,墙,墙,墙,墙,

哦嚯,我们的 追捕者 走到 上面了,这谁顶得住啊。目前的 playerMove() 方法是不完整的,需要在其中再加入一个方法 canMoveToDirection() 去判断传入的方向是否可以移动。

Player
$direction
Game

Game类:

public function playerMove($playerId, $direction)
{
    $player = $this->players[$playerId];
    if ($this->canMoveToDirection($player, $direction)) {
        $player->{$direction}();
    }
}

private function canMoveToDirection($player, $direction)
{
}

本章的Homework就在这里啦,请童鞋们一定要尽量独立完成哦,我们将在下一章进行解答。

当前目录结构:

HideAndSeek
├── app
│   ├── Manager
│   │   └── Game.php
│   └── Model
│       ├── Map.php
│       └── Player.php
├── composer.json
├── test.php
└── vendor
    ├── autoload.php
    └── composer

用Swoole来写个联机对战游戏呀!(三)完善游戏功能


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


推荐阅读
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 如何通过swoole加速laravel的问题?
    这篇文章主要介绍了关于如何使用swoole加速laravel,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下再来复习一下吧,导致php慢的各种因素中解析性语言的 ... [详细]
  • laravel 使用腾讯云 COS5全教程
    laravel使用腾讯云COS5全教程一下载首先第一步肯定是用composer把包安装下来,这里是laravel5.8版本的,所以我用的是cos5 ... [详细]
  • windows下composer命令无效的解决办法
    开发工具|composerwindows,composer开发工具-composer下面由composer教学栏目给大家介绍windows下composer安装不了或compose ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了未找到类'MaddHatterLaravelFullcalendarServiceProvider'相关的知识,希望对你 ... [详细]
author-avatar
Katycui
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有