ฉันจะออกแบบเกมการ์ดได้อย่างไร


10

ฉันไม่สามารถสร้างสถาปัตยกรรมที่ดีสำหรับเกมไพ่ของฉันได้ ฉันต้องการความช่วยเหลือในการทำความเข้าใจว่าเกมได้รับการออกแบบมาอย่างไร

ก่อนอื่นฉันจะอธิบายกฎของเกม

กฎของเกม

ติดตั้ง
  • มีผู้เล่นสี่คนผู้เล่นสองคนรวมกันเป็นทีม
  • ผู้เล่นแต่ละคนจะได้รับไพ่สับ 12 ใบ
  • มีไพ่ตาบอด 4 ใบบนโต๊ะ (ริมแม่น้ำ)
  • คำสั่งของผู้เล่นเป็นเช่นนี้

ป้อนคำอธิบายรูปภาพที่นี่

การพนัน
  • ผู้เล่นแต่ละคนสามารถผ่านหรือเลือกตัวเลขที่มากกว่าเดิมพันปัจจุบันระหว่าง 100 ถึง 160
  • การเดิมพันเริ่มต้นจากผู้เล่นคนแรกและแวดวงจนกว่าทีมจะผ่าน
  • เมื่อผู้เล่นผ่านพวกเขาไม่สามารถเดิมพันได้อีกต่อไป
  • ทีมที่ชนะในรอบการเดิมพันควรมีคะแนนอย่างน้อยเท่ากับการเดิมพันเพื่อที่จะชนะเกม
  • ทีมที่แพ้ในรอบการเดิมพันไม่ควรอนุญาตให้ทีมของพวกเขาบรรลุเป้าหมาย

  • หากทีมที่ชนะการเดิมพันรอบได้คะแนนทั้งหมดทีมอื่น ๆ จะได้รับคะแนนลบเท่ากับการเดิมพันของพวกเขา

  • หากทีมที่แพ้ในรอบการเดิมพันรวบรวมคะแนนทั้งหมดทีมอื่นจะได้รับคะแนนติดลบสองเท่า

การไหลของเกมและคะแนนสะสม

  • ผู้เล่นที่ชนะการเดิมพันรอบ ( ราชา ) จะได้รับไพ่ที่เหลือสี่ใบบนโต๊ะ
  • จากนั้นเธอ / เขาสามารถบันทึกไพ่สี่ใบในธนาคารการ์ดของทีมโดยไม่ต้องเล่น
  • กษัตริย์จะเลือกชุดสูทเป็นชุดไม้บรรทัดและให้คนอื่นรู้ว่า
  • King เริ่มเกมโดยวางไพ่จากมือของเขา / เธอวางบนโต๊ะ ผู้เล่นแต่ละคนควรเล่นตามลำดับนี้
    • หากพวกเขามีไพ่ชุดเดียวกันในมือพวกเขาจะต้องเล่นไพ่ใบใดใบหนึ่ง
    • หากพวกเขาไม่มีมันพวกเขาสามารถเล่นชุดอื่น ๆ
  • หลังจากผู้เล่นคนอื่น ๆ เล่นด้วยมือผู้ชนะในรอบจะเป็น:
    • ผู้ที่มีไพ่สูงสุดถ้าไพ่ทั้งหมดเหมือนกัน
    • ผู้ที่มีไพ่ "ไม้บรรทัด" สูงสุดถ้ามี
  • ผู้ชนะในรอบนั้นจะเก็บบัตรและนำไปไว้ในธนาคารของพวกเขา
  • ผู้เล่นที่ชนะรอบก่อนหน้าจะเริ่มรอบถัดไป
  • สิ่งนี้จะดำเนินต่อไปจนกว่ามือของทุกคนจะว่างเปล่า

การนับคะแนน

  • ผู้ชนะในแต่ละรอบมี 5 คะแนน ซึ่งหมายความว่าไพ่ 4 ใบทุกใบมีอย่างน้อย 5 คะแนน
  • มี Ace 10 หรือ 5 ในธนาคารแต่ละคนเพิ่ม 5 คะแนน

การออกแบบของฉัน

การเรียนการสอน

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(){}
}

ปัญหาของฉัน

ตอนนี้ฉันได้กำหนดคลาสทั้งหมดเหล่านี้แล้วฉันไม่ทราบวิธีผูกนิยามนี้กับฐานข้อมูล (เช่น Mongo) และควบคุมการไหลของเกม

  • ตรรกะทั้งหมดนั้นควรไปที่ไหน
  • ฉันจะรักษาสถานะในสถานการณ์เซิร์ฟเวอร์ / ไคลเอนต์ได้อย่างไร

บันทึก:

ฉันใช้ Dart เพื่อเขียนโปรแกรมนี้ แต่ฉันไม่ต้องการให้เขียนคำตอบเป็น Dart


ในกรณีที่ทุกคนกำลังดูรหัสของคุณและใช้เป็นจุดเริ่มต้นโปรดทราบว่าคุณควรเลือก A หรือ 1 ในอันดับ แต่ไม่รวมถึงทั้งสอง
Ben

คำตอบ:


10

