2013-05-15 6 views
0

내 디자인은 사용자에게 "손"을 보여주기 위해 26 개의 그림 상자 (코드가 10 개까지만 표시됨)를 사용하는 것입니다. 이제 이미지 상자에서 복식을 확인한 다음 그 복식을 지워진 더미로 제거하는 방법은 무엇입니까? 그러니까 2 개의 잭이 있고 3 개의 파이브가 있다면 2 개의 잭이 제거되고 2 개의 파이브 만 제거된다고합시다. 나는 이것을하는 방법을 이해할 수 없다. 내가 그들을 설정하고 다음과 같이 아래 내 코드에서 이름을 지정한 다음은 카드 일치 게임 .. 카드를 비교하는 방법?

Dim faces() As String = {"Ace", "Two", "Three", "Four", "Five", 
     "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King"} 

내 코드뿐만 아니라 컴퓨터 플레이어가있을 것입니다하지만 이것은 단지 플레이어 하나 정말이다.

Deckofcards는

Public Class DeckOfCards 
    Private Const NUMBER_OF_CARDS As Integer = 52 ' number of cards 
    Private deck(NUMBER_OF_CARDS - 1) As Card ' array of Card objects 
    Private currentCard As Integer ' index of next Card to be dealt 
    Private Shared randomNumbers As New Random() ' random number generator 

    ' constructor fills deck of Cards 
    Public Sub New() 
     Dim faces() As String = {"Ace", "Two", "Three", "Four", "Five", 
     "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King"} 
     Dim suits() As String = {"Hearts", "Diamonds", "Clubs", "Spades"} 
     currentCard = 0 ' set currentCard so first Card dealt is deck(0) 


     ' populate deck array with Card objects 
     For count = 0 To deck.GetUpperBound(0) 
     deck(count) = New Card(faces(count Mod 13), suits(count \ 13)) 
     Next 
    End Sub ' New 

    ' shuffle deck of Cards with simple one-pass algorithm 
    Public Sub Shuffle() 
     ' after shuffling, dealing should start at deck(0) again 
     currentCard = 0 ' reinitialize currentCard 

     ' for each Card, pick another random Card and swap them 
     For first = 0 To deck.GetUpperBound(0) 
     ' select a random number between 0 and 51 
     Dim second As Integer = randomNumbers.Next(NUMBER_OF_CARDS) 

     ' swap current Card with randomly selected Card 
     Dim temp As Card = deck(first) ' store copy of deck(first) 
     deck(first) = deck(second) ' move deck(second) to deck(first) 
     deck(second) = temp ' move original deck(first) to deck(second) 
     Next 
    End Sub ' Shuffle 

    ' deal one Card 
    Public Function DealCard() As Card 
     ' determine whether Cards remain to be dealt 
     If currentCard <= deck.GetUpperBound(0) Then 
     Dim lastCard As Integer = currentCard ' store current card number 
     currentCard += 1 ' increment current card number 
     Return deck(lastCard) 
     Else 
     Return Nothing ' no more cards to deal 
     End If 



    End Function ' DealCard 


End Class 

답변

3

난 당신이 잘못된 방향으로 이것에 대해 갈 생각합니다.

Public Class Card 

    Public Enum CardValue 
     Ace = 1 
     Two = 2 
     'etc 
     Jack = 11 
     Queen = 12 
     King = 13 
    End Enum 

    Public Enum CardSuit 
     Clubs 
     Spades 
     Hearts 
     Diamonds 
    End Enum 

    Public Property Value As CardValue 
    Public Property Suit as CardSuit 

    Public sub New(value as CardValue, suit as CardSuit) 
     Me.Value = value 
     Me.Suit = suit 
    End Sub 

End Class 

다음은 각 놀이는 간단 List(Of Card)있을 것

: 당신이 더 어려워을 비교하게 문자열로 값을 할당하기 때문에 즉, 귀하의 설계가 잘못

나는이처럼 보이는 Card 클래스가 추천 그들의 손에. 당신은 생성하고 다음과 같이 카드 덱을 채울 수 있습니다

Dim Cards as List(Of Card) 'Players hand 

If Cards.Select(Function(x) x.Value).Distinct.Count < Cards.Count Then 
    'there are some duplicates in the list 
    Dim duplicates = Cards.GroupBy(Function(x) x.Value).Where(Function(g) g.Count > 1).Select(Function(g) g.Key).ToList 
    For Each i In duplicates 
     Debug.WriteLine("Card value " + i.ToString + " is a match") 
    Next 
End If 

: 같은과 같이 간단하다있는 것을 비교하려면

Dim deck(51) As Card 
Dim cardPosition As Integer = 0 

'loop through each suit and each value in that suit setting one of the deck to that  
For Each suit As Card.CardSuit In [Enum].GetValues(GetType(Card.CardSuit)) 
    For Each value As Card.CardValue In [Enum].GetValues(GetType(Card.CardValue)) 
     deck(cardPosition) = New Card(value, suit) 
     cardPosition += 1 
    Next 
Next 
+0

당신은 당신의 루프보다 효율적으로 만들 수있는 (그리고'경우 제거 ')를'i + 1'에서'i' (''Cards.Count-2'')로 바꾸면 ...''string'' 또는'int'에서'enum'에 대한 변경이 분명히 좋은 코드이지만, 문제와의 큰 차이! –

+0

@dan - 동의 - 좀 더 효율적일 수 linq 쿼리에 대한 수정했습니다 –

+0

@MattWilko 도움을 주셔서 감사합니다,하지만 카드 클래스를 교체하여 오류가 발생했습니다 "오류 옵션 엄격한 암시 적 변환을 허용하지 않습니다 'String'에서 'DeckOfCardsTest.Card.CardValue'로 변경하십시오. " 및 " 옵션을 엄격하게 설정하면 '문자열'에서 'DeckOfCardsTest.Card.CardSuit'로 암시 적 변환을 할 수 없습니다." 이 코드 부분에 카드 객체가있는 데크 어레이를 채 웁니다. count = 0의 경우 deck.GetUpperBound (0) 데크 (계수) = 새 카드 (면 수 (Mod 13), 수트 (count \ 13)) 다음 – user2382959