Làm thế nào để tôi thiết kế một trò chơi bài?


10

Tôi không thể đưa ra một kiến ​​trúc tốt cho trò chơi bài của mình. Tôi cần giúp đỡ để hiểu làm thế nào các trò chơi thường được thiết kế.

Đầu tiên, tôi sẽ mô tả các quy tắc trò chơi.

Luật chơi

Thiết lập
  • Có bốn người chơi, mỗi người chơi tạo thành một đội.
  • Mỗi người chơi được 12 thẻ xáo trộn
  • Có 4 thẻ mù trên bàn (sông)
  • Thứ tự người chơi là như thế này

nhập mô tả hình ảnh ở đây

Cá cược
  • Mỗi người chơi có thể vượt qua hoặc chọn một số lớn hơn đặt cược hiện tại trong khoảng từ 100 đến 160
  • Đặt cược bắt đầu từ người chơi đầu tiên và vòng tròn cho đến khi một đội vượt qua
  • Khi một người chơi vượt qua, họ không thể đặt cược nữa
  • Đội chiến thắng trong vòng đặt cược ít nhất phải thu thập điểm bằng với cược của họ để giành chiến thắng trong trò chơi
  • Đội thua vòng cá cược không được cho phép đội của họ đạt được mục tiêu

  • Nếu đội thắng vòng đặt cược nhận được tất cả các điểm, đội kia sẽ nhận được điểm âm bằng với cược của họ

  • Nếu đội thua trong vòng đặt cược thu thập tất cả các điểm, đội kia sẽ nhận được hai điểm âm

Lưu lượng trò chơi và thu thập điểm

  • Người chơi thắng vòng đặt cược ( nhà vua ) nhận bốn thẻ còn lại trên bàn.
  • Sau đó cô ấy / anh ấy có thể lưu một bộ bốn thẻ trong ngân hàng thẻ đội của họ mà không cần chơi chúng.
  • Nhà vua sẽ chọn một bộ đồ làm bộ đồ cai trị và cho người khác biết rằng
  • King bắt đầu trò chơi bằng cách đặt một lá bài từ bàn tay của mình lên bàn. Mỗi người chơi khác nên chơi theo thứ tự này
    • nếu họ có cùng một bộ bài đó trong tay, họ phải chơi một trong những lá bài đó
    • nếu họ không có nó, họ có thể chơi bất kỳ bộ đồ nào khác
  • Sau khi tất cả những người chơi khác chơi bài, người chiến thắng của vòng này sẽ là:
    • Người có thẻ cao nhất nếu tất cả các thẻ đều giống nhau
    • Người có thẻ "thước kẻ" cao nhất nếu có
  • Người chiến thắng trong vòng sẽ thu thập thẻ và đưa nó vào ngân hàng của họ
  • Người chơi chiến thắng vòng trước sẽ bắt đầu vòng tiếp theo
  • Điều này sẽ tiếp tục cho đến khi bàn tay của mọi người trống rỗng

Đếm điểm

  • Chiến thắng mỗi vòng có 5 điểm. Điều này có nghĩa là cứ 4 thẻ có ít nhất 5 điểm.
  • Có Ace, 10 hoặc 5 trong ngân hàng, mỗi nhóm thêm 5 điểm

Thiết kế của tôi

Các lớp học

class Card {
   string suit;
   string rank
}
class Deck {
  List cards = [];
  List suits = ['S', 'H', 'D', 'C'];
  List ranks = ['1', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'];
  private void init(){..}
  void shuffle(){...}
}

class Game{
  Deck deck = new Deck();
  Player player1;
  Player player2;
  Player player3;
  Player player4;
  int _isOn = 0;

  Game(this.player1, this.player2, this.player3, this.player4){
    deck.makeCards();
    deck.shuffle();
    start();
  }

  void start(){
    player1.cards.addAll( deck.cards.getRange(0, 12) );
    player2.cards.addAll( deck.cards.getRange(12, 24) );
    player3.cards.addAll( deck.cards.getRange(24, 36) );
    player4.cards.addAll( deck.cards.getRange(36, 48) );
    deck.cards.removeRange(0, 48);
  }

  String toJson(){
  }

  String toString(){
  }
}
class Player{
  String name;
  int points;
  List cards = [];

  Player(this.name, {this.points});

  String toJson(){}

  String toString(){}
}

Vấn đề của tôi

Bây giờ tôi đã định nghĩa tất cả các lớp này, tôi không biết cách liên kết các định nghĩa này với cơ sở dữ liệu (như Mongo) và kiểm soát luồng trò chơi.

