Java Monopoly-Jeu ish


Je travaille sur un jeu basé sur le monopole avec des propriétés, de l'argent, des cartes, etc. J'ai récemment rencontré un problème en travaillant sur l'aspect carte de hasard du jeu...

J'ai un tableau de chaînes qui disent des choses, par exemple,"Remboursement d'impôt; collecter 25 $" ou "Vous perdez de l'argent en raison des stocks;- 100$". Chaque carte fait quelque chose de différent, tous ne traitent pas simplement de l'argent. Ma question: comment puis-je stocker ces cartes pour contenir chacune une chaîne avec sa description mais aussi toute action impliquée. Pour exemple, card1 a une chaîne et une valeur int (-25), mais d'autre part une autre carte, card2 a une chaîne, une valeur int(+10) et une propriété. Désolé si la question est vraiment vague, mais je ne sais pas comment le décrire.

Juste pour clarifier:

Une carte pourrait contenir simplement la description et une valeur monétaire. Alors qu'une autre carte peut contenir une description, une valeur monétaire et déplacer certains espaces.

Merci à tous ceux qui ont donné des idées géniales si rapidement!

Author: mbreen, 2012-01-31

6 answers

Si votre gamme d'actions est très limitée (disons, 2 ou 3 actions impliquant de l'argent, déplacer des carrés, etc.), je pourrais utiliser la classe suivante:

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

De cette façon (comme déjà indiqué par d'autres réponses), vous pouvez utiliser un tableau de Cards au lieu d'un tableau de String s. Vous pouvez alors avoir du texte dans un champ, l'action dans un champ séparé et la valeur associée à cette action dans un troisième champ. Par exemple, vous pouvez avoir les cartes suivantes:

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

Quand vous êtes 'traitement' les cartes, vous pouvez le faire de la manière suivante:

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

MODIFIER:
Si les cartes peuvent contenir plusieurs actions, vous pouvez utiliser un HashMap pour stocker les actions de cette carte:

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

A HashMap est une collection qui peut stocker des paires clé-valeur. Donc, pour une carte qui a 2 actions, vous pouvez utiliser le code ci-dessous:

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

Maintenant, lorsque vous traitez réellement les cartes, vous devez vérifier le HashMap pour toutes les actions stockées dans cette carte. Un moyen pour parcourir le à travers le HashMap est de faire ce qui suit:

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...
    }
}
 5
Author: Dawood, 2012-01-31 04:13:35

Créez une classe pour la carte, utilisez le modèle de conception Command Pattern afin que chaque carte puisse avoir un type d'action différent si nécessaire. Il contiendra donc un champ de chaîne, du texte, un champ int, une valeur et un autre champ pour une interface qui représente votre action.

Le champ clé sera le champ "action" qui contient une référence à un type d'interface, par exemple appelé CardAction:

interface CardAction {
   execute();
}

Ou vous pouvez utiliser un Exécutable ou un Futur si vous souhaitez utiliser un prêt à l'interface. De cette façon, vous pouvez injecter des objets de cette classe avec différentes actions pour différents types de cartes. Cela vous évitera d'avoir à créer plusieurs classes de cartes différentes.

 4
Author: Hovercraft Full Of Eels, 2012-01-31 03:34:15

C'est une solution qui permet à chaque carte d'avoir plusieurs actions.

Le ActionType est une interface, car il n'a que plusieurs valeurs correctes.

Tous les champs sont rendus définitifs car une fois que les cartes ont été créées, elles ne devraient pas être autorisées à changer.

La méthode getActions() renvoie une copie du tableau car nous ne voulons pas que le jeu puisse modifier les actions de la carte après sa création.

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);
    }
}
 1
Author: nbarraille, 2012-01-31 05:19:57

Faire une classe de carte, il doit contenir la description (Chaîne) et une valeur (int) (+10,-25, 0 ect...). Vous auriez alors un tableau de cartes au lieu d'un tableau de chaînes.

 0
Author: Robert Peters, 2012-01-31 03:30:13

Avoir une classe de carte avec description et valeur.

Card
{
String description;
int value;

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

    getters..
    setters...
    }

Créer des objets comme

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

Notez que ces cartes avec une valeur int peuvent accepter des valeurs comprises entre -2 147 483 648 et 2 147 483 647. Si vous voulez des valeurs plus élevées, vous pouvez changer int en long ou autre chose.

 0
Author: kosa, 2012-01-31 03:30:56

Faire Card classe, avec une chaîne de caractères appelée text ou quelque chose, et une méthode appelée onAction() ou quelque chose. Ensuite, faites beaucoup d'autres classes - une pour chaque carte - étendant la classe Card. Donner à la chaîne le texte que vous voulez et dans la méthode, vous pouvez alors mettre exactement ce que vous voulez arriver. Vous pouvez créer une classe appelée Deckcontenant des instances de tous ces Card s et un tableau/liste, et une méthode draw() ou tout ce que vous avez déjà fait. En dessinant un Card à partir du Deck, faites-le imprimer ce texte de Card et appelle sa méthode onAction().

J'espère que cela aide.

 0
Author: SamBrev, 2013-04-20 18:42:14