在循环期间从列表中删除随机选择的数组

Remove a randomly selected array from a list during a loop

我目前正在尝试开发一种基于Counter Strike的模拟游戏,以供娱乐和学习。

我做了什么: 我为每个玩家创建了对象,然后将它们放入各自团队的数组中,然后我模拟了一些决斗(随机选择哪些玩家在每一轮中面对谁),结果基于他们的统计数据(之前在他们的对象属性中声明_ .

我想做的是: 每当有人赢得决斗时,我希望将他们从 "round" 中删除,以免他们在 "died" 之后重复决斗。

for ( var i = 0; i < 5; i++ ) {
    getConsole = document.querySelector(".console");
    setTimeout( function timer(){
        getConsole.insertAdjacentHTML ("beforebegin", "<p>Round: " + rounds + "</p>" );
        calculateAim();
        rounds++
        console.log('rounds ' + rounds) }, i * 3000 );
    };
} 


function calculateAim() {

    for ( var r = 0; r < 5; r++ ) {
        getConsole = document.querySelector(".console");
        let playerTeam = [player1, player2, player3]
        let enemyTeam = [player4, player5, player6],

        battle1 = playerTeam[Math.floor(Math.random() * playerTeam.length)];
        battle2 = enemyTeam[Math.floor(Math.random() * enemyTeam.length)];
        console.log("Player Team: " + battle1)
        console.log("Enemy Team: " + battle2)

        let min1 = 0; 
        let max2 = 100;  
        let EncounterRating = Math.floor(Math.random() * (+max2 - +min1)) + +min1; 
        if (EncounterRating < 5) {
            getConsole.insertAdjacentHTML ("beforebegin", "The bomb has exploded and CT's saved their weapons. <br>");
            break;
        }

        else {

            if (battle1.aim > battle2.aim) {
                getConsole.insertAdjacentHTML ("beforebegin", battle1.name + " killed " + battle2.name + " because your aim is " + battle1.aim + " and his enemie's is " + battle2.aim + " <br>");
            } 

            if (battle1.aim < battle2.aim) {
                getConsole.insertAdjacentHTML ("beforebegin",  battle2.name + " killed " + battle1.name  + " because your aim is " + battle2.aim + " and his enemie's is " + battle1.aim + " <br>");
            }

            if (battle1.aim == battle2.aim && battle1.luck > battle2.luck) {
                getConsole.insertAdjacentHTML ("beforebegin", battle1.name + " killed " + battle2.name + " with a lucky shot<br>");
            }   

            if (battle1.aim == battle2.aim && battle2.luck > battle1.luck) {
                getConsole.insertAdjacentHTML ("beforebegin", battle2.name + " killed " + battle1.name + " with a lucky timing<br>");
            }  

        } 
    }

我从这段代码中得到的是,即使他们根据测试结果输掉了决斗,他们也会继续"round"。

解决这个问题的最简洁的方法可能是有一个函数来比较每支球队的选定球员,使用 .splice() 删除输掉的球员,然后重新提供新的、更小的数组到使用递归的相同功能。

const getConsole = document.querySelector(".console");
let rounds = 1

const player1 = { name: 'Paul', aim: 1, luck: 6 },
  player2 = { name: 'Jim', aim: 2, luck: 5 },
  player3 = { name: 'Sally', aim: 3, luck: 4 },
  player4 = { name: 'Laura', aim: 4, luck: 3 },
  player5 = { name: 'Jim II', aim: 5, luck: 2 },
  player6 = { name: 'Karen', aim: 6, luck: 1 }
  
getConsole.insertAdjacentHTML("beforebegin", "<p>Begin battle</p>");

for (var i = 0; i < 5; i++) {
  setTimeout(function timer() {
    getConsole.insertAdjacentHTML("beforebegin", "<p>Round: " + rounds + "</p>");
    battleHelper();
    rounds++
    console.log('rounds ' + rounds)
  }, i * 3000);
}


function battleHelper() {
  let playerTeam = [player1, player2, player3]
  let enemyTeam = [player4, player5, player6]
  
  battle(playerTeam, enemyTeam);
}

function battle(playerTeam, enemyTeam) { 
  // If either of the teams have no members, end the round
  if (!playerTeam.length || !enemyTeam.length) {
    return;
  }
  
  // Duplicate the input teams to modify them
  let playerTeamOutput = playerTeam
  let enemyTeamOutput = enemyTeam
  
  // Get the index for a random player from each team
  playerTeamIndex = Math.floor(Math.random() * playerTeamOutput.length)
  enemyTeamIndex = Math.floor(Math.random() * enemyTeamOutput.length)
  
  // Get the player from each team
  player = playerTeam[playerTeamIndex];
  enemy = enemyTeam[enemyTeamIndex];
  console.log("Player Team: " + player.name)
  console.log("Enemy Team: " + enemy.name)
  
  let min1 = 0;
  let max2 = 100;
  
  let EncounterRating = Math.floor(Math.random() * (+max2 - +min1)) + +min1;
  if (EncounterRating < 5) {
    getConsole.insertAdjacentHTML("beforebegin", "The bomb has exploded and CT's saved their weapons. <br>");
    // If the bomb is detonated, end the round
    return;
  } else {
    if (player.aim > enemy.aim) {
      getConsole.insertAdjacentHTML("beforebegin", player.name + " killed " + enemy.name + " because your aim is " + player.aim + " and his enemie's is " +enemy.aim + " <br>");
      enemyTeamOutput.splice(enemyTeamIndex, 1)
    
    } else if (player.aim < enemy.aim) {
      getConsole.insertAdjacentHTML("beforebegin", enemy.name + " killed " + player.name + " because your aim is " + enemy.aim + " and his enemie's is " + player.aim + " <br>");
      playerTeamOutput.splice(playerTeamIndex, 1)
    
    } else if (player.aim == enemy.aim && player.luck > enemy.luck) {
      getConsole.insertAdjacentHTML("beforebegin", player.name + " killed " + enemy.name + " with a lucky shot<br>");
      enemyTeamOutput.splice(enemyTeamIndex, 1)
    
    } else if (player.aim == enemy.aim && enemy.luck > player.luck) {
      getConsole.insertAdjacentHTML("beforebegin", battle2.name + " killed " + player.name + " with a lucky timing<br>");
      playerTeamOutput.splice(playerTeamIndex, 1)
    }
  }
  
  console.log(`Player Size: ${playerTeamOutput.length}`)
  console.log(`Enemy Size: ${enemyTeamOutput.length}`)
  
  // Immedietly recall the function to begin another battle
  return battle(playerTeamOutput, enemyTeamOutput)
}
<div class="console"></div>

感谢您发帖,如果您希望我进一步解释我所做的任何事情,请告诉我!