トレーディングカードゲームの「特殊効果カード」を実装する方法


16

ここで一種のトレーディングカードゲームを作成しようとしていますが、何らかの方法で、マジックザギャザリング、または遊戯王に似ています!トランプゲーム。

基本的に、ゲームに慣れていない人のために、ゲームのルールを曲げることができる特別な効果を持つ特別な種類のカード(スペルカード/トラップカード/など)があります。私がまったく知らないのは、これらのカードのロジックを実装する方法です。私はカードのデータをフラグを付けて保存するという考えを持っていますが、それはどんな種類の能力があるのか​​を示すことができますが、それができることは非常に限られています(おそらくいくつかの単純な統計変更のみ)。

これらのカードにどんな種類の効果があるのか​​を知るために、ここに遊戯王に存在する呪文カードの効果のいくつかの例があります!トランプゲーム:

  • 破壊されたクリーチャーを復活させる
  • 相手のクリーチャーをコントロールする
  • いくつかの条件に基づいてクリーチャーのステータスを変更します(例:破壊された特定の名前のクリーチャーの数)
  • いくつかの条件が満たされた場合、特定のクリーチャーを特別に召喚します。
  • 複数のクリーチャーを融合して、より強いクリーチャーにします。
  • 一部の特殊カードの効果に対する耐性。

コナミは、このゲームのいくつかのビデオゲームを作成し、AIと数千種類のカードを完備しています。データベース全体をハードコーディングすることは実際には不可能だと思いますか?

今、もちろん私がやろうとしているのは、それらのゲームほど複雑ではありませんが、私は好奇心が強いです、どうやってそれらを実装するのですか?

回答:


17

この性質のオープンソースプロジェクトがいくつかあり、ルールを実装するためのさまざまなアプローチがあります。これは、有名なMtG実装の1つであるCardForgeの作成者によるブログエントリです。完全なリストではないかもしれませんが、コードを参照したり、フォーラムにアクセスして特定の質問をしたりできる、いくつかのオープンソースプロジェクトが含まれています。

実際の答えとして:堅牢なフレームワークの最善の策は、オブジェクト指向プログラミングを厳密に採用することです。すべてのアクション、すべてのトリガー、すべての能力はオブジェクトです。手、ライブラリなどのゾーンもオブジェクトであることは言うまでもありません。ルールエンジンでは、ゲームオブジェクトを記述するために文字列や整数などのダムオブジェクトを渡さないでください。ただし、オブジェクトのみです。

すべてのアクションは多数のトリガーをスタックに配置します。他のすべての機能は、その特定のトリガーを気にするかどうかを確認できます。そうする場合は、独自のアクションを起動し、新しいトリガーを作成するなどします。

次に、スタックが空になるまで、ゲームのルールに従ってそれらのスタックを処理します。スタックが空になると、新しいアクションを実行できます。

理想的には、ゲームのルールを完全に実装する場合、ルールコードにはハードコードされた単一のカードは含まれません。ハードコーディングカードは便利なショートカットを作成できますが、長期的にはコードが膨張し、新しい方法でそれらのカードとやり取りする新しいカードがリリースされた場合など、潜在的な落とし穴を作成します。MtGのような12,000枚以上のユニークなカードがあり、終わりが見えないゲームでは、そのようなやり取りが多数あります。


1
いい答えです。関数型プログラミングの世界からやってくると、私はそれぞれのカードがゲーム環境を閉鎖し、さらにばかげて汎用的になるようにします。たとえば、カードは、エリアのリストにカードのリストを追加することにより、新しい「エリア」を許容可能に作成できます。具体的に:ゾンビモンスターメイヘム: 敗北したクリーチャーはすべて、特別な能力を持たない新しい「共同墓地」で復活し、サイコロのロールに基づいてプレイヤーをランダムに攻撃します。
ブライス

追加リンク:github.com/Fluorohydride/ygopro-core有名なオープンソースYGO実装のため、YGOはまた、問題に言及されて以来。
SK19

2

これらすべてをスイッチと変数のみに組み込むことは、非常に無駄な作業です。関数をハードコードするか、実行中に解釈するスクリプトを用意する必要があります。ボードやデッキ、墓地のステータスを確認するために必要な機能をスクリプトに公開し、アクションなどを実行するための機能を公開します。スクリプトは、カードに関連付けられた他の変数とともに保存する単なる文字列です。


または、ハックワースが示唆したように、必要な動作を得るために結合されたある種の共通ブロックを持っています。彼が提案したものに加えて、いくつかの論理ブロックも必要になると思います。動作のブロックを共有すると、何らかの共有品質を持つカードを簡単にフィルタリングできます。
トニ

1

また、mysql dbでWeb言語を使用したカードゲームを計画しています。私は現在、非常に汎用的なセットアップを行っているので、新しいユニークなカードに非常に柔軟に対応できます。例えば:

reduceHitPoints() { } 
reduceMana() { }
reduceSpeed() { }

簡単にできます:

reduce($attacker, $target, $reduceWhat, $amount) { }
massReduce($attacker, Array $targets, $reduceWhat, $amount) { }

すべてのアクションにこの概念を適用すると、クラスが簡素化され、カードテーブルに1行追加するだけで新しいカードを作成できます。

すべてのオプションと能力は、その単一行のdbで定義されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.