players = {
player1: {
currentpos: 0,
prevpos: 0,
startpos: 0,
balance: 1500
},
player2: {
currentpos: 0,
prevpos: 0,
startpos: 0,
balance: 1500
}
};
positions = {
position1: {
title: "Cairo",
type: "brown",
owner: "unowned",
purchaseprice: 60,
rentprice: 2,
forsale: "y"
},
position2: {
title: "Schiphol Airport",
type: "airport",
owner: "unowned",
purchaseprice: 200,
rentprice: 25,
forsale: "y"
},
position3: {
title: "Vienna",
type: "brown",
owner: "unowned",
purchaseprice: 60,
rentprice: 4,
forsale: "y"
},
position6: {
title: "Brussels",
type: "blue",
owner: "unowned",
purchaseprice: 100,
rentprice: 6,
forsale: "y"
}
};
我想知道玩家是否拥有一套。例如,2个棕色制作一套。制作一套需要3个蓝调。 玩家可以拥有超过1套。他可以拥有2个棕色和3个蓝色,因此蓝色套装和棕色套装。 拥有一个集确定玩家是否可以建立属性。在玩家购买位置时,我只需将“所有者”值从“无主”更新为“玩家名称”。 我应该添加哪些属性来帮助确定玩家是否拥有一组。
答案 0 :(得分:2)
如果你把你的位置作为数组而不是普通对象会更方便。我们将使用map()
在内部进行转换,因此可以使用filter()
和every()
等数组方法:
function doesOwnSet(player, type) {
// we'll use "chaining" here, so every next method will be called upon
// what previous method have returned
// `return` statement will return the result of the very last method
// first, lets take an array of `position` object keys
// which are "position1", "position2" and so on
return Object.keys(positions)
// then, create an array of positions object
// this will return Array
.map(function (key) {
return positions[key];
})
// then, pick up only positions with specified type (aka set)
// this will return Array
.filter(function (pos) {
return pos.type === type;
})
// finally, check if specified player owns every position of the set
// this will return Boolean
.every(function (pos) {
return pos.owner === player;
});
}
您可以在if
语句中使用此功能,如下所示:
if (doesOwnSet(players.player1, 'brown')) {
// give some reward to player1
}
答案 1 :(得分:0)
最有效的方法是存储对用户对象内部位置的引用,并具有单独的colour_group对象,如下所示:
color_groups = {
blue:{
positions:[
{..position1..},
{..position2..}
...
}
},
green:{
positions:[
{..position3..},
{..position4..}
...
]
},
....
}
如果你使用类似的东西从位置哈希构建color_groups,
color_groups = {};
for (var pos_name in positions) {
var pos = positions[pos_name];
if (!color_groups[pos.type]) color_groups[pos.type] = {positions:{}};
color_groups[pos.type].positions[pos_name] = pos; // Assignment works by reference, i.e. it does not copy 'pos'
}
然后位置哈希中的每个位置对象也将出现在color_groups哈希中。当您更改某个头寸的所有者时,其所有者也会在color_groups哈希中更改,因为它们都引用同一个对象。
您应该使用数组来存储一些数据而不是对象,因为可以更方便地迭代数组。您还应该考虑使用构造函数和原型创建类。
对用户对象执行类似操作会很有帮助,这样您就可以方便地获取每个用户拥有的属性列表。然后,您将知道玩家何时拥有color_group:
player1.positions[color_group_type].length == color_groups[color_group_type].length
在不改变数据结构的情况下,Pavlo的答案将正常运作。
答案 2 :(得分:0)
如果玩家购买了一个地方,则通过玩家调用方法购买。这些位置在Array中定义。第一个检查所有街道,无论玩家是否拥有它。如果是,则第二个用于检查是否拥有另一个地方,这不是第一个。如果两者的类型匹配,则玩家拥有一套。 这个脚本只检查两个地方,很容易检查更多。
function player_has_set (player){
var streets = new Array();
streets[0]="brown";
streets[1]="brown";
//...
for(var i=0;i<streets.length;i++){
if(player.has(i)){
var first_street_type=streets[i];
for(var j=0;j<streets.length;j++){
if(player.has(j)&&j!==i){
var second_street_type=streets[j];
if(first_street_type===second_street_type){
//SET
}
}
}
}
}
}