2016-08-14 3 views
0

こんにちは私はasp.netで設計された私のウェブサイトにあるポーカーゲームに取り組んでいます。現時点では、私は種類が豊富で、洗い流され、王4人、王室の人が1人で、ペアになったときなど、多くのことが正しく働いています。コンピュータはそれらがいつヒットするかを知っている。私はそれがちょうど1組としてそれを数える2つのペアを持っているときに理解するためにそれを得ることに問題があります。私はいくつかの異なる方法を試みました。 はここ asp.net C#ポーカーゲーム

string[] PokerCard = new String[5]; 

      PokerCard[0] = PokerCard1.ImageUrl = Path.Combine("~/GameStyles/VideoPoker/Images/BackCards/BackCard1.png"); 
      PokerCard[1] = PokerCard2.ImageUrl = Path.Combine("~/GameStyles/VideoPoker/Images/BackCards/BackCard2.png"); 
      PokerCard[2] = PokerCard3.ImageUrl = Path.Combine("~/GameStyles/VideoPoker/Images/BackCards/BackCard3.png"); 
      PokerCard[3] = PokerCard4.ImageUrl = Path.Combine("~/GameStyles/VideoPoker/Images/BackCards/BackCard4.png"); 
      PokerCard[4] = PokerCard5.ImageUrl = Path.Combine("~/GameStyles/VideoPoker/Images/BackCards/BackCard5.png");  

    public void Pair() 
    { 
     for (int i = 0; i < 4; i++) 
     { 
      for (int k = 0; k < 5; k++) 
      { 
       if (PokerCard[k] == two[i]) 
       { 
        PokerTwo++; 
       } 
       if (PokerTwo == 2) 
       { 
        cash = cash + 10; 
        winnings = winnings + 10; 
        Cash.Text = Convert.ToString(cash); 
        Winnings.Text = Convert.ToString(winnings); 
        PairWin.BackColor = Color.Red; 
        Winner.Visible = true; 
        return; 
       } 
       if (PokerCard[k] == three[i]) 
       { 
        PokerThree++; 
       } 
       if (PokerThree == 2) 
       { 
        cash = cash + 10; 
        winnings = winnings + 10; 
        Cash.Text = Convert.ToString(cash); 
        Winnings.Text = Convert.ToString(winnings); 
        PairWin.BackColor = Color.Red; 
        Winner.Visible = true; 
        return; 
       } 
       if (PokerCard[k] == four[i]) 
       { 
        PokerFour++; 
       } 
       if (PokerFour == 2) 
       { 
        cash = cash + 10; 
        winnings = winnings + 10; 
        Cash.Text = Convert.ToString(cash); 
        Winnings.Text = Convert.ToString(winnings); 
        PairWin.BackColor = Color.Red; 
        Winner.Visible = true; 
        return; 
       } 
       if (PokerCard[k] == five[i]) 
       { 
        PokerFive++; 
       } 
       if (PokerFive == 2) 
       { 
        cash = cash + 10; 
        winnings = winnings + 10; 
        Cash.Text = Convert.ToString(cash); 
        Winnings.Text = Convert.ToString(winnings); 
        PairWin.BackColor = Color.Red; 
        Winner.Visible = true; 
        return; 
       } 
       if (PokerCard[k] == six[i]) 
       { 
        PokerSix++; 
       } 
       if (PokerSix == 2) 
       { 
        cash = cash + 10; 
        winnings = winnings + 10; 
        Cash.Text = Convert.ToString(cash); 
        Winnings.Text = Convert.ToString(winnings); 
        PairWin.BackColor = Color.Red; 
        Winner.Visible = true; 
        return; 
       } 
       if (PokerCard[k] == seven[i]) 
       { 
        PokerSeven++; 
       } 
       if (PokerSeven == 2) 
       { 
        cash = cash + 10; 
        winnings = winnings + 10; 
        Cash.Text = Convert.ToString(cash); 
        Winnings.Text = Convert.ToString(winnings); 
        PairWin.BackColor = Color.Red; 
        Winner.Visible = true; 
        return; 
       } 
       if (PokerCard[k] == eight[i]) 
       { 
        PokerEight++; 
       } 
       if (PokerEight == 2) 
       { 
        cash = cash + 10; 
        winnings = winnings + 10; 
        Cash.Text = Convert.ToString(cash); 
        Winnings.Text = Convert.ToString(winnings); 
        PairWin.BackColor = Color.Red; 
        Winner.Visible = true; 
        return; 
       } 
       if (PokerCard[k] == nine[i]) 
       { 
        PokerNine++; 
       } 
       if (PokerNine == 2) 
       { 
        cash = cash + 10; 
        winnings = winnings + 10; 
        Cash.Text = Convert.ToString(cash); 
        Winnings.Text = Convert.ToString(winnings); 
        PairWin.BackColor = Color.Red; 
        Winner.Visible = true; 
        return; 
       } 
       if (PokerCard[k] == ten[i]) 
       { 
        PokerTen++; 
       } 
       if (PokerTen == 2) 
       { 
        cash = cash + 10; 
        winnings = winnings + 10; 
        Cash.Text = Convert.ToString(cash); 
        Winnings.Text = Convert.ToString(winnings); 
        PairWin.BackColor = Color.Red; 
        Winner.Visible = true; 
        return; 
       } 
       if (PokerCard[k] == jack[i]) 
       { 
        PokerJack++; 
       } 
       if (PokerJack == 2) 
       { 
        cash = cash + 10; 
        winnings = winnings + 10; 
        Cash.Text = Convert.ToString(cash); 
        Winnings.Text = Convert.ToString(winnings); 
        PairWin.BackColor = Color.Red; 
        Winner.Visible = true; 
        return; 
       } 
       if (PokerCard[k] == queen[i]) 
       { 
        PokerQueen++; 
       } 
       if (PokerQueen == 2) 
       { 
        cash = cash + 10; 
        winnings = winnings + 10; 
        Cash.Text = Convert.ToString(cash); 
        Winnings.Text = Convert.ToString(winnings); 
        PairWin.BackColor = Color.Red; 
        Winner.Visible = true; 
        return; 
       } 
       if (PokerCard[k] == king[i]) 
       { 
        PokerKing++; 
       } 
       if (PokerKing == 2) 
       { 
        cash = cash + 10; 
        winnings = winnings + 10; 
        Cash.Text = Convert.ToString(cash); 
        Winnings.Text = Convert.ToString(winnings); 
        PairWin.BackColor = Color.Red; 
        Winner.Visible = true; 
        return; 
       } 
       if (PokerCard[k] == ace[i]) 
       { 
        PokerAce++; 
       } 
       if (PokerAce == 2) 
       { 
        cash = cash + 10; 
        winnings = winnings + 10; 
        Cash.Text = Convert.ToString(cash); 
        Winnings.Text = Convert.ToString(winnings); 
        PairWin.BackColor = Color.Red; 
        Winner.Visible = true; 
        return; 
       } 
      } 
     } 
    } 

