Source: battle.js

/**
 * This function is the battle field for the two players, it devises the logic for the players to target
 * each other turn by turn.
 * @param {Object} player1 : Player class
 * @param {Object} player2 : Player Class
 * @returns {Object} winner: Player
 */

function battle(player1, player2) {

  let player2TargetCounter = 0;
  let isPlayer1OutOfAmmo = false;
  let isPlayer2OutOfAmmo = false;
  let gameOver = false;
  let isPlayer2Hit = false;
  let winner;

  for (let p1TargetCounter = 0; p1TargetCounter < player1.targets.length; p1TargetCounter++) {

    if (gameOver) {
      break;
    }

    const player1tag = player1.getNextTarget(p1TargetCounter);
    isPlayer2Hit = player2.takeHit(player1tag);

    if (isPlayer2Hit && player2.isDefeated()) {
      console.log(`${player1.name} won the battle`);
      gameOver = true;
      winner = player1;
      break;
    }

    if (p1TargetCounter === (player1.targets.length - 1)) {
      if (isPlayer2Hit || isPlayer2OutOfAmmo) {
        console.log(`${player1.name} has no more missiles left to launch`);
      }
      isPlayer1OutOfAmmo = true;
    }


    if ((isPlayer1OutOfAmmo || !isPlayer2Hit)) {

      if (isPlayer2OutOfAmmo) {
        console.log(`${player2.name} has no more missiles left to launch`);
      } else {

        for (let p2TargetCounter = player2TargetCounter; p2TargetCounter < player2.targets.length; p2TargetCounter++) {
          const player2tag = player2.getNextTarget(p2TargetCounter);
          const isPlayer1Hit = player1.takeHit(player2tag);

          if (isPlayer1Hit && player1.isDefeated()) {
            console.log(`${player2.name} won the battle`);
            winner = player2;
            gameOver = true;
            break;
          }

          if (p2TargetCounter === (player2.targets.length - 1)) {
            if (isPlayer1Hit || isPlayer1OutOfAmmo) {
              console.log(`${player2.name} has no more missiles left to launch`);
            }
            isPlayer2OutOfAmmo = true;
          }

          if (!isPlayer1Hit) {

            if (!isPlayer1OutOfAmmo) {
              player2TargetCounter = p2TargetCounter + 1;
              break;
            } else {
              console.log(`${player1.name} has no more missiles left to launch`);
            }
          }
        }
      }
    }
  }

  if (!gameOver) {
    console.log("game is a draw");
  }
  return winner;
}

module.exports = battle;