yandod/php-warrior

这是一款用PHP编写的游戏,用于学习和了解PHP和人工智能。

v0.0.8 2015-07-04 09:27 UTC

This package is not auto-updated.

Last update: 2024-09-24 03:45:40 UTC


README

这是一款旨在以有趣、互动的方式教授PHP语言和人工智能的游戏。

PHP Warrior是Ruby Warrior的PHP版本实现。

你将扮演一名战士,攀登一座高塔,以到达顶层珍贵的PHP。在每一层,你需要编写一个PHP脚本来指导战士与敌人战斗、营救俘虏并到达楼梯。你对每一层的内容有一些了解,但永远无法确定会发生什么。你必须提前给予战士足够的人工智能,以便他能找到自己的路。

入门指南

首先安装该包。

composer global require "yandod/php-warrior=*"
export PATH=$HOME/.composer/vendor/bin:$PATH

然后运行"phpwarrior"命令来设置您的配置文件。这将在您的当前位置创建一个phpwarrior目录,在其中您将找到配置文件目录中的player.php文件,其中包含以下内容:

<?php
  class Player {
    public function play_turn($warrior){
      # your code goes here
    }
  }

您的目标是填写这个"play_turn"方法,以指导战士做什么。随着每个级别的提升,您的技能将增长,难度也会增加。有关您战士在当前级别上可用的能力的详细信息,请参阅配置文件目录中的README。

以下是一个简单的例子,它将指导战士在感到敌人时攻击,否则他将向前行走。

<?php
  class Player {
    public function play_turn($warrior) {
      if ($warrior->feel()->is_enemy()) {
        $warrior->attack();
      } else {
        $warrior->walk();
      }
    }
  }

编辑完player.php后,保存文件并再次运行"phpwarrior"命令以开始玩这一级。游戏通过一系列的回合进行。在每个回合中,都会调用您的"play_turn"方法和任何敌人的。

您不能在级别中间更改您的代码。您必须考虑该级别可能发生的所有情况,并从开始就给出战士适当的指示。

失去所有健康将导致您在该级别失败。您不会因此受到惩罚,您只需返回到player.php,改进您的代码,并再次尝试。

通过一个级别(通过到达楼梯)后,配置文件README将更新为下一级。修改player.php文件并再次运行php-warrior以玩下一级。

得分

您的目标不仅是到达楼梯,还要获得尽可能高的分数。在级别上,您有多种方式可以赚取积分。

  • 击败一个敌人,将他的最大健康值加到您的分数上
  • 营救一个俘虏,获得20分
  • 在额外时间内通过级别,获得剩余的额外时间
  • 击败所有敌人并营救所有俘虏,将获得20%的整体加分

随着您通过级别,将保持总分数。通过一个级别后,该分数将添加到总分数中。

一开始不要过于担心完美得分。在您到达塔顶后,您将能够重新运行塔并微调您的战士以获得最高分数。有关详细信息,请参阅下面的史诗模式。

视角

尽管这是一款基于文本的游戏,但您可以将其视为二维的,您是从上方观看的。每个级别都是矩形形状,由多个方块组成。一次只能有一个单位在给定的方块上,您的目标是找到楼梯所在的方块。以下是级别地图和密钥的示例。

 ----
|C s>|
| S s|
|C @ |
 ----

> = Stairs
@ = Warrior (20 HP)
s = Sludge (12 HP)
S = Thick Sludge (24 HP)
C = Captive (1 HP)

指挥战士

刚开始时,你的战士只有少数几种能力,但随着等级的提升,你的能力会逐渐增长。战士有两种类型的能力:动作和感知。

动作是对游戏产生某种影响的行动。你可以很容易地识别动作,因为它们以感叹号结尾。每回合只能执行一个动作,所以请谨慎选择。以下是一些动作的例子。

// Move in given direction (forward by default).
$warrior->walk()

// Attack the unit in given direction (forward by default).
$warrior->attack()

// Gain 10% of max health back, but do nothing more.
$warrior->rest()

// Bind unit in given direction to keep him from moving (forward by default).
$warrior->bind()