はちょうどあなたがあなたのハードだけではなく1組で2ペアを持っている場合、それは理解して取得しようとしている私のコードのコピーです。ありがとうございました。

+0

無関係なコードがひどいので、私は読んでいませんでした。 [MCVE]の[Minimal]に注意してください。 –

+0

申し訳ありません、私はそれを少しきれいにしました、今読んで理解しやすくなるかもしれません。ありがとう –

+0

あなたの目的のためにおそらく必要ではないかもしれませんが、ここではパフォーマンスに有利なアプローチがあります:http://suffe.cool/poker/evaluator.html –

答えて

2

これは実際に正しいデータ構造を選択した例だと思います。あなたの質問から、PokerCardが何であるかはわかりませんが、多くのコードを書いているかのように見えます。データ構造を変更して少しLinqを使用すると、はるかに簡単な時間が得られます。あなたはこの方法であなたのカードを定義した場合例:

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

public enum Value 
{ 
    Ace, 
    Two, 
    Three, 
    Four, 
    Five, 
    Six, 
    Seven, 
    Eight, 
    Nine, 
    Ten, 
    Jack, 
    Queen, 
    King 
} 

public class Card 
{ 
    public Suit Suit { get; set; } 
    public Value Value { get; set; } 
} 

を、あなたはあなたの手は、任意のポーカーハンドの基準を満たしたかどうかを判断できるようになる次のようないくつかのコードを書くことができます。

