2012-02-06 39 views
5

Cách tiếp cận tốt nhất khi thiết kế các lớp học sau đây áp dụng các mẫu thiết kế là gì?Thiết kế OOP cho các lớp trò chơi thẻ

  • sàn-addCard, thỏa thuận, shuffle, getTopCard, removeTopCard, removeAllCards
  • tay-addCard, removeCard, getCard, removeAllCards
  • DiscardPile-addCard, getTopCard , removeTopCard, removeAllCards
  • MeldPile-addCard, removeAllCards

(Các MeldPile giữ tất cả các melds trong bảng.)

Đối với tôi, tôi nghĩ rằng getTopCardremoveTopCard chỉ là một wrapper của getCardremoveCard, như nó chỉ nhận được vị trí hàng đầu của một thẻ sau đó chuyển nó đến getCard hoặc removeCard.

Tôi có nên sử dụng bố cục không? mô hình chiến lược? hoặc chỉ cần tạo một lớp khác có tên là CardPile và sử dụng nó làm lớp cơ sở của lớp trên? Thực sự đánh giá cao nếu bạn có thể cung cấp một mã mẫu về điều này.

+3

Cách tiếp cận tốt nhất là bắt đầu viết quy tắc trò chơi và để thiết kế của bạn phát triển tự nhiên. Nếu bạn có câu hỏi cụ thể, ví dụ: 'Tôi đang cố gắng thực thi quy tắc nếu người chơi chơi bài mà người chơi khác phải loại bỏ, tôi nên sử dụng mẫu nào ở đây?' điều đó có thể trả lời được. –

+1

+1 cho "để thiết kế của bạn phát triển tự nhiên" – radarbob

+0

Hãy coi chừng việc phân tán các lớp "tự nhiên xảy ra" thành các lớp cơ sở hạt nguyên tử phụ. Phân cấp lớp có thể nhận được quá sâu với quá trình xử lý chung và không cần thiết đang diễn ra. Bạn luôn có thể cấu trúc lại sau này nếu * tiến trình thiết kế tự nhiên của bạn * gọi cho một cơ sở tổng quát hơn từ đó để lấy được chức năng mới. – radarbob

Trả lời

6

Tôi nghĩ rằng bạn có thể đạt được những gì bạn muốn với một tầng lớp duy nhất như dưới đây về cơ bản là một wrapper quanh Stack, tôi không thấy lý do tại sao bất kỳ boong/đống/tay cụ thể sẽ không muốn nhất nếu không phải tất cả phương pháp.

class Deck { 
    private Stack<Card> cards = new Stack<Card>(); 

    public Deck() { } 

    public Deck(int numberOfCards) { 
     for (int i=0; i<numberOfCards; i++) { 
      cards.push(CardFactory.createCard(i)); 
     } 
    } 

    private void shuffle() { 
     Collections.shuffle(this.cards); 
    } 

    public void sort() { 
     Collections.sort(this.cards); 
    } 

    public void removeAllCards() { 
     this.cards.removeAllElements(); 
    } 

    public void removeCard(Card c) { 
     int i = this.cards.search(c); 
     this.cards.remove(i);    
    } 

    public Card getCard(Card c) { 
     int i = this.cards.search(c); 
     return this.cards.get(i); 
    } 

    public Card getTopCard() { 
     return this.cards.pop(); 
    } 

    public Card getNthCard(int i) { 
     return this.cards.get(i); 
    } 

    public Card addCard(Card c) { 
     this.cards.push(c); 
    } 

} 

Vấn đề thực sự duy nhất tôi thấy là với phương pháp deal() và liệu đây có phải là trách nhiệm của một Deck không? Cá nhân tôi sẽ không nghĩ như vậy, điều này dẫn tôi đến nghĩ rằng có lẽ bạn sẽ có một lớp người chơi và một lớp đại lý mở rộng cầu thủ và thực hiện logic xử lý một boong

class Player() { 
    protected String name; 
    protected Deck hand = new Deck(); 

    public void addCard(Card c) { 
     this.hand.addCard(c); 
    } 

    // ..... 
} 

class Dealer() extends Player { 
    private Deck deck; 

    public Dealer(int deckSize) { 
     this.deck = new Deck(deckSize); 
    } 

    public void deal(Player[] players, int numberOfCards) { 
     for (player in players) { 
      for (int i=0; i<numberOfCards; i++) { 
       player.addCard(this.deck.getTopCard()); 
      } 
     } 
    } 

    // ..... 
} 
+0

Tôi đã không thực sự hiểu những gì một đống meld đã hoặc đã âm thanh một chút MtG nó thuộc về một cầu thủ? Ví dụ một trò chơi kiểu MTG (từ kinh nghiệm ngắn ngủi của tôi), người chơi sẽ có một cỗ, một tay, sức mạnh của phần tử chơi bài bit, và phần chơi của quái vật tất cả những gì tôi nghĩ có thể là 'Deck' mặc dù bạn có thể muốn tạo một lớp cơ sở của 'Deck' không thực hiện các phương thức như 'shuffle()' và sử dụng nó như 'các ngăn xếp nhỏ hơn của thẻ' –

+0

Tôi đồng ý với bạn về phương thức giao dịch, nó không phải là một phần của giao diện là hành vi của đại lý. Một đống meld là một bộ thẻ (Ba-of-a-loại, Four-of-a Kind và Straight) thuộc về một cầu thủ được đăng trên bàn.Tôi chỉ không thể quyết định những gì để thực hiện bởi vì hầu hết các trò chơi thẻ mã nguồn mở sử dụng lớp khác nhau cho Deck, Hand và Discard Pile và trong khi người khác vừa tạo ra một CardPile và sử dụng nó như là một lớp cơ sở. – Zack

+0

Tôi khuyên bạn nên bắt đầu bằng cách sử dụng một lớp cơ sở CardPile đơn lẻ sẽ đóng gói thêm và loại bỏ thẻ từ đó bạn có thể thừa hưởng nó ở nơi bạn có thể có một 'Deck' có thể xáo trộn và tạo ra một cách kỳ diệu, một' MeldPile' có quy tắc riêng của nó cho các thẻ có thể chứa, một 'Hand' có thể đặt số lượng thẻ tối đa được phép và quy tắc hủy. Quan trọng hơn, tôi nghĩ tốt hơn là nên bắt đầu một cái gì đó, tránh 'viêm mô hình' và tái cấu trúc/tối ưu hóa mã của bạn nếu hoặc khi được yêu cầu. –

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