我正在學習面向對象和函數式編程。我在10分鐘內在YouTube上解釋OOP發現了這個非常好的簡短例子(如果你知道更好的例子,請建議),耶! https://www.youtube.com/watch?v=4c4nP7GLL1c您將如何使用函數式編程編寫此代碼
現在,我想學習如何編寫這段代碼的功能性的方式 - 與不變性,不遞歸循環等
DEMO.PHP
<?php
Include_once(「player.php」);
$p1 = new player();
$p1->name = 「Brutus」;
$p1->type = 「Warrior」;
$p1->hitpoints = 100;
$p2 = new player();
$p2->name = 「Mysterio」;
$p2->type = 「Sorcerer」;
$p2->hitpoints = 100;
$p1->meleeAttack($p2);
$p2->meleeAttack($p1);
Echo 「<h1> Fight Results</h1>」;
Echo 「<h2>.$p1->name.」 now has 「.$p1->hitpoints.」 hit points</h2>」;
Echo 「<h2>.$p2->name.」 now has 「.$p2->hitpoints.」 hit points</h2>」;
?>
PLAYER.PHP
<?php
Class player {
public $name;
public $type;
public $hitpoints;
public function meleeAttack($target){
$current_hp = $target->hitpoints; // hp is for hitpoints
$damage = rand(10,20);
if($this->type == 「Warrior」) { // condition logic
$damage += 10;
}
$target->hitpoints = $current_hp - $damage;
}
}
?>
乾杯, 附:我知道,PHP是不是函數式編程所選擇的語言,沒有必要提醒吧:)
這不會是非常不同的;你沒有循環來取代。基本上,你使'meleeAttack'成爲一個以兩個玩家爲參數的函數,並返回一個新生命值降低的生命值,而不是一個使玩家變異的方法。根據你是否使用純粹的功能語言,你如何處理隨機傷害會有所不同。 – chepner
我不明白,「...返回一個新的玩家......」部分。老玩家會怎麼樣?程序如何知道哪個播放器是最近的?我需要看到代碼:( – user3013157
)除了更新一個包裝的屬性,你用一個新的對象替換了現有的玩家,除了它有更少的生命點之外,'meleeAttack'變成了一個複製構造器,除了「copy 「如果玩家1攻擊玩家2,你會寫'$ p2 = meleeAttack($ p1,$ p2)'這個函數讓攻擊者並將其目標作爲參數,並返回目標的修改副本 – chepner