public class Hand 
{ 
    public IEnumerable<Card> Cards {get;set;} 

    public bool Contains(Value val) 
    { 
     return Cards.Where(c => c.Value == val).Any(); 
    } 

    public bool IsPair 
    { 
     get 
     { 
      return Cards.GroupBy(h => h.Value) 
         .Where(g => g.Count() == 2) 
         .Count() == 1; 
     } 
    } 

    public bool IsTwoPair 
    { 
     get 
     { 
      return Cards.GroupBy(h => h.Value) 
         .Where(g => g.Count() == 2) 
         .Count() == 2; 
     } 
    } 

    public bool IsThreeOfAKind 
    { 
     get 
     { 
      return Cards.GroupBy(h => h.Value) 
         .Where(g => g.Count() == 3) 
         .Any(); 
     } 
    } 

    public bool IsFourOfAKind 
    { 
     get 
     { 
      return Cards.GroupBy(h => h.Value) 
         .Where(g => g.Count() == 4) 
         .Any(); 
     } 
    } 

    public bool IsFlush 
    { 
     get 
     { 
      return Cards.GroupBy(h => h.Suit).Count() == 1; 
     } 
    } 

    public bool IsFullHouse 
    { 
     get 
     { 
      return IsPair && IsThreeOfAKind; 
     } 
    } 

    public bool IsStraight 
    { 
     get 
     { 
      // If there is an Ace, we have to handle the 10,J,Q,K,A case, which isn't handled by the code 
      // below because Ace is normally 0 
      if (Contains(Value.Ace) && 
       Contains(Value.King) && 
       Contains(Value.Queen) && 
       Contains(Value.Jack) && 
       Contains(Value.Ten)) 
      { 
       return true; 
      } 

      var ordered = Cards.OrderBy(h => h.Value).ToArray(); 
      var straightStart = (int)ordered.First().Value; 
      for (var i = 1; i < ordered.Length; i++) 
      { 
       if ((int)ordered[i].Value != straightStart + i) 
        return false; 
      } 

      return true; 
     } 

    } 

    public bool IsStraightFlush 
    { 
     get 
     { 
      return IsStraight && IsFlush; 
     } 
    } 

    public bool IsRoyalStraightFlush 
    { 
     get 
     { 
      return IsStraight && IsFlush && Contains(Value.Ace) && Contains(Value.King); 
     } 
    } 
} 

public class Deck 
{ 
    public Deck() 
    { 
     var cards = new List<Card>(); 
     foreach (Suit suit in Enum.GetValues(typeof(Suit))) 
     { 
      foreach (Value value in Enum.GetValues(typeof(Value))) 
      { 
       cards.Add(new Card { Suit = suit, Value = value }); 
      } 
     } 
     _cards = cards; 

    } 

    List<Card> _cards; 
    public List<Card> Cards { get {return _cards;}} 

    public Hand DealStandardHand() 
    { 
     return new Hand { Cards = Cards.Take(5)}; 
    } 

    private static Random rng = new Random(); 
    public void Shuffle() 
    { 
     int n = Cards.Count; 
     while (n > 1) 
     { 
      n--; 
      int k = rng.Next(n + 1); 
      Card value = Cards[k]; 
      Cards[k] = Cards[n]; 
      Cards[n] = value; 
     } 
    } 
} 

私はすべてまとめて、dotnetfiddleを作成しました。明らかに、これをあなたが取り組んでいるアプリケーションに統合する作業がいくつかありますが、これはあなたの道に沿っています。

+0

誰でもdownvotedがちょうど理由を説明してくれれば幸いです。私は間違っていることは気にしないが、なぜ役立たないのか分からない。ありがとう。 – Bert

+1

linqを活用した簡単なアプローチ。私は個人的には、拡張メソッドを書くのではなく、 "IEnumerable Cards"プロパティを持つ "Hand"クラスを作るでしょう。 – Sam

+0

私はPokerCardが何であるかを伝えるために上記のコードを編集しました。基本的には、フォルダから自分のカードをランダムに呼び出す文字列です。私がこれをやったやり方が最良のアプローチかどうかは分かりませんが、それがもっと難しくなるかもしれないようです。ありがとうございます。 –