2011-12-30 49 views
5

Tôi đang thiết kế một trò chơi, nhưng tôi hoàn toàn không thể có được đầu xung quanh cấu trúc thừa kế. Tôi thường khá giỏi ở đó, nhưng điều này chỉ có quá nhiều sự chồng chéo và tôi không thể quyết định tất cả.Thiết kế thừa kế/giao diện của trò chơi

Tôi đang tìm cách lập mô hình thuyền buồm - hãy nghĩ đến Tuổi của Sail. Có lẽ do đó mọi thứ mở rộng một lớp Vessel.

Sau đó có một số loại kiểu tàu: chèo thuyền (galleys, cano), giàn khoan vuông, giàn khoan trước và sau, với hành vi khác nhau. Mỗi phần trong số này được chia nhỏ thành nhiều loại khác. Tôi không thể quyết định xem đây có phải là một loạt các giao diện hoặc phần mở rộng của Tàu. Cũng lưu ý rằng có thể có một số chéo (một tàu có thể được cả hai chèo và vuông gian lận) dẫn tôi đến suy nghĩ giao diện?

Tàu cũng có các hành vi khác nhau: tàu buôn, chiến tranh, cá nhân, cướp biển. Tôi thực sự không thể làm việc cho dù điều này nên là một giao diện hoặc mở rộng của lớp khác. Tuy nhiên, không có sự giao nhau kiểu nào trong trường hợp này.

Cuối cùng, có một số hành vi mà các tàu cá nhân có thể có. Thương nhân có thể ở trong đoàn xe (tự vệ) hoặc độc lập (bỏ chạy). Những người đàn ông chiến tranh hầu như luôn tấn công trừ khi bị bắn quá nhiều ... nhưng có thể làm việc trong hạm đội, phi đội hoặc độc lập. Tư nhân và cướp biển chỉ tấn công nếu yếu hơn - thường độc lập nhưng đôi khi theo cặp. Tôi giả định rằng đây cũng là một giao diện?

Vấn đề lớn của tôi là mỗi kiểu tàu (tàu khu trục, tàu chiến ...) có thể thực hiện hầu như bất kỳ vai trò nào, vì vậy tôi không thể xây dựng một cấu trúc thừa kế đơn giản. Frigate không thể mở rộng chiến tranh vì một số người là tư nhân. Sloop không thể mở rộng hình vuông được gian lận bởi vì một số được fore và aft rigged. Vân vân.

Bất kỳ suy nghĩ nào sẽ được đánh giá cao, tôi sắp hết một chút. Cảm ơn

+1

Hai ý tưởng xuất hiện trong đầu của tôi là "thiết kế dựa trên thành phần" và "mẫu chiến lược". Theo như các hành vi khác nhau mà tàu cá nhân có thể có, đó chắc chắn là mô hình chiến lược với tôi - mỗi con tàu đang sử dụng một trong nhiều chiến lược khác nhau. Xem ở đây trên Wikipedia: http://en.wikipedia.org/wiki/Strategy_pattern –

+0

Một con tàu có thể đi từ tàu buôn đến cướp biển ** tại thời gian chạy **, vì vậy giao diện sẽ không hoạt động đối với loại hành vi động này. –

+0

@amadeus: không nhận được quan điểm của bạn. Nếu bạn là "lập trình cho giao diện", bạn có thể làm điều đó một cách chính xác. – Bhushan

Trả lời

2

