0

このタイプのシナリオは、stackoverflow および Google 検索では見つかりませんでした。

私が書いたコードのロジックで問題が発生しました。問題は、以下の rollGiftsandLegacies 関数のケース 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[];
    }
}

正しく表示されますが、もっとうまくできると思います...

配列、および結果を実際にループする 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>");
    }
}

封印されたトランクを 2 つ (またはそれ以上無限に) 中に物を入れて転がすと、次のようになります。

中身が入った封印されたトランク:

楽器。
キャラクターの本当の(そしてカラフルな)家族の歴史。
宝石の短剣。
封印されたトランクの中身:
宝石の剣。
地図。
封印されたトランクの中身:
普通の剣。

私はそれが次のようになりたい:

中身が入った封印されたトランク:

*楽器.*
*キャラクターの本当の (そしてカラフルな) 家族の歴史.*
*宝石の短剣.*

中身が入った封印されたトランク:

*宝石の剣*
*地図*

中身が入った封印されたトランク:

*プレーンソード*

どんな助けでも大歓迎です!

4

1 に答える 1

0

$cultureRewards変数を使用するのが最も簡単な方法だと思います。

最初に正しい値に設定し、ループします。

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

    if ($dice == 1) {
        $cultureRewards += d3();
    }
}

追加するために編集されました:

最初に思ったほど簡単ではありません。パラメータとして渡す必要$cultureRewardsrollRewardsあります。それは、追加のダイスロールを取得するかどうかを確認する場所ですよね?

于 2012-07-13T18:52:55.080 に答える