プレイヤーがキャラクターを調整するいくつかの可能性を持っているビデオゲームのデザインが与えられています:
ゲームデザイナーは、火の元素と水の元素が同時に存在することは無意味であることを理解しました。現在のデザインでそのようなキャラクターを作成することは可能ですか?はいの場合、現在のデザインパターンを削除/破棄せずにそれを回避することはできますか?それともそれはまったく機能しませんか?
火の要素と水要素の文字を、パターンを削除せずに同時に作成することは可能だと思います。正しく表示されれば、ここにはデザインパターンの「複合」しかないためです。
しかし、上記の単語senselessは私を混乱させるので、どのように変更するべきかわかりませんが、それは火の元素である必要はなく、彼らは両方とも攻撃のリソースとしてマナを浪費しているので同時に水エレメンタル?それとも、それは非論理的であり、したがって、火と水の元素になることを同時に防止する必要があるということですか?これは私をとても混乱させるので、あなたはそれをよりよく知っているかもしれませんか? :/
あなたの内部プログラム構造はあなたのゲームルールを反映するべきではありません。彼らはあなたのプログラムがどのように機能するかを反映するべきです。
ゲームルールは他の場所、おそらくデータファイルにエンコードする必要があります。
どうして?ゲームルールがプログラミングロジックに準拠しないためです。最初はシンプルに見えますが、複雑になるほど、ゲームロジックとプログラムロジックをバインドしたことに満足できなくなります。
例:Character
クラスがあります。 Wizard
とWarrior
はそれから派生しています。キャラクターはIWeapon
を振るうことができます。しかし、戦士はどんな武器でも使うことができ、魔法使いはDagger
sだけです。おっと、 Liskov置換の原則 に違反していて、あなたは非常に複雑なゲームのルール#2にしかいません。
このトピックについての必読: ウィザードとウォリアーズ (5つの部分すべて)。
この図は、UMLを想定しており、集約と一般化/特殊化の両方を示しています。
一般化/特殊化では、sourcerer、fire-elemental、water-elemental、およびberserkerはそれぞれ、より一般的な性格概念の特殊化であると述べています。これは「is-a」関係です。他の人にとっても、sourcerer is-a文字などです。
また、どのような種類のキャラクターも、ソースラーキャラクター、ファイアエレメンタルキャラクター、ウォーターエレメンタルキャラクター、バーサーカーキャラクターのそれぞれと集合することを示しています。
キャラクターのグループ、チーム、一緒に作業している場合、または敵のグループが存在する場合とほぼ同じです。
これは、特定のゲームが意図するものとまったく同じです。しかし、他に何も知らずに疑わしい。集計は非常に具体的です。単に文字と文字を集計するだけで、チームの作成が可能になります。 (言うまでもなく、チームまたは対戦相手のセットは、他の方法でもいくつでも作成できます。)
現在のデザインでこのようなキャラクター(火の元素と水の元素)を作成することは可能ですか?
プログラミング言語に複数の継承があり、クラスがfinalでない場合、プログラマーは火の元素の文字と水の元素の文字の両方に特化したクラスを追加できます。この新しいクラスでは、単一のインスタンスを火の元素の両方にすることができますキャラクターと水の元素のキャラクター。
火の元素の文字と水の元素の文字を相互に組み合わせることができるかどうかを尋ねている場合、はい、これはダイアグラムで許可されています。
ファイアエレメンタルとウォーターエレメンタルは、どういうわけか集約することが許可されているキャラクターの属性、プロパティ、または品質であると考えている場合、それらはそうではありません。それぞれがそれ自体が独自の(種類の)キャラクターです。
ベルセルク、ソーサラー、ファイアエレメンタル、ウォーターエレメンタルは具体的すぎる。
実際、Mage
、MagicEntity
、およびWarrior
は再利用がはるかに簡単です。また、あなたは戦士であり、魔術師であり、エレメンタルである可能性があるので、このパターンを使用することには多くの意味が追加されます(そして、少し圧倒されます!)。それが、ファイアエレメンタルであり、ウォーターエレメンタルであることが無意味である理由です。結局のところ、キャラクターは単なるエレメンタルであり、もはやパワーを得られないからです。
また、攻撃は何かを行うアクションのように見えますが、それは単に現在のオブジェクトの状態を変化させているだけで、騙されています。攻撃するためにパラメータCharacter
を受け入れるべきではありませんか?現在のように、これはgetAttackPoints
メソッドにかなり似ています。