Java Monopoly-ish Game

时间:2012-01-31 03:25:51

标签: java arrays swing

我正在开发一款基于垄断的游戏,包括属性,金钱,卡片等。我最近在处理游戏的机会卡方面遇到了问题...

我有一系列字符串可以说出“退税;收取25美元”或“你因股票而损失的金额; - 100美元”。每张卡都有不同之处,并非所有卡都只是处理钱。我的问题:如何将这些卡存储到每个卡中,并保存带有描述的字符串,以及所涉及的任何操作。例如,card1有一个String和一个int值(-25),但另一方面另一个卡,card2有一个String,一个int值(+10)和一个属性。对不起,如果问题真的很模糊,但我不知道如何描述它。

只是为了澄清:

卡片可以简单地包含描述和金钱价值。而另一张卡可能包含描述,金钱价值并移动某些空格。

感谢大家如此迅速地发表了很棒的想法!

6 个答案:

答案 0 :(得分:5)

如果您的行动范围非常有限(例如,涉及金钱,移动方格等的2或3个行动),那么我可能会使用以下课程:

class Card {
    // It would be a good practice to not make the following fields
    // public and use getters/setters instead but I've made them this
    // way just for illustration purposes

    public String text;
    public String action;
    public int value;

    Card(String text, String action, int value) {
        this.text = text;
        this.action = action;
        this.value = value;
    }
}

这种方式(正如其他一些答案已经指出的那样),您可以使用Card的数组而不是String的数组。然后,您可以在一个字段中包含文本,在单独的字段中包含操作,在第三个字段中包含与该操作相关联的值。例如,您可以使用以下卡片:

Card lose25 = new Card("You lose $25", "money", -25);
Card move5squares = new Card("Move 5 squares ahead!", "move", 5);

当您正在处理'卡片,您可以通过以下方式进行:

...
if (card.action.equals("money") {
    // Update user's money with card.value
} else if (card.action.equals("move") {
    // Update user's position with card.value
} else if (card.action.equals("...") {
    // and so on...
}
...

修改
如果卡片可以容纳多个动作,您可以使用HashMap存储该卡片的动作:

class Card {

    public String text;
    public HashMap<String, Integer> actions;

    Card(String text) {
        this.text = text;
        actions = new HashMap<String, Integer>();
    }

    addAction(String action, int value) {
        actions.put(action, value);
    }
}

HashMap是一个可以存储键值对的集合。因此,对于具有2个操作的卡,您可以将以上代码用作:

Card aCard = new Card("Lose $25 and move back 3 spaces!");
aCard.addAction("money", -25);
aCard.addAction("move", -3);

现在,当您实际处理这些卡时,您需要检查HashMap以查看存储在此卡中的所有操作。迭代HashMap的一种方法是执行以下操作:

Card processCard = ...;

for (Map.Entry<String, Integer> entry : processCard.actions.entrySet()) {
    // This loop will get each 'action' and 'value' that you added to
    // the HashSet for this card and process it.

    String action = entry.getKey();
    int value = entry.getValue();

    // Add the earlier 'card processing' code here...

    if (action.equals("money") {
        // Update user's money with value
    } else if (action.equals("move") {
        // Update user's position with value
    } else if (action.equals("...") {
        // and so on...
    }
}

答案 1 :(得分:4)

为Card创建一个类,使用Command Pattern设计模式,以便每个卡可以根据需要使用不同类型的操作。因此它将包含String字段,文本,int字段,值以及用于表示您的操作的接口的另一个字段。

关键字段将是“action”字段,其中包含对接口类型的引用,例如称为CardAction:

interface CardAction {
   execute();
}

如果您想使用现成的界面,也可以使用Runnable或Future。这样,您可以为不同类型的卡片注入具有不同操作的此类对象。这将阻止您创建多个不同的卡类。

答案 2 :(得分:1)

这是一个允许每张卡都有多个动作的解决方案。

ActionType是一个接口,因为它只有几个正确的值。

所有字段都是最终的,因为一旦创建了卡片,就不应该让它们改变。

getActions()方法返回数组的副本,因为我们不希望游戏在创建后能够修改卡的操作。

enum ActionType {
    MONEY, MOVE, ...
}

class Action {
    private final String description;
    private final ActionType type;
    private final int value;

    public Action(String desc, ActionType type, int value) {
        this.description = desc;
        this.type = type;
        this.value = value;
    }

    public String getDescription() {
        return description;
    }

    public ActionType getType() {
        return type;
    }

    public int getValue() {
        return value;
    }

}

class Card {
    private final Action[] actions; // If you want to be able to modify the list of actions after creation, use a non-final List<>, otherwise an array

    public Card(Action... actions) {
        this.actions = actions;
    }

    public Action[] getActions() {
        Action[] copy = new Action[actions.length];
        System.arraycopy(actions, 0, copy, 0, actions.length);
    }
}

答案 3 :(得分:0)

制作卡类,它应包含描述(String)和值(int)(+ 10,-25,0等...)。然后你会有一组卡而不是字符串数组。

答案 4 :(得分:0)

拥有包含描述和值的Card类。

Card
{
String description;
int value;

    Card(String desc, int value)
    {
    this.description = desc;
    this.value = value;
    }

    getters..
    setters...
    }

创建

等对象
Card c = new Card("You may loose 25$...", -25);

请注意,这些带有int值的卡可以接受介于-2,147,483,648到2,147,483,647之间的值。如果您想要更高的值,可以将int更改为long或其他内容。

答案 5 :(得分:0)

创建一个Card类,其中包含一个名为text或其他内容的字符串,以及一个名为onAction()的方法。然后,制作许多其他类 - 每张卡一个 - 扩展Card类。为字符串提供所需的文本,然后在方法中可以准确地输入您想要的文本。您可以创建一个名为Deck的类,其中包含所有这些Card的实例和一个数组/列表,以及draw()方法或您已经完成的任何操作。在从Card中提取Deck时,请打印Card的{​​{1}}文字并调用其onAction()方法。

希望这有帮助。