Bir kart oyununu nasıl tasarlayabilirim?


10

Kart oyunum için iyi bir mimari bulamıyorum. Oyunların genellikle nasıl tasarlandığını anlamak için yardıma ihtiyacım var.

İlk olarak, oyun kurallarını anlatacağım.

Oyun kuralları

Kurmak
  • Dört oyuncu var, her iki oyuncu bir takım oluşturuyor.
  • Her oyuncu 12 karışık kart alır
  • Masanın üzerinde 4 kör kart var (nehir)
  • Oyuncuların sırası böyle

resim açıklamasını buraya girin

Bahis
  • Her oyuncu 100 ila 160 arasında mevcut bahisten daha büyük bir sayı geçebilir veya seçebilir
  • Bahis ilk oyuncudan başlar ve bir takım pas geçene kadar çevreler
  • Bir oyuncu pas geçtikten sonra artık bahis yapamazlar
  • Bahis turunu kazanan takım, oyunu kazanmak için en azından bahislerine eşit puan toplamalıdır.
  • Bahis turunu kaybeden takım, takımlarının hedeflerine ulaşmasına izin vermemelidir

  • Eğer bahis turu kazanan takım tüm puanları alırsa, diğer takım bahislerine eşit negatif puan alır

  • Eğer bahis turunu kaybeden takım tüm puanları toplarsa diğer takım iki kat negatif puan alır

Oyun akışı ve toplama noktaları

  • Bahis turunu kazanan oyuncu ( kral ) masada kalan dört kart alır.
  • Daha sonra takım kartları bankasına oynamadan bile dört kartlık bir takım kaydedebilir.
  • Kral cetvel kıyafeti olarak bir takım seçecek ve diğerlerine bunu bildirecek
  • King oyuna elinden bir kart koyarak masaya başlar. Her oyuncu bu sırayla oynamalıdır
    • eğer elinde o kartın aynısı varsa, o kartlardan birini oynamak zorundalar.
    • eğer onlar yoksa, başka bir takım elbise oynayabilirler
  • Diğer tüm oyuncular ellerini oynadıktan sonra, turun galibi:
    • Tüm kartlar aynı ise en yüksek karta sahip olan
    • Varsa en yüksek "cetvel" kartına sahip olan
  • Turun galibi kartları toplayacak ve bankalarına koyacaktır.
  • Bir önceki turu kazanan oyuncu bir sonraki tura başlar
  • Bu herkesin eli boşalana kadar devam edecek

Puan sayma

  • Her turu kazanmanın 5 puanı vardır. Bu, her 4 kartın en az 5 puanı olduğu anlamına gelir.
  • As, bankada 10 veya 5 olmak üzere her biri 5 puan ekler

Benim tasarımım

Sınıflar

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

Benim sorunum

Şimdi tüm bu sınıfları tanımladığım için bu tanımları bir veritabanına (Mongo gibi) nasıl bağlayacağımı ve oyun akışını nasıl kontrol edeceğimi bilmiyorum.

  • Bütün bu mantık nereye gitmeli?
  • Bir sunucu / istemci senaryosunda durumu nasıl korumalıyım?

Not:

Bunu programlamak için Dart kullanıyorum ama cevapların Dart'a yazılmasını istemiyorum.


Herhangi birinin kodunuza bakması ve bir başlangıç ​​noktası olarak kullanması durumunda, sıralamalarda A veya 1'i seçmeniz gerektiğini, ancak her ikisini de içermediğinizi unutmayın.
Ben

Yanıtlar:


10

Burada klasik bir hata yapıyorsun. Birisi size bir kart oyunu için bir web uygulaması yapmanızı söyledi ve hepsini bir kerede nasıl yapacağınızı belirlemeye çalışıyorsunuz. Bu yaklaşım en iyi programcıları bile karıştırmaktadır, çünkü çalışmalar bir seferde yalnızca 7 adet bilgiyi aklınızda tutabileceğinizi göstermiştir. Daha fazla hokkabazlık yapmaya çalışmak yoğun konsantrasyon gerektirir ve bunu sürdürmeyi bekleyemezsiniz.

Aksine, kart oyununuzu oynamak için birisi kitaplığınızı arayacak gibi bir kart oyunu kitaplığı yazmaya odaklanmaya çalışın. Modelinize mükemmel bir başlangıç ​​yapmışsınız gibi görünüyor. Bu iyi, ancak Gamearayanların hamle yapmak için kullanabileceği arayüzü yapmanız gerekiyor .

Yani Oyun gibi birkaç yeni yöntem olacağını umuyordum:

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

Kısacası, oyunu çalıştırmak için bilmeniz gereken her şeyi, nesnenizi kullanarak yapabilirsiniz Game. Sadece buna sahip olduğunuzda 2. adıma geçersiniz.

Tek amacı gelen istekleri almak, uygulamak Gameve çıktıyı kullanıcıya geri göndermek olan ayrı bir sınıf yazın . GameÇıktıyı JSON'a dönüştürmek istiyorsanız Game, amacı dışında olmadığı için bunu dışarıda yaparsınız Game!

Bu bilgileri saklamak için, MongoDB'ye arabirim sağlayan başka bir sınıf oluşturabilirsiniz. Bu sınıf , bu sınıfın varlığını bilemez ve bu sınıfın varlığını Gameda Gamebilmez.

Kısacası, tek tek bileşenlere odaklanın ve iyi olacaksınız. Programınızı yazarken çok fazla yönü dikkate almaya çalıştığınızda yanlış gitmeye başlıyorsunuz. Bilge bir profesörün bana bir keresinde söylediği gibi, " Bir proje için yazdığınız ilk programın sonuna kadar yeniden yazılacağı gerçeğini bilin ve kucaklayın. "


Bir yana, bu sayı kişiye bağlı olarak 3 ila 9 arasındadır - Ne kadar uyarı olduğuma bağlı olarak 4 veya 5 yapabilirim. Her zamanki test, bir grup noktaya bakmak ve zihinsel olarak gruplandırmadan kaç tanesini bireysel olarak algılayabileceğinizi bulmaktır - 6'da, bunları otomatik olarak 3 + 3 olarak gruplamaya başlarım ve tekrar kolayca ayıramazım .
Izkata

@Izkata Bu ilginç. Bunun için bir test olduğunu bilmiyordum. Bağlantın var mı
Neil

1
en.wikipedia.org/wiki/… kaynak olduğuna inanıyorum.
AakashM

1

Bütün bu mantık nereye gitmeli?

GameSınıfınıza koyarak başlayın .

Bu sınırlı sayıda devlet ile kural tabanlı bir oyundur. Bunu bir devlet makinesi olarak modelleyecektim . Devlet deseni size gayet yardımcı olacaktır.

Sonunda bu FSM'yi ayrı sınıflara çıkarmak isteyeceksiniz, ancak şimdilik bunun için endişelenmeyin.

Bir sunucu / istemci senaryosunda durumu nasıl korumalıyım?

Kurulumunuz hakkında daha fazla bilgi sahibi olmadan cevap vermek imkansızdır. Oyun nesnenizi ve durumlarınızı veritabanına seri hale getirmek her dönüşte hile yapabilir.


Devlet / FSM üzerine eşlik eden bir parça, bu durumda oyunlara odaklanmış bir kitaptan: gameprogrammingpatterns.com/state.html
shmup
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.