2013-06-12 2 views
-1

나는 블랙 잭 게임을 만들고있다. 내 데크에 특정 가치가 포함되어 있는지 확인해야합니다.값이 배열 또는 클래스에 포함되어 있는지 어떻게 알 수 있습니까?

내 갑판을 확인하는 가장 쉬운 방법은 무엇입니까? 가장 쉬운 코드 줄과 혼란을 덜어줍니다. 참고이 값들은 관련 문자열을 제공 할 것입니다. (킹, 잭, 퀸, 10은 10이됩니다.)

이것은 슈트 나 색상과 관련이 없습니다. 나는 단지 카드 기호 (K, Q)를 보여줄 것입니다.

  enum deck {Ace=1|11, Two=2, Three=3, Four=4, Five=5, Six=6, Seven=7, Eight=8, Nine=9, Ten=10, Jack=10, Queen=10, King=10}; 

     int a = (int)deck.Ace; 
     int b = (int)deck.Two; 
     int c = (int)deck.Three; 
     int d = (int)deck.Four; 
     int e = (int)deck.Five; 
     int f = (int)deck.Six; 
     int g = (int)deck.Seven; 
     int h = (int)deck.Eight; 
     int i = (int)deck.Nine; 
     int j = (int)deck.Ten; 
     int k = (int)deck.Jack; 
     int l = (int)deck.Queen; 
     int m = (int)deck.King; 
+0

양복과 수에 대해 두 가지 열거 형을 사용하는 것을 고려하십시오. – 4444

+0

@Doc :'Enum'은'Enumerable' 정적 클래스 또는 IEnumerable 인터페이스와 완전히 관련이 없습니다. – SLaks

+0

@SLaks 아, 몇 년 동안 C# 그리고 절대로 몰랐다. 당신이 그것을 지적 했다니 다행, 나는 내 인생을 재고해야합니다. – 4444

답변

0

사용 enums :

public enum Value 
{ 
    V2, 
    V3, 
    //... 
    V10, 
    J, 
    Q, 
    K, 
    A 
} 
public enum Suit 
{ 
    Diamonds, 
    Spades, 
    Hearts, 
    Clubs 
} 

public static bool ContainsCard(IEnumerable<Tuple<Suit,Value>> deck, Suit suit, Value value) 
{ 
    return deck.Any(c => c.Item1 == suit && c.Item2 == value); 
} 
0

이 문제에 대해 갈 허용 많은 방법이있다. 내가 시도 할 수있는 한 가지 방법은 enum의 두 가지 유형을 만들고 각 카드에 할당하는 것입니다. 예를 들어,

이 두 가지 유형이 생성되면 모든 카드에 대해 위의 각 유형 중 하나를 선언 할 수 있습니다. 이 시점에서 카드는 원하는 시스템 (예 : 배열 또는 목록)에 쉽게 저장할 수 있습니다.

+0

이것은 데이터 구조를 검색하는 방법을 보여주지 않고, '카드'를 나타내는 방법을 보여줍니다. 그것은 [다른 질문] (http://stackoverflow.com/questions/17052091/array-for-blackjack-cards-strings-or-integers)입니다. – Servy

+0

숫자 리터럴은 열거 형 멤버 식별자로 사용할 수 없습니다. – pascalhein

2

순위를 나타내는 데 하나의 열거 형을 사용하고 수트를 나타내는 또 다른 열거 형을 사용합니다.

그런 다음 이렇게 같은 Card 클래스의 사람들을 캡슐화 :

public enum Suit 
{ 
    Clubs, 
    Diamonds, 
    Hearts, 
    Spades 
} 

public enum Rank 
{ 
    Ace = 1, 
    One, 
    Two, 
    Three, 
    Four, 
    Five, 
    Six, 
    Seven, 
    Eight, 
    Nine, 
    Ten, 
    Jack, 
    Queen, 
    King 
} 

public class Card: IEquatable<Card> 
{ 
    public Rank Rank 
    { 
     get; 
     set; 
    } 

    public Suit Suit 
    { 
     get; 
     set; 
    } 

    public int Value 
    { 
     get 
     { 
      switch (Rank) 
      { 
       case Rank.Ten: 
       case Rank.Jack: 
       case Rank.Queen: 
       case Rank.King: 

        return 10; 

       default: 

        return (int) Rank; 
      } 
     } 
    } 
} 

여기서 중요한 점은 IEquatable 인터페이스의 일부입니다 Equals() 방법이다. 이를 구현하면 List.Contains()과 같은 검색 방법을 활용할 수 있습니다. 위의 코드와

, 당신은 다음과 같이 물건을 작성할 수 있습니다 갑판 특정 카드를 포함하는 경우 우리가 deck.Contains(target)을 사용하는 방법을

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

deck.Add(new Card {Rank = Rank.Seven, Suit = Suit.Clubs}); 
deck.Add(new Card {Rank = Rank.Five, Suit = Suit.Diamonds}); 

Card target1 = new Card {Rank = Rank.Five, Suit = Suit.Diamonds }; 
Card target2 = new Card {Rank = Rank.Eight, Suit = Suit.Hearts }; 

Console.WriteLine(deck.Contains(target1)); // Prints true 
Console.WriteLine(deck.Contains(target2)); // Prints false 

Console.WriteLine(deck.IndexOf(target1)); // Prints 1 

주보고.

또한 IndexOf(target)을 사용하여 카드가있는 위치를 정확하게 찾을 수 있습니다.

카드의 Value 속성을 어떻게 구현했는지 유의하십시오.

이 값은 카드 순위에서 가져올 수 있으므로 명시 적으로 저장할 필요가 없습니다.

Ten, jack, Queen 및 King에 대해 명시적인 값을 반환하는 방법을 참조하십시오. 다른 값의 경우 순위에 대한 열거 형 값은 에이스에 대해 1, 2에 대해 2 등으로 시작한다는 사실을 이용합니다. 이것은 단순히 enum을 int로 캐스팅하여 올바른 값을 얻을 수 있음을 의미합니다.

Deck 클래스와 Hand 클래스를 만들어 카드와 카드 한 벌을 시뮬레이션하고 데크를 임의로 뒤섞는 것과 같은 작업을 쉽게 수행 할 수 있습니다. 이를 수행하는 방법은이 질문과 대답의 범위를 벗어납니다.

+0

그리고 이것이 내 질문을 편집해서는 안되며, 여기에서 두 번째 코드 상자는 너무 혼란스럽고 관련없는 소송을 포함합니다. 하지만 시도해 줘서 고마워. –

+4

@ Mr.Bottell "내 질문을 편집해서는 안되니?" 나는 당신의 질문을 편집하지 않았다! 어쨌든, 당신이 이것을 너무 혼란스럽고 기본적인 것들을 배울 준비가되어 있지 않다면, 당신은 블랙 잭 게임을 쓸 희망이 없을 것입니다; 나는 당신이 가고 대신에 덜 세금이 드는 것을 제안한다. –

+0

죄송합니다. 서비스에 대한 것이 었습니다. –

관련 문제