yandod / php-warrior
这是一款用PHP编写的游戏,用于学习和了解PHP和人工智能。
Requires
- php: >=5.4.0
- gettext/gettext: 3.4.*
- ulrichsg/getopt-php: 2.3
Requires (Dev)
- phpunit/phpunit: ~4
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"