Tous les modèles pour la modélisation des jeux de société?
Pour le fun, je suis en train d'écrire un de mes fils préférés de jeux de société que d'un morceau de logiciel. Finalement, je m'attends à construire une INTERFACE utilisateur WPF sur le dessus de cela, mais pour l'instant je suis en train de construire la machine que les modèles de jeux et de ses règles.
Comme je le fais, je continue à voir des problèmes qui, je pense, communs à de nombreux jeux de société, et peut-être d'autres l'ont déjà résolu mieux que je le ferai.
(À noter que l'IA pour jouer le jeu, et les modèles autour de rendement élevé ne sont pas intéressant pour moi.)
Pour l'instant, mes modèles sont:
-
Plusieurs immuable types représentant des entités dans la boîte de jeu, par exemple, des dés, des pions, des cartes, un conseil, des espaces sur le conseil, l'argent, etc.
-
Un objet pour chaque joueur, qui contient les joueurs de ressources (argent, par exemple, le score), leur nom, etc.
-
Un objet qui représente l'état du jeu: les joueurs, qui est à son tour qu'il est, la disposition des pièces sur l'échiquier, etc.
-
Une machine d'état qui gère le tour de la séquence. Par exemple, de nombreux jeux ont un petit pré-jeu où chaque joueur lance à voir qui va tout d'abord; c'est le début de l'état. Lorsque le tour d'un joueur commence, d'abord qu'ils rouleau, puis ils bougent, ils ont à la danse en place, alors les autres joueurs de deviner quelle est la race de poulet qu'ils sont, alors qu'ils reçoivent des points.
Est-il un état de la technique, je peux profiter de la?
EDIT: Une chose que j'ai réalisé récemment est que le jeu de l'état peut être divisée en deux catégories:
-
Jeu artefact de l'état. "J'ai $10" ou "ma main gauche est sur le bleu".
-
Jeu de la séquence de l'état. "J'ai roulé doubles, deux fois; le lendemain on me met en prison". Une machine d'état peut faire sens ici.
EDIT: Ce que je suis vraiment à la recherche de ici est la meilleur façon de mettre en œuvre multijoueur jeux comme les Échecs ou le jeu de Scrabble ou de Monopole. Je suis sûr que je pourrais créer un tel jeu par juste de travailler à travers elle début à la fin, mais, comme les autres Modèles de Conception, il y a probablement des façons de rendre les choses vont beaucoup plus en douceur qui ne sont pas évidentes, sans une étude attentive. C'est ce que j'espère.
- Vous êtes en train de construire une sorte de Hokey Pokey, des monopoles, des charades mashup?
- Vous aurez envie d'une machine d'état pour toute règle qui s'appuie sur l'état (euh...), comme les trois doubles règle pour le Monopole. J'avais poster une meilleure réponse, mais je n'ai aucune expérience en faisant cela. Je pourrais pontificat à ce sujet.
Vous devez vous connecter pour publier un commentaire.
il semble que ce soit une de 2 mois vieux thread que j'ai juste remarqué que maintenant, mais ce que le diable. J'ai conçu et développé le gameplay cadre d'une activité commerciale, réseau de conseil de jeu avant. Nous avons eu une expérience très agréable de travailler avec elle.
Votre jeu peut probablement être dans une (à proximité) quantité infinie d'états en raison de la permutation des choses comme la façon dont beaucoup d'argent au joueur, combien d'argent le joueur B a, et etc... Donc, je suis sûr que vous voulez rester à l'écart de l'état des machines.
L'idée derrière notre cadre pour représenter l'état de la partie en tant que structure avec tous les champs de données qui, ensemble, fournissent le jeu complet de l'état (c'est à dire: si vous voulez enregistrer le jeu sur le disque, vous écrivez que la structure).
Nous avons utilisé le Modèle De Commande représenter l'ensemble de la validité des actions de jeu un joueur pouvait faire. Ici, serait un exemple d'action:
Donc, vous voyez que, pour décider si un déplacement est valide, vous pouvez la construire, et puis d'appeler sa IsLegal fonction, en passant dans le jeu actuel de l'état. Si elle est valide, et le joueur confirme l'action, vous pouvez appeler l'application de fonction pour réellement modifier l'état de la partie. En veillant à ce que votre jeu de code ne peut modifier le jeu de l'état par la création et le dépôt légal des Actions (donc, en d'autres termes, l'Action::Appliquez de la famille de méthodes est la seule chose à modifier directement l'état de la partie), puis de vous assurer que votre état de jeu ne sera jamais nulle. En outre, en utilisant le modèle de commande, vous faites, il est possible de sérialiser vos joueur mouvements souhaités et de les envoyer sur un réseau à être exécuté sur un autre joueur de jeu d'états.
Il a fini par être une chasse aux sorcières avec ce système qui s'est avéré avoir un assez élégant. Parfois, les actions de deux ou plusieurs phases. Par exemple, le joueur peut poser sur une propriété de Monopole et doit maintenant prendre une nouvelle décision. Quel est l'état de la partie entre le moment où le joueur de lancer les dés, et avant de se décider à acheter une propriété ou pas? Nous avons géré des situations de ce genre en mettant en scène un "Contexte d'Action" membre de notre état de jeu. Le contexte d'action devrait normalement être nulle, indiquant que le jeu n'est pas actuellement dans toute spéciale de l'état. Lorsque le joueur lance les dés et les jets de dés, l'action est appliquée à l'état de la partie, il se rendra compte que le joueur a atterri sur une des nations unies appartenant à la propriété, et peut créer un nouveau "PlayerDecideToPurchaseProperty" contexte d'action qui contient l'indice du lecteur que nous sommes en attente d'une décision. Au moment où le RollDice l'opération est terminée, notre jeu de l'etat déclare qu'il est actuellement en attente pour le joueur spécifié décider d'acheter une propriété n'est pas. Il est maintenant facile pour toutes les autres actions " IsLegal méthode de fausse déclaration, à l'exception du "BuyProperty" et "PassPropertyPurchaseOpportunity" actions, qui sont seulement juridique, lorsque l'état de la partie a de la "PlayerDecideToPurchaseProperty" contexte d'action.
Grâce à l'utilisation de contextes d'action, il n'y a jamais un seul point dans la durée de vie du jeu de plateau où le jeu de la structure de l'état n'est pas complètement représentent EXACTEMENT ce qui se passe dans le jeu à ce point dans le temps. C'est un très souhaitable de propriété de votre jeu de plateau de système. Il sera beaucoup plus facile pour vous d'écrire du code, quand vous pouvez trouver tout ce que vous voulez savoir sur ce qui se passe dans le jeu par l'examen d'une seule structure.
En outre, elle étend très bien pour les environnements réseau, où les clients peuvent soumettre leurs actions sur un réseau à une machine hôte, qui peut s'appliquer à l'action de l'hôte "officielle" de l'état de jeu, et puis l'écho de cette action à tous les autres clients d'avoir à l'appliquer à leur répliqué jeu d'états.
J'espère que ce n'était concise et utile.
ActionContext
est l'état actuel (il aurait été facile de créer unDefaultActionContext
plutôt que null, par exemple). Dans cet esprit, je ne recommanderais pas, y compris une sorte deIsLegal
type de fonctionnalités qu'il naturellement races d'une anémie sévère modèle où tout le comportement est séparé des données sur lesquelles il agit. Au lieu de cela, simplement en incluant unrollDice
méthode sur l'état actuel serait suffisant.La structure de base de votre moteur de jeu utilise le État Modèle. Les éléments de votre boîte de jeu sont les singletons de différentes classes. La structure de chaque état peut utiliser Modèle De Stratégie ou la Méthode de Modèle.
Un Usine est utilisé pour créer les joueurs qui sont insérés dans une liste de joueurs, un autre singleton. Le GUI à surveiller sur le Moteur de Jeu à l'aide de la Modèle observateur et d'interagir avec cela à l'aide de l'un de plusieurs commandes d'un objet créé à l'aide de la Modèle De Commande. L'utilisation de l'Observateur et de Commande peuvent être utilisés dans le cadre d'un Avis Passive Mais juste au sujet de tout le MVP/MVC modèle pourrait être utilisé selon vos préférences. Lorsque vous enregistrez le jeu, vous devez saisir un memento de son état actuel
Je recommander à la recherche de plus de quelques-uns des motifs sur cette site et voir si l'un d'eux s'accroche à vous comme un point de départ. À nouveau le cœur de votre plateau de jeu va être une machine à état. La plupart des jeux seront représentés par deux membres d'avant-match/l'installation et le jeu réel. Mais vous pouvez y avait plus les états-unis si le jeu vous êtes de la modélisation a plusieurs modes de jeu. Les états n'ont pas à être séquentielle par exemple le jeu Axis & Batailles a un conseil bataille les joueurs peuvent utiliser pour résoudre les combats. Il y a donc trois états d'avant-match, le conseil principal, conseil bataille avec le jeu en permanence de commutation entre la carte principale et de la bataille de conseil. Bien sûr le tour de la séquence peut également être représentée par une machine d'état.
Je viens de terminer la conception et la mise en œuvre d'un état de jeu basé sur l'utilisation du polymorphisme.
À l'aide d'une base de classe abstraite appelée
GamePhase
qui dispose d'une méthodeCe que cela signifie, c'est tous les
GamePhase
objet contient l'état actuel du jeu, et un appel àturn()
regarde son état actuel et retourne le prochainGamePhase
.Chaque béton
GamePhase
a des constructeurs qui détiennent le ensemble état de jeu. Chaqueturn()
méthode a un peu les règles du jeu à l'intérieur. Tout ceci permet de répartir les règles, il maintient le lien entre les règles de la proximité. Le résultat final de chaqueturn()
est juste de la création de la prochaineGamePhase
et en le passant dans l'état complet dans la prochaine phase.Cela permet
turn()
d'être très flexible. En fonction de votre jeu à un état donné peut s'étendre à beaucoup de différents types de phases. Cela forme un graphique de toutes les phases de jeu.Au plus haut niveau, le code pour le lecteur c'est très simple:
Cela est extrêmement utile car je peux maintenant créer facilement tout état/phase de jeu pour les tests
Maintenant pour répondre à la deuxième partie de votre question, comment cela fonctionne dans le mode multijoueur? Dans certains
GamePhase
s qui nécessitent la saisie de l'utilisateur, un appel deturn()
serait de demander à l'actuelPlayer
leurStrategy
compte tenu de l'état/de la phase.Strategy
est juste une interface de toutes les décisions possibles d'unPlayer
peut faire. Cette configuration permet égalementStrategy
à être mis en œuvre par l'IA!Aussi Andrew Haut a dit:
Je pense que cette déclaration est très trompeur, s'il est vrai qu'il y a beaucoup de jeu différents états, il y a seulement quelques phases de jeu. Pour gérer son exemple, il serait est un paramètre entier pour les constructeurs de mes béton
GamePhase
s.Monopole
Exemple de certains
GamePhase
s serait:Et de certains états dans la base
GamePhase
sont:Et puis certaines phases d'enregistrer leur propre etat, en tant que de besoin, par exemple PlayerRolls serait d'enregistrer le nombre de fois qu'un joueur a rouler consécutives doubles. Une fois que nous quittons la PlayerRolls phase, nous nous moquons de rouleaux consécutifs plus.
Beaucoup de phases peuvent être réutilisés et liés ensemble. Par exemple, le
GamePhase
CommunityChestAdvanceToGo
serait de créer la prochaine phasePlayerLandsOnGo
avec l'état actuel et de le retourner. Dans le constructeur dePlayerLandsOnGo
l'actuel joueur serait déplacé d'Aller et de leur argent serait incrémenté de $200.Bien sûr, il y a beaucoup, beaucoup, beaucoup, beaucoup, beaucoup, beaucoup, beaucoup, ressources sur ce sujet.
Mais je pense que vous êtes sur le droit chemin de la répartition des objets et de la laisser prendre ses propres événements/de données et ainsi de suite.
Lors de carrelage à base de jeux de société, vous trouverez qu'il est agréable d'avoir des routines à la carte entre le conseil de tableau et de la ligne/col et du dos, ainsi que d'autres fonctionnalités. Je me souviens de mon premier jeu de plateau (il y a très longtemps) quand je struggeled avec comment obtenir ligne/col de boardarray 5.
De la nostalgie. 😉
De toute façon, http://www.gamedev.net/ est un bon endroit pour obtenir des informations.
http://www.gamedev.net/reference/
Une grande partie des matériaux que je peux trouver en ligne sont des listes de références bibliographiques. La section des publications de Jeu De Modèles De Conception a des liens vers des versions PDF des articles et des thèses. Beaucoup ressemblent à des études universitaires comme Les Modèles de conception pour les Jeux. Il y a aussi au moins un livre disponible sur Amazon, Les modèles dans la Conception de Jeu.
Trois Anneaux offre LGPL avais bibliothèques Java. Nenya et Vilya sont les bibliothèques pour le jeu les choses liées.
Bien sûr, il serait utile si votre question mentionnée plate-forme et/ou de restriction de langue que vous pourriez avoir.
Je suis d'accord avec Pyrolistical réponse et je préfère sa façon de faire les choses (j'ai juste écrémé autres réponses si).
Par coïncidence, j'ai aussi utilisé son "GamePhase" de nommage. Fondamentalement, ce que je ferais dans le cas d'un tour par tour jeu de plateau est votre GameState classe contient un objet de l'abstrait GamePhase comme mentionné par Pyrolistical.
Permet de dire que le jeu d'états sont les suivants:
Vous pourriez avoir en béton les classes dérivées pour chaque état. Ont des fonctions virtuelles au moins pour:
Dans le StartPhase() fonction vous pouvez définir toutes les valeurs initiales d'un état par exemple la désactivation de l'autre joueur de l'entrée et ainsi de suite.
Lorsque roll.EndPhase() est appelée alors assurez-vous que le GamePhase pointeur est défini pour l'état suivant.
Dans ce MovePhase::StartPhase (), vous auriez, par exemple, définir le du joueur actif mouvements restants pour le montant transféré dans la phase précédente.
Maintenant avec ce modèle en place, vous pouvez trier vos "3 double x = prison" problème à l'intérieur de la phase de Roulis. Le RollPhase classe peut gérer son propre état. Par exemple
Je diffèrent de Pyrolistical dans lequel il devrait y avoir une phase de tout, y compris lorsque le joueur arrive sur la Communauté de la poitrine ou de quelque chose. Je serait en mesure de gérer tout cela dans le MovePhase. C'est parce que si vous avez trop d'étapes, le joueur sera très probablement se sentir trop "guidé". Par exemple, si il y a une phase où le joueur ne peut acheter des propriétés et alors SEULEMENT acheter les hôtels et alors SEULEMENT acheter des maisons, l'un de ses semblables il n'y a pas de liberté. Il suffit de claquer toutes ces pièces dans un BuyPhase et de donner au joueur la liberté d'acheter tout ce qu'il veut. Le BuyPhase classe peut assez facilement gérer ses achats juridique.
Enfin, nous allons aborder le terrain de jeu. Si un tableau 2D est très bien, que je vous recommande d'avoir une tuile graphique (où une tuile est une position sur la carte). Dans le cas de monoppoly il serait plutôt une liste à double liaison. Ensuite, chaque tuile aurait un :
De sorte qu'il serait beaucoup plus facile de faire quelque chose comme:
La AdvanceTo fonction permet de gérer votre étape par étape, des animations ou ce que vous voulez. Et aussi décrémenter mouvements restants de cours.
RS Conley Conseils sur le Pattern observer pour l'interface graphique est bonne.
Je n'ai pas posté beaucoup de temps avant. Espérons que cela aide quelqu'un.
Si votre question n'est pas de la langue ou de la plate-forme spécifique. alors je recommande que vous considérez AOP Modèles pour l'État, Memento, Commande, etc.
Quoi de la .Réponse NETTE à l'AOP???
Aussi essayer de trouver des sites web cool comme http://www.chessbin.com