垄断检查玩家是否拥有一套

时间:2013-12-30 22:17:07

标签: javascript

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个蓝色,因此蓝色套装和棕色套装。     拥有一个集确定玩家是否可以建立属性。在玩家购买位置时,我只需将“所有者”值从“无主”更新为“玩家名称”。     我应该添加哪些属性来帮助确定玩家是否拥有一组。

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
                    }
                }
            }
        }
    }
}