Frage

Lassen Sie uns sagen, ich bin Umsetzung meine eigene Version von Scrabble. Im Moment habe ich eine Board Klasse, die viele Squares enthält. A Square wiederum besteht aus einem IBonus und einem Piece zusammengesetzt. Die Bonus-Implementierungen tatsächlich die üblichen Bonus sind für Scrabble, aber es ist möglich, dass ich versuchen könnte einige neue und verdrehte Bonus hinzuzufügen, um das Spiel zu würzen - Flexibilität ist hier von größter Bedeutung

alt text

Nach einem denken, während ich zu dem Schluss gekommen, dass für IBonus Implementierungen zu arbeiten, werden sie die ganze Board und auch seine aktuelle Position wissen müssen (auf dem Board, so dass er weiß, wo es ist, und es kann prüfen das Stück, das in dem gleichen Platz ist wie der Bonus). Das erscheint mir so schlecht, wie im Grunde braucht es eine ganze Menge von Informationen zu kennen.

Also, meine naive Implementierung wäre die Board als Argument IBonus.calculate() Methode zu übergeben, IBonus.calculate(Board board, Point position), das ist.

Auch scheint es, einen zirkulären Verweis zu erstellen. Oder liege ich falsch? alt text

mag ich diesen Ansatz nicht besonders, so dass ich für andere mögliche Ansätze suchen. Ich weiß, ich kann calculate akzeptiert eine Schnittstelle statt eine konkrete Klasse machen, das heißt, calculate(IBoard board) aber ich IMO, dass nicht alles, was besser ist als der erste Fall ist.

Ich fürchte, auch wird auf meiner aktuellen Implementierung fokussiert der Lage sein, zu denken, ganz andere Designs, die zumindest als auch Lösungen für dieses Problem könnte passen. Vielleicht könnte ich das ganze Spiel wieder Architekten und habe die Boni in anderem Ort, so dass es diese Berechnung erleichtern würde? Vielleicht konzentrierte ich auch auf sie auf dem Board zu haben? Ich hoffe, es gibt auch andere Ansätze für dieses Problem gibt!

Danke

War es hilfreich?

Lösung

Ich gehe davon aus Vorstand den sichtbaren Zustand des Spiels hat, und es gäbe andere Objekte, wie beispielsweise Rack (einen pro Spieler,) und ein DrawPile.

„Double Score, wenn Wort eine echte (nicht leer) Z enthält.“ - erfordern würde man im Wort übergeben, oder den Vorstand und die Position des Wortes

„Double Score, wenn das Wort am längsten auf dem Brett ist“ erfordert den gesamten Vorstand.

„Double Score, wenn der erste Buchstabe des Wortes entspricht einen zufällig ausgewählten Buchstaben aus dem DrawPile“ erfordert die DrawPile natürlich.

Also für mich ist es nur darauf an, die Regeln, die Sie implementieren. Es würde mich wohler mit () -Implementierung Board der IBonus Punktzahl vorbei.

Bearbeiten -. Mehr Gedanken

So ein Brett 17x17 Quadrate hat, oder was auch immer. Ich würde eine IBonus Implementierung zu jedem Quadrat des Brettes zuweisen (es wäre eine Implementierung seines PlainEmptySquare genannt, die war inert.) Sie würden nur brauchen, um jede Implementierung von IBonus zu instanziiert einmal - es viele Male verwiesen werden kann. Ich würde wahrscheinlich die niedrige Straße nehmen und instanziiert jeden explizit in den benötigten Argumenten. Wenn ein Typ den Vorstand braucht, übergeben Sie es in. Wenn ein anderer die DrawPile muss, übergeben Sie es in. In der Implementierung, dann würden Sie vielleicht 12 Zeilen Hässlichkeit haben. / Achselzucken

Andere Tipps

So etwas wie die folgenden funktionieren könnte:

CurrentGame hat eine Board, die eine Sammlung von Squares hat. Ein Square könnte eine IBonus haben, jedoch gibt es keine Calculate() Methode auf einem Square. A kann eine Square Piece haben, und eine Piece eine Square haben kann (dh ein Quadrat kann oder kann nicht leer sein, und ein Stück haben kann oder kann nicht auf der Leiterplatte platziert).

Board hat auch eine calculateScoreForTurn() Methode, die eine Sammlung von Pieces akzeptieren würde die Stücke darstellt, die nur für diesen Zug auf dem Brett platziert wurden. Board kennt alle Informationen über die Stücke und Plätze, die gerade gestellt haben, sowie die umgebenden oder schneidenden Stücke und Quadrate (falls zutreffend) und haben damit alle Informationen benötigt, um die Punktzahl zu berechnen.

  

Das erscheint mir so schlecht, wie es im Grunde   muss eine ganze Menge wissen   Informationen

Ich denke, es ist notwendig. Sie sind nur einen Verweis auf das Brett vorbei, nicht wirklich große Datenmengen verursacht werden kann bewegt.

Der Vorstand selbst wird wahrscheinlich das Punktesystem für eine bestimmte Runde fahren. Da jede Fliese gelegt wird, macht der Vorstand zur Kenntnis davon. Wenn die letzte Fliese (für eine Umdrehung) platziert wurde, muss der Vorstand alle Quadrate erhalten, die eine neu hinzugefügte Kachel haben (die Bonus für diese Quadrate wird berechnet) und all die zuvor platzierten Fliesen, dass der Strom wiederum " Wiederverwendung“.

Zum Beispiel spielt CAT

C A T

C fällt auf Doppelbrief Score. So ist die Punktzahl für die Wende C.Value * 2 + A.Wert + T.Value.

Als nächster Spieler setzt ein S CATS zu machen. S fällt auf Triple-Word-Score. Also, die Partitur für die Wende ist (C.Value + A.Wert + T.Value + S.Value) * 3. Wenn ein Bonus-Fliesen angewendet wurde, muss es „Deaktiviert“ sein, so dass zukünftige „Wiederverwendungsmöglichkeiten“ dieser Fliese nicht auch den Bonus bekommen.

Die Implikation ist, dass einige Boni, die Fliesen auf dem Platz platziert gelten, während andere auf die Sammlung von Fliesen gelten, die das neue Wort nach dem Bonus für die einzelnen Buchstaben bilden berechnet worden ist.

Bei einer oder mehreren Quadrate, die mit Fliese (s) während einer Umdrehung gefüllt worden sind, kann der Vorstand den Anfang des Wortes finden (en), die bis zum Rand der Platine durch das Durchlaufen gelassen erstellt wurden (oder bis ein leerer Platz) und bis zum gleichen Zustand durchlaufen werden. Der Vorstand kann das Ende des Wortes (s) finden, die von ähnlich durchquert rechts und nach unten erstellt wurde. Sie haben auch zu Beginn und am Ende der Wörter jedes Mal, wenn ein neu platziert Tile ist Angrenzend an eine bestehende Fliese zu durchqueren (Du viele Worte während einer Kurve führen könnte).

eine Sammlung von Worten Given (jeweils aus einem Quadrat eine mögliche LetterBonus enthält und eine Fliese mit einem Value), der Vorstand (oder jedes Wort selbst) berechnet den basevalue (Summe der Werte von Fliesen - alles LetterBonuses Anwendung) und dann die WORDBONUS (falls vorhanden) gilt der endgültige Wert des Wortes zu erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top