Ok, đây là một số ý tưởng:

  • tàu có một hoặc nhiều biện pháp đẩy (mái chèo, buồm, vv), mà bạn có thể mô hình bằng cách tổng hợp (ví dụ như có một danh sách các phương pháp đẩy).
  • Tàu sử dụng một trong nhiều chiến lược khác nhau (sử dụng mẫu chiến lược - xem http://en.wikipedia.org/wiki/Strategy_pattern - cho điều này)
  • Các chiến lược phụ thuộc vào sự hiện diện của các tàu khác gần đó sẽ cần một số cách truy vấn cho các tàu khác - vì vậy bạn sẽ cần một số loại cấu trúc dữ liệu cho phép bạn tìm các đối tượng ở gần các đối tượng khác (xem cấu trúc dữ liệu được sử dụng để phát hiện va chạm pha rộng)

Như một giải pháp thay thế mẫu chiến lược, bạn có thể chuyển sang sử dụng thiết kế dựa trên thành phần. Trong thiết lập này, một tàu sẽ bao gồm một hoặc nhiều thành phần động cơ đẩy, một thành phần chiến lược, vv. Sau đó bạn có thể kết hợp các thành phần riêng lẻ như bạn thấy phù hợp để chế tạo các mạch khác nhau. Là một phần thưởng bổ sung, thiết kế dựa trên thành phần rất hữu ích nếu bạn muốn trò chơi của mình được hướng dữ liệu, bởi vì bạn chỉ có thể viết trình tiết kiệm/bộ nạp cho từng loại thành phần khác nhau, thay vì cho mỗi loại có thể tàu.

Bạn có thể muốn xem tại đây nếu bạn quan tâm đến loại này của phương pháp:

http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/

5

Làm cho phần "hành vi" là giao diện. Điều đó sẽ giúp bạn chỉ định các hành vi khác nhau cho các tàu khác nhau mà không có vấn đề gì. Strategy Pattern hữu ích ở đây. Tóm lại, nó nói rằng các thuộc tính có thể thay đổi và hằng số nên được tách ra.

Đối với các phương tiện di chuyển khác nhau, bố cục âm thanh như câu trả lời phù hợp nhất tại thời điểm này.

Về "nhưng có thể làm việc trong hạm đội, phi đội hoặc độc lập. Cá nhân và cướp biển chỉ tấn công nếu yếu hơn - thường độc lập nhưng đôi khi theo cặp." một phần, tôi đoán điều này không có gì để làm với cây thừa kế. Bạn có thể làm cho "nhóm" của các lớp học tùy thuộc vào nhu cầu của bạn.

Điều này có thể giúp bạn:

enter image description here

"Có thì một số loại kiểu tàu: ..." được quy định cụ thể các hành vi khác nhau càng tốt. Vì vậy, "Movable" giao diện và các lớp con của nó là cho điều đó. Trong lớp "Tàu", bạn có thể có một thành viên thuộc loại "Di chuyển". Vì "Movable" là một giao diện, bất kỳ lớp nào thực hiện nó, đều có thể gán cho thành viên này. Vì vậy, bất kỳ phân lớp của Vessel có thể có bất kỳ hành vi có thể, mà chúng tôi cna thay đổi trong thời gian chạy là tốt. Bạn cũng có thể biến nó thành một ArrayList. (Không chắc chắn nếu bạn thực sự muốn làm điều đó hay không). Nhưng nếu bạn cần nhiều hành vi khác nhau cho cùng một tàu, bạn có thể làm điều đó.

Khi bạn nói "Tàu cũng có các hành vi khác nhau: ..." có vẻ như các lớp riêng biệt mở rộng Tàu sẽ đáp ứng yêu cầu này. Câu "Tuy nhiên, không có sự giao nhau nào trong loại hình này." làm cho cuộc sống dễ dàng hơn.

Đối với đoạn tổ "Cuối cùng có một số hành vi mà từng tàu có thể có ...", bạn nên thêm một thành viên nữa cho các hành vi có thể khác nhau. Nó chủ yếu sẽ là một ArrayList như một tàu sẽ có nhiều chế độ tấn công.

Fro đoạn cuối cùng, nếu bạn có thể cung cấp thêm một số chi tiết, tôi có thể cung cấp thêm một số ý tưởng.

+0

Sơ đồ đó là loại ý tưởng ban đầu tôi nghĩ ra - tuy nhiên tôi nhận ra rằng tôi vẫn cần một lớp khác. Ví dụ, làm thế nào để tôi tạo ra ba tàu. Một thương gia gian lận vuông, một mũi khác và phía sau bị gian lận và một cái bẫy cướp biển phía trước và phía sau cướp biển? Tôi cần một lớp LOT nhiều hơn để có được tất cả các kết hợp có thể có. Tôi muốn kết thúc với FAPirateSloop mở rộng Pirate implement ForeAndAft, SQPirateSloop mở rộng Pirate implement SquareRigged etcetc. –

1

Bạn nên tách các loại và sử dụng mẫu strategy.
Các đặc tính không thể thay đổi nên được gắn với cây thừa kế (ví dụ: tàu khu trục sẽ không chuyển thành xuồng, đây là các loại chính xác, không hành vi, kế thừa từ tàu) và mọi thứ có thể thay đổi phải được lưu trữ làm tham chiếu đến các loại hành vi intrachangable. (Man-o-chiến tranh là một loại hành vi)
AI nên được xử lý riêng biệt, ví dụ với các tiểu bang, nhưng đó cũng phải có trong một mô-đun khác nhau trong kiến ​​trúc của bạn.

1

Thay vì suy nghĩ về nó như là Nghiêm thừa kế, tôi nghĩ rằng bạn cần phải suy nghĩ về đối tượng và làm thế nào Composition có thể giúp mọi thứ trở nên dễ dàng hơn.

Ví dụ: tàu có hành vi. (Thành phần ... các đại biểu tàu đến hành vi để xác định làm thế nào để phản ứng với tình hình X)

Một Pirate là một hành vi (thừa kế từ một giao diện Behavior) ...

+2

Về mặt kỹ thuật, một tên cướp biển là một đồng đội tức giận với miếng che mắt nói "Arrr!" rất nhiều và làm cho mọi người đi bộ ván.Hành vi giống như cướp biển là một hành vi :) Lưu ý rằng đây không phải là một điểm hoàn toàn cạnh tranh, trong đó mọi người nhìn thấy một lớp được gọi là "Pirate" sẽ không mong đợi nó là một hành vi. –

