Перетаскивание объектов из функциональных фабрик в массивы - PullRequest
0 голосов
/ 08 октября 2018

Я создал две функциональные фабрики, одну для зомби, одну для людей.Я хочу иметь функцию, которая учитывает разницу между общим здоровьем зомби и общим человеческим нападением.Он работает с одним, но я не могу понять, как сделать несколько людей против зомби.Я пытался поместить объекты-люди в массив, чтобы суммировать все атаки (я бы повторил для зомби), но не повезло ...

//Create a Human spawning object
var humanArr = [];
const humanSpawns = (attack) => {
    let human = {
        attack: attack
    };
    humanArr.push(human);
};


//Create a Zombie spawning object
const zombieSpawns = (health) => {
    return {
        health: health
    }
};


//Create function to have humans and zombies fight
function fight() {
   var result = humanOne.attack - zombieOne.health;
   if(result > 0) {
       document.write('Live to see another day.');
   } else {
       document.write('The zombies are taking over!');
   }
}

const zombieOne = zombieSpawns(12);
const humanOne = humanSpawns(11);
fight();

1 Ответ

0 голосов
/ 08 октября 2018

Попробуйте что-то похожее на мой фрагмент, вам действительно нужен метод создания юнитов.Я использовал простые объекты, но если вы хотите вернуть casualties, скажем, вам нужно будет вернуть массив humanoids для каждого основного объекта и splice их в бою на основе входящего урона.Полегче, вы увидите, как сражаются ваши армии!

Логика, которую я преследовал:

  1. Мне нужна армия!

    1.1.Чтобы создать армию, сначала мне нужно несколько юнитов, поэтому я строю createHumanoid (должен был переименовать это в createArmy)

    1.2.createHumanoid поможет установить некоторые свойства для юнитов и сколько их будет в моей армии.

  2. Создать массив armies, где я буду создавать свои армии, используя createHumanoid

  3. Мне нужно было знать, насколько сильна армия, поэтому я строю getArmyPower, который возвращает name и power армии, это будет использовано в 4.2. .

  4. Битва начинается!(FavoritesArmy = 'люди')

    4.1.Метод fight создается и принимает два параметра: первый - armies, второй - favoriteArmy

    4.2.Используя метод .map , я применяю getArmyPower к каждой из моих армий (элементов массива), чтобы узнать их силу

    4.3.Затем я использую .sort , чтобы отсортировать их по убыванию army.power

    4.4.let victorious = armies[0]; достанет мне первый элемент из отсортированного массива.Тот, кто обладает высшей силой.Или вы можете использовать destruuring и записать его как let [victorious] = armies; (который представляет первый элемент из массива)

    4.5.Я сравниваю victorious.name с favoriteArmy, чтобы проверить, выиграла или потеряла интересующая меня армия.

/**
 * A function to create units
 */
const createHumanoid = (race, howMany, stats) => {

  return {
    name: race,
    armySize: howMany,
    unitStats: stats
  }

};

/**
 * Register the armies into battle
 */
let armies = [

  createHumanoid('humans', 12, {
    health: 10,
    attack: 12
  }),
  createHumanoid('zombies', 5, {
    health: 30,
    attack: 12
  }),

]

/**
 * Get the max power of each army - you can adjust the algorithm
 */
const getArmyPower = (army) => {
  return {
    name: army.name,
    power: +army.armySize * (+army.unitStats.health + +army.unitStats.attack)
  }

}

/**
 * Let them fight and see what your favorite army did in the battle
 */
function fight(armies, favoriteArmy) {

  armies = armies
    .map(army => getArmyPower(army))
    .sort((a, b) => b.power - a.power);

  let victorious = armies[0];

  if (victorious.name.toLowerCase() === favoriteArmy.toLowerCase()) {
    document.write('Live to see another day.');
  } else {
    document.write('The zombies are taking over!');
  }
}

fight(armies, 'humans');
...