我正在开发一款基于垄断的游戏,包括属性,金钱,卡片等。我最近在处理游戏的机会卡方面遇到了问题...
我有一系列字符串可以说出“退税;收取25美元”或“你因股票而损失的金额; - 100美元”。每张卡都有不同之处,并非所有卡都只是处理钱。我的问题:如何将这些卡存储到每个卡中,并保存带有描述的字符串,以及所涉及的任何操作。例如,card1有一个String和一个int值(-25),但另一方面另一个卡,card2有一个String,一个int值(+10)和一个属性。对不起,如果问题真的很模糊,但我不知道如何描述它。
只是为了澄清:
卡片可以简单地包含描述和金钱价值。而另一张卡可能包含描述,金钱价值并移动某些空格。
感谢大家如此迅速地发表了很棒的想法!
答案 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()
方法。
希望这有帮助。