2016-08-05 16 views
0

私のクラスプログラミングプロジェクトでは、数字と文字を入力してカード番号とスーツを指定できるプログラムを作成します(たとえば、Diamondsの2とD = 2)。VBポーカーハンドエバリュエーター

これは、それがどのように見えるかです: Poker

これは私がこれまで持っているコードです:

Public Class frmPoker 
    Private Sub btnDisplay_Click(sender As Object, e As EventArgs) Handles btnDisplay.Click 
     Dim cards(4) As Integer 
     Dim suit(4) As String 

     cards(0) = CInt(txtCard1.Text) 
     cards(1) = CInt(txtCard2.Text) 
     cards(2) = CInt(txtCard3.Text) 
     cards(3) = CInt(txtCard4.Text) 
     cards(4) = CInt(txtCard5.Text) 

     Dim card = From item In cards 
        Select item 
        Distinct 

     If card.Count = 4 Then 
      txtDisplay.Text = "One Pair" 
     ElseIf card.Count = 3 Then 
      txtDisplay.Text = "Three of a kind" 
     ElseIf card.Count = 2 Then 
      txtDisplay.Text = "Four of a kind" 
     End If 

     suit(0) = txtSuit1.Text 
     suit(1) = txtSuit2.Text 
     suit(2) = txtSuit3.Text 
     suit(3) = txtSuit4.Text 
     suit(4) = txtSuit5.Text 

     Dim suits = From item In suit 
        Select item 
        Distinct 

     If suits.Count = 1 Then 
      txtDisplay.Text = "Flush" 
     End If 

私は満員とストレートフラッシュを決定するアプローチするかどうかはわかりません。また、例えば2つの2つと2つの3つがある場合、プログラムは実際には3つの種類のものであると判断する。

+1

[これは興味深いかもしれません](http://stackoverflow.com/a/38129686/1070452)。キーは高値から低値まで評価され、FullHouseは旅行やペアとして見えません。 – Plutonix

+0

私はそのコードのいくつかを、あなたがどこかでニックネームを入れて、イントロクラスで覆われたものではないと思っていますか? – Plutonix

+0

クラスからです。本は簡単にLINQに行きます。残念ながら、少なくとも(私にとっては)事を説明する良い仕事をしません。 – Bubblebeard

答えて

1

理解しにくいコードを使用しないでください。例:

Dim card = From item In cards 
      Select item 
      Distinct 

これは、あなたの手札の中に異なるカードを教えてくれるが、それぞれのカードの数は分からない。手{2, 2, 3, 2, 3}{9, 10, 9, 9, 9}と同じ結果を返します。実際には旅行の結果{3, 3, 3, 2, 7}は2ペア{3, 3, 2, 2, 7}と同じになります。あなたが欲しいものについて十分な情報がありません。ここで

は、代替(:起動に5枚のカードの手を想定し、エースこんにちは注意してください):で終わり

' dont use 0th; Ace=1 and 14 
Dim counts(15) As Int32 
' count how many of each rank: 
For Each n As Int32 In cards 
    counts(n) += 1  
Next 

、それぞれの要素がありますどのように多くの各ランクのことを教えてくれます。例えば、count(2)は、値3を保持して、3つのデュースがあることを示すことができます。次に、評価するために配列を繰り返します。

Dim pairs As Int32 = 0 
Dim trips As Int32 = 0 
Dim quads As Int32 = 0 
' count them: 
For Each n As Int32 In counts 
    If n = 2 Then pairs += 1 
    If n = 3 Then trips += 1 
    If n = 4 Then quads += 1 
Next 
Dim Aced = counts(14) > 0 

これは多くの手をカバーしています。また、エースがあるかどうかを知る必要があるので、後でホイール({A、2、3、4、5})をテストできます。フラッシュがこれだけフラグを設定し、2ヶ所に遊びに来て:あなたは順不同セットの順序を確認する必要があるため

Dim Flushed = Suits(0) = Suits(1) AndAlso 
       Suits(0) = Suits(2) AndAlso 
       Suits(0) = Suits(3) AndAlso 
       Suits(0) = Suits(4) 

ストレートがする困難です。最初に、そのシーケンスが製造されたシーケンスと一致するかどうかを確認するためにそれを入れてください。いくつかの研究をあなたに任せておく必要がありますが、Enumerableは比較範囲を作成します。 Array.Intersectまたは.SequenceEqualを使用してテストするか、Flushedのコードのようにしてください。場合

ストレートとフラッシュのテストをスキップすることができます(ペア+旅行+クワッド> 0)が、彼らは非常にシンプルで、ちょうど手のためのすべてのメトリックを収集し、エンド作る時にIf一連のテストを行っていますコードをデバッグするのが簡単です。

エースで乱雑です。エースがある場合は、ホイールをチェックする必要があります。コピー回数(14)をカウント(1)に設定し、カウント(14)をゼロに設定する必要があります。次にシーケンスをソートして確認してください。その後、高水準から低位の順にこれらの変数を評価するだけです。これらの演習は学生のために残されています。