2010-10-25 28 views
6

Giả sử tôi đang triển khai phiên bản Scrabble của riêng mình. Tôi hiện có một lớp học Board chứa rất nhiều Squares. Lần lượt, Square bao gồm IBonusPiece. Việc thực hiện tiền thưởng thực sự là tiền thưởng bình thường cho Scrabble, nhưng có thể là tôi có thể thử thêm một số tiền thưởng mới và xoắn để gia vị trò chơi - tính linh hoạt ở đây là tối thượng!Thiết kế hệ thống tiền thưởng linh hoạt và có thể mở rộng để thực hiện trò chơi của Scrabble

alt text

Sau khi suy nghĩ một thời gian tôi đi đến kết luận rằng cho IBonus triển khai để làm việc, họ sẽ cần phải biết toàn bộ Board và cũng vị trí hiện tại của nó (trên Board, vì vậy nó biết nơi nó là và nó có thể kiểm tra các mảnh đó là trong cùng một hình vuông như tiền thưởng là). Điều này đánh tôi tồi tệ như về cơ bản nó cần phải biết rất nhiều thông tin.

Vì vậy, triển khai ngây thơ của tôi sẽ vượt qua đối số Board làm phương pháp IBonus.calculate(), IBonus.calculate(Board board, Point position), tức là.

Ngoài ra, có vẻ như tạo tham chiếu vòng tròn. Hoặc là tôi sai? alt text

Tôi không giống như phương pháp này, vì vậy tôi đang tìm các cách tiếp cận có thể có khác. Tôi biết tôi có thể làm cho calculate chấp nhận giao diện thay vì một lớp cụ thể, tức là, calculate(IBoard board) nhưng tôi IMO không phải là tất cả tốt hơn trường hợp đầu tiên.

Tôi sợ quá tập trung vào việc triển khai hiện tại để có thể nghĩ về các thiết kế hoàn toàn khác nhau có thể phù hợp với ít nhất cũng như các giải pháp cho vấn đề này. Có lẽ tôi có thể tái cấu trúc toàn bộ trò chơi và có tiền thưởng ở nơi khác, vì vậy nó sẽ tạo thuận lợi cho tính toán này? Có lẽ tôi quá tập trung vào việc có chúng trên Board? Tôi chắc chắn hy vọng có những cách tiếp cận khác cho vấn đề này ngoài kia!

Cảm ơn

+1

+1 cho sơ đồ đẹp –

+0

Bạn đã sử dụng công cụ nào để tạo biểu đồ? –

+0

yUML, nó cho phép bạn tạo chúng và lưu trữ chúng trực tuyến. –

Trả lời

4

tôi giả HĐQT có trạng thái hữu hình của trò chơi, và sẽ có các đối tượng khác như rack (một cho mỗi Player,) và một DrawPile.

"Điểm kép nếu từ chứa Z thật (không trống) - sẽ yêu cầu bạn chuyển vào Word hoặc Bảng và vị trí của từ đó.

"Điểm kép nếu từ dài nhất trên bảng" yêu cầu toàn bộ Hội đồng quản trị.

"Điểm kép nếu chữ cái đầu tiên của từ khớp với một thư được chọn ngẫu nhiên từ DrawPile" yêu cầu DrawPile tất nhiên.

Vì vậy, với tôi, điều đó phụ thuộc vào các quy tắc bạn triển khai. Tôi cảm thấy thoải mái khi vượt qua Hội đồng quản trị để thực hiện điểm số IBonus().

chỉnh sửa - suy nghĩ khác.

Vì vậy, một bảng có 17x17 ô vuông, hoặc bất cứ thứ gì. Tôi sẽ chỉ định một thực hiện IBonus cho mỗi hình vuông của hội đồng quản trị (sẽ có một thực hiện được gọi là PlainEmptySquare đó là trơ.) Bạn chỉ cần để nhanh chóng thực hiện mỗi IBonus một lần - nó có thể được tham chiếu nhiều lần. Tôi có lẽ sẽ đi theo con đường thấp và khởi tạo từng con đường một cách rõ ràng, đi qua các đối số cần thiết. Nếu một trong những loại cần hội đồng quản trị, vượt qua nó in Nếu cần một DrawPile, vượt qua nó trong.Trong quá trình thực hiện của bạn, bạn có thể có 12 dòng xấu./Nhún vai

+0

Tôi đồng ý; nếu bạn muốn linh hoạt nhất để thiết kế tiền thưởng điên bạn cần có nhiều thông tin nhất. –

1

Something như sau có thể làm việc:

