2016-03-21 18 views
0

Ben "onbir" kart oyunu basit versiyonunu kodlu ve aşağıdaki kriterlere göre bazı değişiklikler yapmak istiyorum:"Elevens" kart oyunu farklı bir kriter kümesine uyacak şekilde nasıl değiştirilir?

  1. Eğer 11
  2. kadar eklemek istediğiniz kadar çok kartlarını kullanabilirsiniz
  3. Kulüplere ve maça takımlarına sahip kartlar negatif değerlere değer. İşte

Normal onbir oyun için var kodu - bu seçilen kartların Listedeki bir 11-çifti için kontrol eder: selectedCards endeksler tümünü içeren

private boolean containsPairSum11(List<Integer> selectedCards) 
{ 
    for (int sk1 = 0; sk1 < selectedCards.size(); sk1++) 
    { 
     int k1 = selectedCards.get(sk1).intValue(); 

     for (int sk2 = sk1 + 1; sk2 < selectedCards.size(); sk2++) 
     { 
      int k2 = selectedCards.get(sk2).intValue(); 

      if (cardsAt(k1).pointValue() + cardsAt(k2).pointValue() == 11) 
       return true; 
     } 
    } 

    return false; 
} 

listesinde Seçilen kartların, ilgili Kart nesnesini döndürecek olan cardAt() yöntemine geçirilebilmesi için. Yukarıda belirtilen kriterlere ulaşmak için algoritmayı bulmakta gerçekten zorlanıyorum ve konuyla ilgili her türlü yardımı gerçekten takdir ediyorum.

Çok teşekkürler!

cevap

1

Henüz hiç takım elbise için bir hesap vermediniz.

public enum Suit { 
    CLUBS, HEARTS, DIAMONDS, SPADES; 

    public int getCardValue(int face) { 
     switch (this) { 
      case CLUBS: 
      case SPADES: 
       return -face; 
      case HEARTS: 
      case DIAMONDS: 
       return +face; 
     } 
    } 
} 

public class Card { 
    private final Suit suit; 
    private final int face; 

    public int getValue() { 
     return suit.getCardValue(face); 
    } 
} 

public class Hand { 
    private final List<Card> cards; 

    public Stream<List<Card>> getCombinationsThatEqualTotal(int total) { 
     return streamCombinations() 
      .filter(c -> matchesTotal(c, total)); 
    } 

    private Stream<List<Card>> streamCombinations() { 
     ... 
    } 

    private boolean matchesTotal(List<Card> cards, int total) { 
     return cards.stream().mapToInt(Card::getValue).sum() == total; 
    } 
} 

Sana kriterlerini karşılamak için bir algoritma sorulduğunda çünkü kombinasyonları üretme işini yapmadım: Burada potansiyel bir model. SO'yu bir listeden tüm kombinasyonları oluşturmanın verimli yolları hakkında iyi cevaplar vardır.

List<Card> largestCombo = hand.getCombinationsThatEqualTotal(11) 
    .max(Comparator.comparingInt(List::size)) 
    .orElse(Collections.EMPTY_LIST); 
:

bir dere dönen combo nesil avantajı daha sonra filtre, sıralama vb Örneğin, ölçütlerini karşılayan büyük kombinasyonunu elde etmek olmasıdır

İlgili konular