我有下面的代码,当实例化两个类(Player,Game)时,都会在Player.gameBoard数组中插入特定数量的玩家。我试图仅在数组元素为0的情况下将Player类添加到数组中。因此,如果将Player对象插入gameboard [0] [0]位置,则其他任何玩家都无法覆盖他。当前,如果选择大量玩家(例如20名),则其中的一些玩家将被覆盖,并且不会全部出现。所以我想while循环有问题。
var question = prompt('how many players');
var numOfPlayers = parseInt(question);
class Game {
constructor(){
this.health = 100;
this.hammer = false
this.knife = false;
this.sword = false;
this.baseballbat = false;
this.damage = 0;
this.gameBoard = [
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
];
}
}
class Player {
constructor(id){
this.id=id;
this.location = {
x:Math.floor(Math.random()*8),
y:Math.floor(Math.random()*8)
};
}
}
var play = new Game();
let player =[];
for (i=0; i <numOfPlayers; i++ ){
player.push(new Player(i));
while (play.gameBoard[player[i].location.y][player[i].location.x]===0){
play.gameBoard[player[i].location.y][player[i].location.x] = player[i];
}
}
console.log(play);
最佳答案
您应该创建所有可能位置的列表,并为每个新玩家实例随机选择一个,而不是在创建时为每个玩家分配随机的x
/ y
。您有一个8x8的网格。所以有64个可能的位置
如果您是每个玩家:
选择一个随机的位置
删除该职位
您将永远不会重叠。
var positions = [];
for(var x=0;x<8;x++){
for(var y=0;y<8;y++){
positions.push({x,y});
}
}
// pick 5 random positions for demo
for(var i=0;i<5;i++){
var rnd = Math.floor(Math.random()*positions.length);
console.log("random position chosen:", positions[rnd]);
//remove this so its not picked again
positions.splice(rnd,1);
}
应用于您的代码如下所示:
var question = prompt('how many players');
var numOfPlayers = parseInt(question);
class Game {
constructor(){
this.health = 100;
this.hammer = false
this.knife = false;
this.sword = false;
this.baseballbat = false;
this.damage = 0;
this.gameBoard = [
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
];
}
}
class Player {
constructor(id, location){
this.id=id;
this.location = location;
}
}
var positions = [];
for(var x=0;x<8;x++){
for(var y=0;y<8;y++){
positions.push({x,y});
}
}
var play = new Game();
let player =[];
for (i=0; i <numOfPlayers; i++ ){
var rndPos = Math.floor(Math.random()*positions.length);
player.push(new Player(i, positions[rndPos]));
positions.splice(rndPos,1);
play.gameBoard[player[i].location.y][player[i].location.x] = player[i];
}
console.log(play);
如果可行,您甚至可以考虑将
availablePositions
数组设置为Game
的属性。