CurrentGameBoard, trong đó có một bộ sưu tập của Squares. A Square có thể có IBonus, tuy nhiên không có phương pháp Calculate() trên Square. A Square có thể có PiecePiece có thể có Square (ví dụ: hình vuông có thể hoặc không được để trống và có thể có hoặc không được đặt trên bảng).

Board cũng có phương thức calculateScoreForTurn() chấp nhận bộ sưu tập Pieces đại diện cho các phần vừa được đặt trên bảng cho lượt đó. Board biết tất cả các thông tin về các mảnh và hình vuông vừa được đặt, cũng như các mảnh và hình vuông xung quanh hoặc giao nhau (nếu có) và do đó có tất cả thông tin cần thiết để tính toán điểm số.

+0

Nhưng làm cách nào bạn xử lý các loại tiền thưởng khác nhau? Không nên logic của mỗi loại tiền thưởng khác nhau được đóng gói trong một lớp khác nhau? –

+1

Nó có lẽ không lý tưởng với quan điểm thiết kế OO, nhưng đối với tôi, có vẻ tốt hơn cho tất cả các "quy tắc logic" tồn tại ở một nơi duy nhất hơn là có một đối tượng IBonus (liên quan đến một ô duy nhất). Bảng. Bạn có thể có một đối tượng Scorer riêng biệt, vì vậy bạn chuyển nó cho Hội đồng quản trị và một bộ sưu tập các Pieces vừa được đặt, và nó trả về điểm số cho lượt đó. Có vẻ thích hợp khi một Người ghi bàn biết tất cả các quy tắc. – jwaddell

+1

Tôi nghĩ thực tế là một IBonus cụ thể có thể ảnh hưởng nhiều hơn chỉ một mảnh cụ thể mà nó liên quan (bao gồm cả các phần được đặt ở lượt trước) có nghĩa là bạn không nên đóng gói phương pháp chấm điểm của nó trong Square của nó. – jwaddell

1

này đập vào mắt tôi là xấu như về cơ bản nó cần phải biết rất nhiều toàn bộ thông tin

Tôi nghĩ đó là cần thiết. Bạn chỉ cần chuyển một tham chiếu đến bảng, không thực sự gây ra một lượng lớn dữ liệu được di chuyển xung quanh.

1

Bản thân Hội đồng quản trị có thể sẽ phải ghi điểm cho một vòng nhất định. Khi mỗi Ngói được đặt, Hội đồng sẽ ghi lại nó. Khi Tile cuối cùng (cho một lượt) đã được đặt, Hội đồng quản trị phải có được tất cả các hình vuông có một gạch mới được thêm vào (Tiền thưởng cho các ô vuông này sẽ được tính toán) và tất cả các gạch đã đặt trước đó là lượt hiện tại là " tái sử dụng ".

Ví dụ, chơi CAT

C T

C rơi vào đúp Letter Điểm. Vì vậy, điểm cho lượt là C.Value * 2 + A.Value + T.Value.

Trình phát tiếp theo đặt S để tạo CATS. S rơi vào Điểm Ba từ. Vì vậy, điểm số cho lượt là (C.Value + A.Value + T.Value + S.Value) * 3. Khi Tiền thưởng của Ngói đã được áp dụng, nó phải được "Hủy kích hoạt" để các lần "sử dụng lại" trong tương lai của Tile đó cũng không nhận được Tiền thưởng.

Ý nghĩa là một số Tiền thưởng áp dụng Ngói đặt trong Square trong khi những người khác áp dụng cho bộ sưu tập Gạch tạo nên từ mới SAU KHI Tiền thưởng cho các chữ cái riêng lẻ đã được tính toán.

Cho một hoặc nhiều ô vuông đã được đổ đầy (các) ô trong một lượt, Hội đồng có thể tìm thấy phần bắt đầu của từ đã được tạo bằng cách di chuyển sang trái cho đến cạnh của bảng (hoặc cho đến khi một hình vuông trống) và di chuyển lên cho đến cùng một điều kiện. Hội đồng quản trị có thể tìm thấy phần cuối của (các) Từ đã được tạo ra bằng cách di chuyển ngang và xuống tương tự. Bạn cũng phải đi qua phần Bắt đầu và Kết thúc của các từ mỗi lần một Ngói mới được đặt gần kề với một Ngói hiện có (bạn có thể tạo nhiều từ trong một lượt).

Cung cấp một tập hợp các từ (mỗi thành phần của một hình vuông có chứa một LetterBonus có thể và một giá trị có giá trị), bảng (hoặc mỗi từ) tính BaseValue (tổng giá trị của gạch - áp dụng bất kỳ LetterBonuses) và sau đó áp dụng WordBonus (nếu có) để có được giá trị tối thượng của Word.

Các vấn đề liên quan