删除元素时,数组返回未定义

时间:2020-01-21 23:15:52

标签: javascript arrays

出于无聊,我决定用Javascript制作俄罗斯轮盘游戏。我设法完成了项目符号部分,该部分是1到6之间的一个随机数(16.66%)。每当随机数达到“ 1”时,玩家将死亡,并将其从玩家列表中删除。播放器存储在数组中。

一旦播放器死机并从数组中删除,它会给出未定义的结果,这很奇怪,因为我的数组选择器工作正常。从数组中删除名称后,代码如何给出未定义的结果?

var players = ["Dmitry", "Sergey", "Nikolai", "Vladimir"];
var totalPlayers = players.length;
var playerSelector = 0;

function showPlayers(){
  alert(players);
  
}

function startGame(){
  var randomNumber = Math.floor(Math.random() * 6) + 1;
  
  if (playerSelector == totalPlayers){
    playerSelector = 0;
  }
  
  if (randomNumber == 1) {
    alert("Player: " + players[playerSelector] + "\nAmmo Slot " + randomNumber + "\nYou are dead..");
    players.splice(playerSelector, 1);
  }
  else {
    alert("Player: " + players[playerSelector] + "\nAmmo Slot " + randomNumber  + "\nYou survived");
  }
  playerSelector++;
}
<button onclick="startGame()">Start Roulette</button>
<button onclick="showPlayers()">Show Players</button>

3 个答案:

答案 0 :(得分:0)

您可能还想在玩家被杀死时减少totalPlayers

var players = ["Dmitry", "Sergey", "Nikolai", "Vladimir"];
var totalPlayers = players.length;
var playerSelector = 0;

function showPlayers(){
  alert(players);
  
}

function startGame(){
  var randomNumber = Math.floor(Math.random() * 6) + 1;
  
  if (playerSelector == totalPlayers){
    playerSelector = 0;
  }
  
  if (randomNumber == 1) {
    alert("Player: " + players[playerSelector] + "\nAmmo Slot " + randomNumber + "\nYou are dead..");
    players.splice(playerSelector, 1);
    totalPlayers--; //Here
  }
  else {
    alert("Player: " + players[playerSelector] + "\nAmmo Slot " + randomNumber  + "\nYou survived");
  }
  playerSelector++;
}
<button onclick="startGame()">Start Roulette</button>
<button onclick="showPlayers()">Show Players</button>

答案 1 :(得分:0)

如果以下情况,我会更改:

if (playerSelector == totalPlayers){
playerSelector = 0;

}

收件人:

if (playerSelector >= players.length){
playerSelector = 0;

}

因为totalPlayers没有改变。

也许您还应该检查一下,是否还有剩余的球员。

答案 2 :(得分:0)

就像其他人提到的那样,totalPlayers永远不会更新,所以您最终引用的索引对于数组的大小而言太大,这是有道理的。如果您的数组有3个项目,则第二个索引为最后一个项目。但是,如果您从数组中删除一项,则其长度现在只有2,因此 first 索引现在将是数组中的最后一项,而第二个索引将不再存在。我已经调整了您的代码以解决此问题,我也做了一些其他优化:

var playerSelector = 0, players = ["Dmitry", "Sergey", "Nikolai", "Vladimir"];

function startGame() {
  var randomNumber = rando(1, 6);
  playerSelector = ++playerSelector % players.length;

  if (randomNumber === 1) alert("Player: " + players.splice(playerSelector, 1)[0] + "\nAmmo Slot " + randomNumber + "\nYou are dead..");
  else if (players.length > 0) alert("Player: " + players[playerSelector] + "\nAmmo Slot " + randomNumber + "\nYou survived");
}
<script src="https://randojs.com/1.0.0.js"></script>
<button onclick="startGame()">Start Roulette</button>
<button onclick="alert(players);">Show Players</button>

说明:

请注意,将++放在变量之前会按操作顺序在其他任何变量之前增加其值。 % (modulus)是在除法后给出余数的运算符。因此,playerSelector = ++playerSelector % players.length;递增playerSelector并将其敲回零,而不是使其达到players.length

splice返回其已删除项目的数组,因此,如果需要,您可以将该行内嵌在警报中。如果if语句是一行,则不需要{},但是,这只是首选项。在else if语句中,我进行了检查以确保在警告任何内容之前仍存在一个播放器,以避免访问空数组的索引。

我还使用了===而不是==,因为将==与0和1一起使用可能很奇怪,所以这是一个好习惯。如果您不相信我,请查看以下内容:

console.log(true == 1, "" == 0);

最后,我使用randojs.com简化了随机性并使它更具可读性。如果要使用randojs,只需确保将其粘贴在html文档的head标签中即可。

<script src="https://randojs.com/1.0.0.js"></script>
相关问题