2016-08-09 7 views
-2

Предположим, я пытаюсь имитировать игру со стандартными игральными картами.Создание всех возможных игральных карт (колода)

У меня есть что-то вроде этого:

class Face { 
    Set<Character> Faces = new HashSet<Character>(
     Arrays.asList('2','3','4','5','6','7','8','9','T','J', 'Q', 'K', 'A') 
); 
} 

и что-то вроде этого:

public enum Suit { HEART, DIAMONDS, SPADES, CLUBS }

Как создать коллекцию, например, набор или связанный список, объекты, сбор лучше всего подходит для этого, и какой тип объекта должен иметь каждая пара в коллекции.

+2

лучший appoach бы класс «карта» с двумя членами: лицо и костюм –

+0

@progressive_overload Да, но как бы я произвожу коллекцию из 52 объектов карты, охватывающие все возможные перестановки? – GFauxPas

+0

две петли: внешний для костюма, внутренний для лица .. дает вам 52 карточных объекта. поместите их в список или набор в зависимости от того, имеет ли порядок порядок. –

ответ

0

Как прокомментировал @Progressive_overload, это, вероятно, лучший подход.

Card Class:

enum Suit {HEART, DIAMONDS, SPADES, CLUBS} 
enum Rank {TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE} 
class Card { 
    public Rank rank; 
    public Suit suit; 

    public Card (Rank r, Suit s) { 
    rank = r; suit = s; 
    } 
} 

Генерация:

List<Card> deck = new ArrayList<Card>(); 

for (Suit s : Suit.values()) { 
    for (Rank r : Rank.values()) { 
    deck.add(new Card(r, s)); 
    } 
} 
+0

Да, но как бы я создал коллекцию из 52 карточных объектов, охватывающих все возможные перестановки? – GFauxPas

+0

@GFauxPas нравится? – Olian04

+0

Это недопустимо java –

-1

Я полагаю, что упорядоченная пара (а, б) вы имеете в виду, что a.face < = b.face и что вы не» t хотите пары с двумя разными картами. Вам просто нужен вложенный цикл, в котором вы выполняете итерацию по всем значениям, где это условие истинно, и добавьте их в список (чтобы вы сохранили значение порядка сортировки для каждой пары первой карты, а также для упрощения проверки).

import java.util.ArrayList; 
import java.util.List; 

public class CardPairs 
{ 

    static char[] faces = {'2','3','4','5','6','7','8','9','T','J', 'Q', 'K', 'A'}; 
    static enum Suit { HEART, DIAMONDS, SPADES, CLUBS }; 

    static class Card 
    { 
     final char face; 
     final Suit suit; 

     public Card(char face, Suit suit) {this.face=face;this.suit=suit;} 
     @Override public String toString() {return face+" "+suit;} 
    } 

    static public class CardPair 
    { 
     final Card first; 
     final Card second; 

     public CardPair(Card first, Card second) {this.first=first;this.second=second;} 
     @Override public String toString() {return "("+first+", "+second+")";} 
    } 

    public static void main(String args[]) 
    { 
     List<CardPair> allPairs = new ArrayList<CardPair>(); 
     for(int i=0;i<faces.length;i++) 
      for(int j=i;j<faces.length;j++) 
       for(Suit suit1: Suit.values()) 
        for(Suit suit2: Suit.values()) 
        { 
         { 
          if(suit1!=suit2||i!=j) // assuming you don't want pairs of the same card 
          { 
          allPairs.add(new CardPair(new Card(faces[i],suit1),new Card(faces[j],suit2))); 
          } 
         } 
        } 
     System.out.println(allPairs); 
    } 
} 
+1

Thats так много вложенных петель. – Enzokie

+0

Это самое странное понижение, которое я когда-либо получал :-) Количество вложенных циклов присуще этой проблеме. –

+0

не уменьшилось ... но почему 4 петли? 2 будет достаточно –

1

Это хороший образец, чтобы сделать enum костюмов, enum рангов, а затем через петлю enum#values.

Olien04 имеет suggested a similar approach, но его код не скомпилирован. По этой причине я добавил этот ответ на основе его, с конструктором и методом toString.

enum Suit {HEART, DIAMONDS, SPADES, CLUBS} 
enum Rank {TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE} 

public class Card { 
    Rank rank; 
    Suit suit; 
    public Card (Rank r, Suit s) {rank = r; suit = s;} //public constructor 
    @Override 
    public String toString() { 
     return rank.toString() + " " + suit.toString(); 
    } 
} 

ArrayList<Card> deck = new ArrayList<>(); 
for (Suit s : Suit.values()) { 
    for (Rank r : Rank.values()) { 
     deck.add(new Card(r, s)); 
    } 
} 
System.out.println(deck.toString()); 
+0

У меня это было в уме! +1 –

+1

Спасибо, я только что сделал покер для своего студенческого проекта :) – xenteros

+0

Но это всего лишь список * карт *, вопрос задает * пары * карт. –

Смежные вопросы