出于无聊,我决定用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>
答案 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>