순위를 나타내는 데 하나의 열거 형을 사용하고 수트를 나타내는 또 다른 열거 형을 사용합니다.
그런 다음 이렇게 같은 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
클래스를 만들어 카드와 카드 한 벌을 시뮬레이션하고 데크를 임의로 뒤섞는 것과 같은 작업을 쉽게 수행 할 수 있습니다. 이를 수행하는 방법은이 질문과 대답의 범위를 벗어납니다.
양복과 수에 대해 두 가지 열거 형을 사용하는 것을 고려하십시오. – 4444
@Doc :'Enum'은'Enumerable' 정적 클래스 또는 IEnumerable 인터페이스와 완전히 관련이 없습니다. –
SLaks
@SLaks 아, 몇 년 동안 C# 그리고 절대로 몰랐다. 당신이 그것을 지적 했다니 다행, 나는 내 인생을 재고해야합니다. – 4444