  • Tất cả logic đó nên đi đâu?
  • Làm thế nào tôi nên giữ trạng thái trong một kịch bản máy chủ / máy khách?

Ghi chú:

Tôi đang sử dụng Dart để lập trình điều này nhưng tôi không cần câu trả lời được viết bằng Dart.


Trong trường hợp bất cứ ai đang xem mã của bạn và sử dụng nó làm điểm bắt đầu, hãy lưu ý rằng bạn nên chọn A hoặc 1 trong hàng ngũ, nhưng không bao gồm cả hai.
Ben

Câu trả lời:


10

Bạn đang phạm một sai lầm kinh điển ở đây. Ai đó bảo bạn tạo một ứng dụng web cho một trò chơi bài và bạn đang cố gắng xác định cách tạo tất cả chúng cùng một lúc. Cách tiếp cận này gây nhầm lẫn ngay cả những lập trình viên giỏi nhất, vì các nghiên cứu đã chỉ ra rằng bạn chỉ có thể giữ lại 7 mẩu thông tin có sẵn trong tâm trí của mình cùng một lúc. Cố gắng tung hứng với nhiều hơn đòi hỏi sự tập trung cao độ và bạn không thể mong đợi để duy trì điều đó.

Thay vào đó, hãy cố gắng tập trung nhiều hơn vào việc viết thư viện trò chơi bài giống như ai đó sẽ gọi thư viện của bạn để chơi trò chơi bài của bạn. Bạn dường như có một khởi đầu tuyệt vời trên mô hình của bạn. Điều đó là tốt, nhưng bạn cần phải thực hiện Gamegiao diện mà người gọi có thể sử dụng thực hiện di chuyển và vv.

Vì vậy, tôi mong đợi Game sẽ có một số phương pháp mới như:

getPlayers()        // Get all player info
getCurrentPlayer()  // Get information about the active player in his turn (hand, money to bet with, etc.)
fold()              // Current player folds and current player changes
bet(float amount)   // Current player bets and current player changes

Nói tóm lại, mọi thứ bạn cần biết để chạy trò chơi, bạn có thể làm như vậy bằng cách sử dụng đối tượng của mình Game. Chỉ khi bạn có điều này, bạn mới tiến hành bước 2.

Viết một lớp riêng biệt với mục đích duy nhất là nhận các yêu cầu đến, áp dụng chúng Gamevà gửi lại đầu ra cho người dùng. Nếu bạn muốn chuyển đổi Gameđầu ra thành JSON, bạn thực hiện nó bên ngoài Gamevì đó không phải là mục đích của Game!

Để duy trì thông tin này, bạn có thể tạo một lớp khác cung cấp giao diện cho MongoDB. Lớp này sẽ không biết đến sự tồn tại của Gamevà cũng không Gamebiết về sự tồn tại của lớp này.

Nói tóm lại, tập trung vào các thành phần riêng lẻ, và bạn sẽ ổn thôi. Bạn bắt đầu sai lầm khi bạn đang cố gắng cân nhắc quá nhiều khía cạnh khi viết chương trình của mình. Như một giáo sư khôn ngoan đã từng nói với tôi, " Biết và nắm bắt thực tế rằng chương trình đầu tiên bạn viết cho một dự án sẽ được viết lại toàn bộ vào cuối. "


Ngoài ra, con số đó là bất cứ nơi nào từ 3 đến 9 tùy thuộc vào từng người - Tôi có thể làm 4 hoặc 5 tùy thuộc vào mức độ cảnh giác của tôi. Bài kiểm tra thông thường là xem xét một loạt các dấu chấm và tìm hiểu xem bạn có thể cảm nhận được bao nhiêu cá nhân mà không cần nhóm chúng về mặt tinh thần - chẳng hạn, lúc 6, tôi bắt đầu tự động nhóm chúng thành 3 + 3, và không thể dễ dàng tách chúng ra một lần nữa .
Izkata

@Izkata Thật thú vị. Tôi đã không biết rằng đã có một bài kiểm tra cho việc này. Bạn có một liên kết?
Neil

1
vi.wikipedia.org/wiki/ Từ là nguồn, tôi tin.
AakashM

1

Tất cả logic đó nên đi đâu?

Bắt đầu với việc đưa nó vào Gamelớp học của bạn .

Đây là một trò chơi dựa trên quy tắc với một số lượng hạn chế. Tôi sẽ mô hình nó như một máy trạng thái . Các mô hình nhà nước sẽ giúp bạn rất nhiều.

Cuối cùng, bạn sẽ muốn trích xuất FSM đó thành các lớp riêng biệt, nhưng bây giờ đừng lo lắng về điều đó.

Làm thế nào tôi nên giữ trạng thái trong một kịch bản máy chủ / máy khách?

Điều này là không thể trả lời mà không biết thêm về thiết lập của bạn. Tuần tự hóa đối tượng Trò chơi của bạn và trạng thái vào cơ sở dữ liệu mỗi lượt có thể thực hiện thủ thuật.


Đây là một phần đi kèm về trạng thái / FSM, trong trường hợp này là từ một cuốn sách tập trung vào các trò chơi: gameprogrammingpotypes.com/state.html
shmup
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.