Php 具有无限循环可能性的函数切换递归

Php 具有无限循环可能性的函数切换递归,php,class,function,loops,recursion,Php,Class,Function,Loops,Recursion,我在stackoverflow和google搜索中没有发现这种情况 我在我编写的代码中遇到了逻辑问题。问题出现在下面RollGiftsAndLegages函数的情况18中: class char { private function d4() { $RNG = mt_rand(1,4); return $RNG; } // etc. public function recursiveArrayShrink($array) { array_walk_rec

我在stackoverflow和google搜索中没有发现这种情况

我在我编写的代码中遇到了逻辑问题。问题出现在下面RollGiftsAndLegages函数的情况18中:

class char
{
    private function d4() { $RNG = mt_rand(1,4); return $RNG; }
    // etc.

    public function recursiveArrayShrink($array) {
        array_walk_recursive($array, function($v, $k, $res) { $res[] = $v; }, $res);
        return $res;
    }
    private function rollCulture($dice) {
        switch($dice) {
            case 1: // For this culture, we have a 1-3 different types of rewards
                for ($i = 1; $i <= $this->d3(); $i++) {
                    $GiftsAndLegacies[$i] = $this->rollGiftsandLegacies($this->d20());
                }
                $results = $this->recursiveArrayShrink($GiftsAndLegacies);
                $this->character['culture']['benefits'] = $results;
            break;
        }
    }
    private function rollGiftsandLegacies($dice) {
        switch($dice) {
            case 1: // A Weapon
                switch($this->d10()) {
                    case 1: $gifts[] = "Gemmed dagger."; break;
                    case 2: $gifts[] = "Gemmed sword."; break;
                    case 3: $gifts[] = "Plain sword."; break;
                    case 4: $gifts[] = "A mace."; break;
                    case 5: $gifts[] = "Gemmed spear."; break;
                    case 6: $gifts[] = "Well-made short or long bow."; break;
                    case 7: $gifts[] = "Gemmed battle-axe."; break;
                    case 8: $gifts[] = "Any type of crossbow."; break;
                    case 9: $gifts[] = "Exotic weapon. GM Only"; break;
                    // Simple re-roll example: works!
                    case 10: 
                        for($i = 1; $i <= $this->d4(); $i++) {
                            $gifts[] = $this->rollGiftsandLegacies($dice = 16);
                        }
                    break;
                }
            break;
            case 2: $gift = "A tapestry."; break;
            case 18: // SEALED TRUNK: 60% chance that it contains 2-4 additional items on this table.
                if($this->d100() <= 60) {
                    $gifts[] = "A sealed trunk with contents:";
                    $this->GiftsAndLegaciesSealedTrunk = $this->d3() + 1;
                    for($i = 1; $i <= $this->GiftsAndLegaciesSealedTrunk; $i++) {
                        $roll = $this->d20();
                        $item = $this->recursiveArrayShrink($this->rollGiftsandLegacies($roll));
                        $item[0] = "&nbsp;&nbsp;&nbsp;<i>". $item[0];
                        $item[0] .= "</i>";
                        $gifts[] = $item;
                    }
                } else {
                    $gifts[] = "A sealed trunk that is empty.";
                }
            break;
        }
        return $gifts[];
    }
}
类字符
{
私有函数d4(){$RNG=mt_rand(1,4);返回$RNG;}
//等等。
公共函数递归数组收缩($array){
array_walk_recursive($array,function($v,$k,$res){$res[]=$v;},$res);
返回$res;
}
私有函数(骰子){
开关($骰子){
案例1://对于这种文化,我们有1-3种不同类型的奖励
对于($i=1;$i d3();$i++){
$giftsandlegages[$i]=$this->rollgitsandlegages($this->d20());
}
$results=$this->recursiveArrayShrink($giftsandLegages);
$this->character['culture']['benefits']=$results;
打破
}
}
私有函数rollgiftsandlegages($dice){
开关($骰子){
案例1://武器
开关($this->d10()){
案例1:$gifts[]=“宝石匕首”。破绽;
案例二:$gives[]=“宝剑。”破绽;
案例三:$gives[]=“普通剑。”破绽;
案例4:$gives[]=“一个狼牙棒。”休息;
案例5:$gives[]=“宝石长矛”。打破;
案例6:$gives[]=“做工精良的短弓或长弓。”打断;
案例7:$gifts[]=“宝石战斧”。破绽;
案例8:$gives[]=“任何类型的弩。”打断;
案例9:$gifts[]=“仅限奇异武器.通用汽车”;中断;
//简单的重新滚动示例:works!
案例10:
对于($i=1;$i d4();$i++){
$gifts[]=$this->rollgiftsandlegages($dice=16);
}
打破
}
打破
案例2:$gift=“挂毯。”中断;
案例18://密封的行李箱:60%的几率在该表中包含2-4个附加项目。
如果($this->d100()GiftsAndLegaciesSealedTrunk=$this->d3()+1;
对于($i=1;$i giftsandlegaciessaledtrunk;$i++){
$roll=$this->d20();
$item=$this->recursiveArrayShrink($this->rollgiftsandlegages($roll));
$item[0]=.$item[0];
$item[0]。=“”;
$gifts[]=$item;
}
}否则{
$gifts[]=“一个空的密封行李箱。”;
}
打破
}
退回$gives[];
}
}
我能正确显示,但我觉得我可以做得更好

数组和实际循环结果的foreach如下所示:

Array
(
    [0] => A sealed chest with contents:
    [1] =>     A musical instrument.
    [2] =>     The characters true (and colorful) family history.
    [3] =>     Gemmed dagger.
    [4] =>     A sealed trunk with contents:
    [5] =>     Gemmed sword.
    [6] =>     A map.
    [7] =>     A sealed trunk with contents:
    [8] =>     Plain sword.
)
if(isset($c['culture']['benefits'])) {
    foreach($c['culture']['benefits'] as $benefit) {
        print("".$benefit."<br>");
    }
}
数组
(
[0]=>一个装有物品的密封箱子:
[1] =>一种乐器。
[2] =>人物真实(丰富多彩)的家族史。
[3] =>宝石匕首。
[4] =>装有物品的密封行李箱:
[5] =>宝石剑。
[6] =>一张地图。
[7] =>装有物品的密封行李箱:
[8] =>普通剑。
)
如果(isset($c['culture']['benefits'])){
foreach($c['culture']['benefits']作为$benefits){
打印(“$PROVICE.”
”; } }
如果我滚动两个密封的箱子(或无限多个箱子),里面有东西,它看起来是这样的:

装有内容物的密封行李箱:

一种乐器。
这些人物真实(丰富多彩)的家族史。
宝石匕首。
装有内容物的密封行李箱:
宝石剑。
地图。
装有内容物的密封行李箱:
普通剑

我希望它看起来像:

装有内容物的密封行李箱:

*一种乐器。*
*人物真实(丰富多彩)的家族史。*
*宝石匕首* 装有内容物的密封行李箱:

*宝石剑。*
*一张地图* 装有内容物的密封行李箱:

*普通剑。*

任何帮助都将不胜感激!

我认为最简单的方法是使用
$culturewards
变量

在开始时将其设置为正确的值,并进行循环:

while ($cultureRewards > 0) {
    # roll dice
    $cultureRewards--;

    if ($dice == 1) {
        $cultureRewards += d3();
    }
}
编辑以添加:


这并不像我第一次想的那么简单;你必须把
$culturewards
作为参数传递到
rollRewards
中,因为这就是你想要看你是否得到额外的骰子卷的地方,对吗?

有必要玩d&d来理解这个问题或其他什么吗?我不明白你想做什么..第一个奖励在FOR循环中@cultureRoll函数从rollRewards生成该列表中的更多d4项。我如何调用该函数并重新迭代该循环以包含更多d4项?(是的,如果它掷出1,然后再掷出10个,d4个以上的项目!!不清楚你到底在做什么。我认为你不需要玩D&D来理解它,但它确实有帮助!@netcoder,不是真的,回答你的问题是可选的。是的,非常多。如果你在rollRewards中掷出1,那么你将被带到一个子表,现在就是d10。如果在该子表上滚动10,则在该子表上会获得额外的d4项。:)你的回答至少是有帮助的……我会再仔细研究一下,那张表上的1是“这张表上有一个额外的D4骰子”?是吗?你能调整你的代码,让奖励以数组而不是字符串的形式返回吗?因为这样做非常简单!这看起来比我想象的要优雅得多-耶为了递归!