6

自分のバージョンのScrabbleを実装しているとしましょう。私は現在、Boardたくさんのを含むクラスを持っていますSquares。次に、aはaとaSquareで構成されます。ボーナスの実装は、実際にはScrabbleの通常のボーナスですが、ゲームにスパイスを加えるために、新しいツイストボーナスを追加しようとする可能性があります。ここでの柔軟性が最も重要です。IBonusPiece

代替テキスト

しばらく考えた後、IBonus実装が機能するためには、全体Boardとその現在の位置を知る必要があるという結論に達しました(で、Boardそれがどこにあるかを知っているので、同じ部分にある部分をチェックできますボーナスとして正方形)。これは、基本的に多くの情報を知る必要があるのと同じくらいひどいことになります。

Boardしたがって、私の素朴な実装は、 as引数をIBonus.calculate()メソッドに渡すIBonus.calculate(Board board, Point position)ことです。

また、循環参照を作成しているようです。それとも私は間違っていますか? 代替テキスト

私はこのアプローチが特に好きではないので、他の可能なアプローチを探しています。calculate具体的なクラスの代わりにインターフェイスを受け入れることができることはわかっていますcalculate(IBoard board)が、IMOは最初のケースよりも優れているわけではありません。

私は、現在の実装に集中しすぎて、少なくともこの問題の解決策に適合する可能性のあるまったく異なる設計を考えることができないのではないかと心配しています。たぶん、ゲーム全体を再構築して、他の場所にボーナスを置くことができるので、この計算が容易になりますか?多分私はそれらをBoard?私は確かにそこにこの問題への他のアプローチがあることを願っています!

ありがとう

4

4 に答える 4

4

ボードにはゲームの可視状態があり、ラック(プレーヤーごとに1つ)やDrawPileなどの他のオブジェクトがあると思います。

「単語に実際の(空白ではない)Zが含まれている場合は、ダブルスコア」-単語、またはボードと単語の位置を渡す必要があります。

「単語がボード上で最も長い場合はダブルスコア」には、ボード全体が必要です。

「単語の最初の文字がDrawPileからランダムに選択された文字と一致する場合は、ダブルスコア」にはもちろんDrawPileが必要です。

だから私にとって、それはあなたが実装するルールに依存します。BoardをIBonusscore()実装に渡すことに慣れています。

編集-より多くの考え。

つまり、ボードには17x17の正方形などがあります。ボードの各正方形にIBonus実装を割り当てます(不活性なPlainEmptySquareと呼ばれる実装があります)。IBonusの各実装をインスタンス化する必要があるのは1回だけで、何度も参照できます。私はおそらく低い道を進み、必要な引数を渡して、それぞれを明示的にインスタンス化します。あるタイプでボードが必要な場合は、それを渡します。別のタイプでDrawPileが必要な場合は、それを渡します。実装では、おそらく12行の醜さがあります。/肩をすくめる

于 2010-10-25T22:24:43.137 に答える
1

次のようなものが機能する可能性があります。

CurrentGameBoardのコレクションを持つ、がありますSquares。ASquareはIBonusを持つことができますが、にCalculate()メソッドはありませんSquare。ASquareには、がPieceあり、aにPieceSquare(つまり、正方形が空の場合と空でない場合があり、ピースがボードに配置されている場合と配置されていない場合があります)。

Boardまた、そのターンにボードに配置されたばかりのピースを表すcalculateScoreForTurn()コレクションを受け入れるメソッドもあります。配置されたばかりのピースと正方形、および周囲または交差するピースと正方形(該当する場合)に関するすべての情報を知っているため、スコアの計算に必要なすべての情報があります。PiecesBoard

于 2010-10-25T22:28:22.880 に答える
1

これは基本的に多くの情報を知る必要があるのと同じくらいひどいことになります

必要だと思います。ボードへの参照を渡すだけで、実際には大量のデータが移動することはありません。

于 2010-10-25T22:31:18.023 に答える
1

ボード自体は、おそらく特定のラウンドの得点を推進する必要があります。各タイルが配置されると、ボードはそれを記録します。最後のタイル(1ターン)が配置されたとき、ボードは新しく追加されたタイルを持つすべての正方形(これらの正方形のボーナスが計算されます)と、現在のターンが「再利用」。

たとえば、CATを再生します

Cはダブルレタースコアに該当します。したがって、ターンのスコアはC.Value * 2 + A.Value+T.Valueです。

Next player places an S to make CATS. S falls on Triple Word Score. So, the score for the turn is (C.Value + A.Value + T.Value + S.Value)*3. When a Tile's Bonus has been applied, it must be "Deactivated" so that future "reuses" of that Tile do not also get the Bonus.

The implication is that some Bonuses apply the Tile placed in the Square while others apply to the collection of Tiles that make up the new Word AFTER the Bonuses for the individual letters have been calculated.

ターン中にタイルで埋められた1つまたは複数のマス目がある場合、ボードは、ボードの端まで(または空のマス目まで)左に移動することによって作成された単語の始まりを見つけることができます。同じ状態になるまでトラバースします。理事会は、同様に右と下をトラバースすることによって作成された単語の終わりを見つけることができます。また、新しく配置されたタイルが既存のタイルに隣接するたびに、単語の開始と終了をトラバースする必要があります(ターン中に多くの単語を作成できます)。

単語のコレクション(それぞれが可能なLetterBonusを含む正方形と値を持つタイルで構成される)が与えられると、ボード(または各単語自体)はBaseValue(タイルの値の合計-任意のLetterBonusesを適用)を計算してからWordBonusを適用します(もしあれば)みことばの究極の価値を得るために。

于 2010-10-25T22:54:29.243 に答える