Php 具有无限循环可能性的函数切换递归
我在stackoverflow和google搜索中没有发现这种情况 我在我编写的代码中遇到了逻辑问题。问题出现在下面RollGiftsAndLegages函数的情况18中: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
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] = " <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骰子”?是吗?你能调整你的代码,让奖励以数组而不是字符串的形式返回吗?因为这样做非常简单!这看起来比我想象的要优雅得多-耶为了递归!