0

我正在尝试在 Laravel 中制作浏览器游戏,但在理解工厂文档时遇到了一些麻烦。

所以情况就是这样,每个英雄可能有5个技能。但是英雄只会随机分配5个技能中的3个。

1,2,3
1,2,4
1,2,5
2,3,4
2,3,5
3,4,5

有没有办法创建这些独特的组合,而不是复制工厂 6 次?

Hero::factory()->create([
    'hero_class' => 'Warrior',
    'attribute_health' => 100,
    'attribute_attack' => 35,
    'attribute_armor' => 75,
    'attribute_speed' => 22,
    'attribute_crit' => 15,
    'skill_1' => 1,
    'skill_2' => 1,
    'skill_3' => 1,
]);

我在文档中看到你可以做序列

$users = User::factory()
                ->count(10)
                ->state(new Sequence(
                    ['admin' => 'Y'],
                    ['admin' => 'N'],
                ))
                ->create();

但是,如果我有更多的技能组合并且不想手动输入 50 个数组,是否有一些更动态的方法?

要进行简单的连击,我必须这样做

Hero::factory(5)
          ->state(new Sequence(
              [ 'skill_1' => 1, 'skill_2' => 2, 'skill_3' => 3, ],
              [ 'skill_1' => 1, 'skill_2' => 2, 'skill_3' => 4, ],
              [ 'skill_1' => 1, 'skill_2' => 2, 'skill_3' => 5, ],
              [ 'skill_1' => 2, 'skill_2' => 3, 'skill_3' => 4, ],
              [ 'skill_1' => 2, 'skill_2' => 3, 'skill_3' => 5, ],
              [ 'skill_1' => 3, 'skill_2' => 4, 'skill_3' => 5, ],
          ))
          ->create([
          'hero_class' => 'Warrior',
          'attribute_health' => 100,
          'attribute_attack' => 35,
          'attribute_armor' => 75,
          'attribute_speed' => 22,
          'attribute_crit' => 15,
      ]);

非常感谢您对如何解决此问题的任何见解;)

4

1 回答 1

1

你可以做的是,首先在数组中创建一些随机的、独特​​的技能组合:

$skills = [];
do { 
    $randomSkillSet = [
        'skill_1' => rand(1, 5), 
        'skill_2' => rand(1, 5), 
        'skill_3' => rand(1, 5)
    ];

    if (!in_array($randomSkillSet, $skills)) {
        $skills[] = $randomSkillSet;
    }
} while (count($skills) < 50);
// We make sure 50 is less than 5^3 = 125

现在你可以在你的序列中使用这个具有独特技能的数组,方法是从$skills序列闭包中的数组中获取每个项目,如下所示:

use Illuminate\Database\Eloquent\Factories\Sequence;

Hero::factory(50)
    ->state(new Sequence(
        function ($sequence) use ($skills) {
            return $skills[$sequence->index];
        }
    ))
 ->create([
    'hero_class' => 'Warrior',
    'attribute_health' => 100,
    'attribute_attack' => 35,
    'attribute_armor' => 75,
    'attribute_speed' => 22,
    'attribute_crit' => 15,
]);

这是可能的,因为我们可以使用注入闭包的序列实例的 index 属性。

于 2021-12-22T14:16:18.567 回答