// Rescue a captive from his chains (earning 50 points) in given direction (forward by default).
$warrior->rescue()

感知是收集关于地面的信息的东西。你可以在每回合中多次执行感知,以收集有关周围环境的信息,并帮助你选择正确的动作。感知不以感叹号结尾。

// Returns a Space for the given direction (forward by default).
$warrior->feel()

// Returns an integer representing your health.
$warrior->health()

// Returns the number of spaces the stairs are away.
$warrior->distance()

// Returns an array of all spaces which have units in them.
$warrior->listen()

由于你感知到的信息会每回合改变,你应该记录下你收集到的信息,以便在下回合使用。例如,如果你从上一回合开始健康值下降了,你可以确定你正在受到攻击。

空间

每当你感知一个区域时,通常会返回一个或多个空间(在数组中)。空间是代表关卡中一个方格的对象。你可以对空间调用方法来收集有关那里的信息。以下是你可以调用空间的各种方法。

space->is_empty()
  If true, this means that nothing (except maybe stairs) is at this location and you can walk here.

space->is_stairs()
  Determine if stairs are at that location

space->is_enemy()
  Determine if an enemy unit is at this location.

space->captive()
  Determine if a captive is at this location.

space->is_wall()
  Returns true if this is the edge of the level. You can't walk here.

space->is_ticking()
  Returns true if this space contains a bomb which will explode in time.

space->is_golem()
  Returns true if a golem is occupying this space.

你通常会在感知之后直接调用这些方法。例如,“感觉”感知返回一个空间。你可以调用“captive?”来确定是否有俘虏在你面前。

$warrior->feel()->is_captive()

哥布林

在你的旅途中,你可能发现创造哥布林的能力。这是一个你可以控制的独立单位。回合处理是通过一个块来完成的。以下是一个例子。

$warrior->form(function($golem) {
  if ($golem->feel()->is_enemy()) {
    $golem->attack();
  }
});

在这个块中可以放置复杂的逻辑,就像在玩家回合方法中一样。你可能希望将逻辑移动到自己的类中,或者为不同类型的哥布林创建多个类。你可以在关卡中创建多个哥布林,但每个哥布林将占用战士一半的健康值。

史诗模式

一旦你到达塔顶,你将进入史诗模式。再次运行php-warrior时,它将不断运行你的当前player.php文件通过塔中的所有关卡,不会停止。

你的战士可能不会第一次就成功,所以对于你感到困难或想要微调得分的关卡,请使用-l选项。

php-warrior -l 3

一旦你的战士再次到达塔顶,你将收到一个平均分数,以及每个关卡的一个分数。从最好到最差的分数是S、A、B、C、D和F。尝试在每级获得S以获得最佳分数。

注意:我正在调整评分系统。如果您发现某个关卡上的"S"等级太容易或太难实现,请在GitHub上为此添加一个问题。

提示

如果你在某个关卡上卡住了,请查看README文档,并确保你在尝试每个能力。如果你无法维持健康值,请确保在没有敌人(同时关注你的健康)的情况下“休息”。此外,尽可能使用远程武器(如弓)。

记住,你在这里使用的是PHP。不要简单地在“play_turn”方法中填入大量代码。使用方法和类来组织它。玩家目录被设置为加载路径,因此你可以从你的player.php文件中包含其他PHP文件。

感知很便宜,所以请尽量使用。存储感知信息,以帮助你在未来更好地确定要采取的行动。

当你处于你的配置文件目录中时运行“phpwarrior”将自动选择该配置文件,这样你就不必每次都选择。

如果你目标是获得分数,请记住打扫区域。即使你靠近楼梯,也不要进去,直到你得到了所有东西(如果你有健康值)。使用远程感知(如查看和倾听)来确定是否有剩余的敌人。

确保尝试你可以传递给phpwarrior命令的不同选项。运行“phpwarrior --help”以查看所有选项。

常见问题解答

如何安装开发版本?

composer global require "yandod/php-warrior=dev-master"

如何卸载php-warrior?

composer global remove "yandod/php-warrior"