+0

@StuartGolodetz - đó có lẽ là nơi tôi sử dụng "vi phạm bản quyền" như một lớp học thay thế, để loại bỏ sự nhầm lẫn? –

+1

Điểm tốt về việc cẩn thận về việc đặt tên ... Tôi sẽ thừa nhận tôi vừa rút ra khỏi câu hỏi ban đầu mà không suy nghĩ quá nhiều về nó và ai không thích cướp biển? (Chà ... bên cạnh ninja): D – Charlie

2

tôi muốn cung cấp một chút lời khuyên dựa trên đoạn thứ hai của câu trả lời của Bhusan, mà tôi trích dẫn ở đây đầy đủ:

"Về" nhưng có thể làm việc trong hạm đội, phi đội hoặc độc lập. Tư nhân và cướp biển chỉ tấn công nếu yếu hơn - thường là độc lập nhưng đôi khi theo cặp. ”Một phần, tôi đoán điều này không liên quan gì đến cây thừa kế.Bạn có thể làm cho "nhóm" của các lớp tùy thuộc vào nhu cầu của bạn. "

Điều này dẫn tôi tin rằng bạn có thể muốn xem xét mẫu Composite cho nhất định nhóm tàu, ít nhất là các tàu bao gồm tàu Xem http://en.wikipedia.org/wiki/Composite_pattern nơi mà nó được viết rằng "mô hình hỗn hợp mô tả rằng một nhóm các đối tượng được xử lý giống như một trường hợp duy nhất của một đối tượng."

Ví dụ bạn nói " Thương nhân có thể ở trong một đoàn xe (tự bảo vệ mình) ", nhưng có lẽ họ cũng có thể tự bảo vệ mình? Điều này dễ nói hơn là làm tất nhiên, và lời khuyên của tôi cho bạn là không nghĩ quá nhiều và bắt đầu với rất nhỏ người đăng ký et của những gì bạn muốn làm như một protoype

+0

Composite sẽ hoạt động cho các nhóm luôn gắn bó với nhau, nhưng sẽ cần xử lý cẩn thận khi tàu có thể tách ra khỏi nhóm chính - ví dụ: họ có thể cần phải được xem xét để rời khỏi hỗn hợp nếu họ đi thuyền quá xa. –

+0

Tôi không tin rằng các mẫu tổng hợp có vị trí trên các nhóm tĩnh hoặc động. – alphazero

1

Bạn không nên mở rộng lớp Tàu. Thay vào đó, một đối tượng Vessel nên chứa các đối tượng khác mô tả nó. (Điều này được gọi là Dependency Injection, gây khó chịu cho người đọc - quên tôi đã nói điều đó.) Bạn có một lớp Propulsion, với các cá thể cho các cánh buồm vuông, trước và sau, và mái chèo. Bạn có thể muốn các trường hợp đặc biệt của mỗi thân tàu lớn và nhỏ. Bạn có một lớp Hành vi để xử lý thái độ của họ. Đôi khi một số nguyên đơn giản hoạt động cũng như một lớp. Lớp vũ khí của bạn có thể, thay vào đó, chỉ là một số súng. (Hoặc hai con số, một cho tiền lương.) Nếu bạn mong đợi để ram, hoặc có một con tàu nạp với tên lửa, hoặc cần phải phân biệt giữa súng dài và carronades, bạn có thể cần phải quay trở lại sử dụng một lớp.

Điều này cho phép bạn chuyển đổi các đặc điểm khi đang di chuyển nếu bạn muốn - mặc dù bạn có thể không. Tuy nhiên, bạn có thể đi từ buồm để sử dụng quét, hoặc chuyển đổi hành vi mạnh mẽ của tàu với hành vi tiết kiệm hàng hóa của một thương gia để thực hiện một đội trưởng mất thần kinh của mình. Dù sao, nó có nếu bạn cần nó.

+0

Một câu trả lời ngắn gọn, cảm ơn - Tôi đã khá nhiều lượm lặt cùng một ý tưởng với nhau từ một sự kết hợp của các câu trả lời khác, nhưng bạn cụm từ nó tốt. –

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