es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo hacer combinatoria única con Laravel Factory.

Estoy tratando de crear un juego de navegador en Laravel y tengo problemas para entender la documentación sobre las factorías.

Esta es la situación: cada héroe tiene posiblemente 5 habilidades, pero al héroe solo se le asignarán aleatoriamente 3 de las 5 habilidades.

En lugar de duplicar la factoría 6 veces, ¿existe alguna forma de que se creen estas combinaciones únicas?

Vi en la documentación que se pueden hacer secuencias:

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

Sin embargo, ¿existe alguna forma más dinámica en caso de que tenga más combinaciones de habilidades y no quiera escribir manualmente 50 arrays?

Para hacer las combinaciones simples, tuve que hacer esto:

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,
      ]);

Cualquier ayuda sobre cómo abordar esto será muy apreciada 😉

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una forma de crear combinaciones únicas de habilidades de héroes sin tener que escribir manualmente cada array es utilizar un bucle para generar las combinaciones. Una posible solución es la siguiente:

    // Definir las posibles combinaciones de habilidades
    $skill_combos = [
        [1,2,3],
        [1,2,4],
        [1,2,5],
        [2,3,4],
        [2,3,5],
        [3,4,5],
    ];
    
    Hero::factory(5)
        ->state(new Sequence(
            // Generar una combinación única de habilidades para cada héroe
            function ($i) use ($skill_combos) {
                // Mezclar el array de combinaciones de habilidades para aleatorizar el orden
                shuffle($skill_combos);
                // Tomar los primeros tres valores de habilidad para asignar al héroe
                $skills = array_slice($skill_combos[0], 0, 3);
                // Devolver la combinación única de habilidades
                return [
                    'skill_1' => $skills[0],
                    'skill_2' => $skills[1],
                    'skill_3' => $skills[2],
                ];
            }
        ))
        ->create([
            'hero_class' => 'Guerrero',
            'attribute_health' => 100,
            'attribute_attack' => 35,
            'attribute_armor' => 75,
            'attribute_speed' => 22,
            'attribute_crit' => 15,
        ]);
    

    Esta solución utiliza shuffle() para aleatorizar el orden de los arrays de combinación de habilidades, y array_slice() para tomar los primeros tres valores de habilidad del array mezclado. El estado Sequence() se utiliza para generar una combinación única de habilidades para cada héroe creado por la fábrica.

    Puedes ajustar el array $skill_combos para agregar o eliminar combinaciones posibles según sea necesario.

Comments are closed.