คุณกำลังทำผิดคลาสสิกที่นี่ มีคนบอกให้คุณสร้างเว็บแอปพลิเคชั่นสำหรับเกมไพ่และคุณกำลังพยายามหาวิธีทำเกมทั้งหมดในครั้งเดียว วิธีการนี้ทำให้เกิดความสับสนแม้กระทั่งโปรแกรมเมอร์ที่ดีที่สุดเนื่องจากการศึกษาแสดงให้เห็นว่าคุณสามารถเก็บข้อมูล 7 ชิ้นไว้ในใจในคราวเดียวเท่านั้น การพยายามที่จะเล่นปาหี่มีความเข้มข้นมากขึ้นและคุณไม่สามารถคาดหวังได้

ค่อนข้างพยายามเน้นมากขึ้นในการเขียนห้องสมุดเกมการ์ดเหมือนใครบางคนกำลังจะเรียกห้องสมุดของคุณเพื่อเล่นเกมไพ่ของคุณ คุณดูเหมือนจะมีจุดเริ่มต้นที่ยอดเยี่ยมสำหรับโมเดลของคุณ นั่นเป็นสิ่งที่ดี แต่คุณต้องสร้างGameอินเทอร์เฟซโดยที่ผู้โทรสามารถใช้การย้ายและอื่น ๆ

ดังนั้นฉันคาดหวังว่าเกมจะมีวิธีการใหม่หลายอย่างเช่น

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

Gameในระยะสั้นทุกสิ่งที่คุณจำเป็นต้องรู้เพื่อที่จะรันเกมที่คุณสามารถทำได้โดยใช้วัตถุของคุณ เมื่อคุณมีสิ่งนี้แล้วคุณจะไปยังขั้นตอนที่ 2

เขียนคลาสที่แยกต่างหากซึ่งมีวัตถุประสงค์เพียงอย่างเดียวคือการรับคำขอเข้าใช้Gameและส่งออกกลับไปยังผู้ใช้ หากคุณต้องการแปลงGameเอาท์พุทเป็น JSON คุณทำได้นอกGameเพราะนั่นไม่ใช่จุดประสงค์ของGame!

เพื่อที่จะยืนยันข้อมูลนี้คุณสามารถสร้างคลาสอื่นที่ให้อินเทอร์เฟซกับ MongoDB ชั้นนี้จะไม่รู้ถึงการมีอยู่ของGameและไม่Gameทราบถึงการมีอยู่ของชนชั้นนี้

ในระยะสั้นมุ่งเน้นไปที่แต่ละองค์ประกอบและคุณจะไม่เป็นไร คุณเริ่มผิดเมื่อคุณพยายามพิจารณาหลายแง่มุมมากเกินไปเมื่อเขียนโปรแกรมของคุณ ในฐานะที่เป็นศาสตราจารย์ที่ชาญฉลาดเคยบอกฉันว่า " รู้และยอมรับความจริงที่ว่าโปรแกรมแรกที่คุณเขียนสำหรับโครงการจะถูกเขียนใหม่ทั้งหมดในตอนท้าย "


นอกจากนี้หมายเลขนั้นอยู่ที่ใดก็ได้ตั้งแต่ 3 ถึง 9 ขึ้นอยู่กับบุคคล - ฉันสามารถทำ 4 หรือ 5 ขึ้นอยู่กับว่าฉันเป็นใคร การทดสอบตามปกติคือดูที่จุดจำนวนหนึ่งและหาจำนวนที่คุณสามารถรับรู้เป็นรายบุคคลโดยไม่จัดกลุ่มพวกเขาทางจิตใจ - ที่ 6 ฉันเริ่มจัดกลุ่มพวกเขาเป็น 3 + 3 โดยอัตโนมัติและไม่สามารถแยกพวกเขาออกได้ง่ายอีกครั้ง .
Izkata

@Izkata นั่นน่าสนใจ ฉันไม่ทราบว่ามีการทดสอบนี้ คุณมีลิงค์หรือไม่?
Neil

1
en.wikipedia.org/wiki/…เป็นแหล่งข้อมูลฉันเชื่อว่า
AakashM

1

ตรรกะทั้งหมดนั้นควรไปที่ไหน

เริ่มต้นด้วยการวางไว้ในGameชั้นเรียนของคุณ

เกมนี้เป็นเกมที่ยึดกฎแบบ จำกัด จำนวนสถานะ ฉันจะสร้างแบบจำลองว่ามันเป็นเครื่องของรัฐ รูปแบบของรัฐจะช่วยให้คุณอย่างมาก

ในที่สุดคุณจะต้องแยก FSM นั้นออกเป็น class แยกกัน แต่ไม่ต้องกังวลในตอนนี้

ฉันจะรักษาสถานะในสถานการณ์เซิร์ฟเวอร์ / ไคลเอนต์ได้อย่างไร

นี่เป็นไปไม่ได้ที่จะตอบโดยไม่ทราบข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่าของคุณ การทำให้เป็นอันดับวัตถุเกมของคุณและระบุไปยังฐานข้อมูลทุกเลี้ยวอาจทำเคล็ดลับ


นี่คือชิ้นส่วนที่เกี่ยวข้องกับรัฐ / FSM ในกรณีนี้จากหนังสือที่เน้นไปที่เกม: gameprogrammingpatterns.com/state.html
shmup
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.