2014年4月4日 星期五

[Code Review]Team 07- Hw05









https://docs.google.com/file/d/0B2FJv3SX2Yc7ek9lZmhXR0I3NG8/edit
namespace Homework5
{
      class CardDeck
        {
            public PokerCard[] Cards = new PokerCard[52];
            public PokerCard[] Player1 = new PokerCard[5];
            public PokerCard[] Player2 = new PokerCard[5];
            int num = 0;
          //===============================================
            public void CreateDeck()
            {
                for (int i = 0; i < 52; i++)
                {
                    Cards[i] = new PokerCard();
                }
                for (int i = 0; i < 5; i++)
                {
                    Player1[i] = new PokerCard();
                    Player2[i] = new PokerCard();
                }
            }
          //===============================================
            public void ResetDeck()
            {
                for (int i = 0; i < 52; i++)
                {
                    Cards[i].Suit = i / 13;
                    Cards[i].Rank = i % 13 + 1;
                }
            }
            //===============================================
            public void Shuffle()
            {
                PokerCard temp;
                Random rand = new Random();
                int RanNum;
                for (int i = 0; i < 52; i++)
                {
                    RanNum = rand.Next(52);
                    temp = Cards[i];
                    Cards[i] = Cards[RanNum];
                    Cards[RanNum] = temp;
                }
            }
            //===============================================
            public void PokerDeck()
            {
                for (int i = 0; i < 5; i++)
                {
                    Player1[i] = Cards[2*i];//第1.3.5.7張給玩家1
                    Player2[i] = Cards[2*i+1];//第2.4.6.8.10給玩家2
                }

            }
            //===============================================
            public void BubbleSort(PokerCard[] deck)
            {
                PokerCard temp;
                for (int pass = 1; pass < 5; pass++)
                {
                    for (int i = 0; i < 5 - pass; i++)
                    {
                        if (deck[i].Rank > deck[i + 1].Rank)
                        {
                            temp = deck[i];
                            deck[i] = deck[i + 1];
                            deck[i + 1] = temp;
                        }
                        if (deck[i].Rank == deck[i + 1].Rank)
                        {
                            if (deck[i].Suit > deck[i + 1].Suit)
                            {
                                temp = deck[i];
                                deck[i] = deck[i + 1];
                                deck[i + 1] = temp;
                            }
                        }
                    }
                }
            }
            //===============================================
            public int IS(PokerCard[] deck)
            {
                if (IsStraightFlush(deck))
                    num = 8;
                else if (IsFourofKind(deck))
                    num = 7;
                else if (IsFullhouse(deck))
                    num = 6;
                else if (IsFlush(deck))
                    num = 5;
                else if (IsStraight(deck))
                    num = 4;
                else if (IsThreeofakind(deck))
                    num = 3;
                else if (IsTwoPairs(deck))
                    num = 2;
                else if (IsOnePair(deck))
                    num = 1;
                else
                {
                    num = 0;
                }
                return num;
            }
            //===============================================
            public string CompareRandS(PokerCard[] deck)
            {
                string word="";
                if (IsStraightFlush(deck))
                {
                    if (Player1[0].Rank > Player2[0].Rank)
                    {
                        word= "甲";
                    }
                    return "乙";
                }
                return word;
            }
            //===============================================
            public bool IsStraightFlush(PokerCard[] deck)
            {
                if (IsFlush(deck) && IsStraight(deck))
                    return true;
                return false;
            }
          //=============================================================
            public bool IsFourofKind(PokerCard[] deck)//鐵支
            {
                if (((deck[0].Rank == deck[3].Rank) && (deck[0].Rank != deck[4].Rank)) || ((deck[1].Rank == deck[4].Rank) && (deck[0].Rank != deck[4].Rank)))
                {
                    return true;
                }
                return false;
            }
            //===============================================
            public bool IsFullhouse(PokerCard[] deck)//判斷是否為葫蘆
            {
                if (((deck[0].Rank == deck[2].Rank) && (deck[3].Rank == deck[4].Rank)) || ((deck[0].Rank == deck[1].Rank) && (deck[2].Rank == deck[4].Rank)))
                {
                    return true;
                }
                return false;
            }
            //===============================================
            public bool IsFlush(PokerCard[] deck)
            {
                for (int i = 0; i < 4; i++)//判斷是否為同花
                {
                    if (deck[i].Suit != deck[i + 1].Suit)
                        return false;
                }
                return true;
            }
            //===============================================
            public bool IsStraight(PokerCard[] deck)//判斷是否為順子
            {
                if (deck[0].Rank == 1 && deck[4].Rank == 13)
                {
                    deck[0].Rank += 8;
                    for (int i = 0; i < 4; i++)
                    {
                        if ((deck[i].Rank + 1) != deck[i + 1].Rank)
                        {
                            deck[0].Rank -= 8;
                            return false;
                        }
                    }
                    deck[0].Rank -= 8;
                    return true;
                }
                else
                {
                    for (int i = 0; i < 4; i++)
                    {
                        if (deck[i].Rank + 1 != deck[i + 1].Rank)
                            return false;
                    }
                    return true;
                }
            }
            //===============================================
            public bool IsThreeofakind(PokerCard[] deck)//三條
            {

                if ((deck[0].Rank == deck[2].Rank) || (deck[1].Rank == deck[3].Rank) || (deck[2].Rank == deck[4].Rank))
                {
                    return true;
                }
                return false;
            }
            //===============================================
            public int IsPair(PokerCard[] deck)
            {
                int count = 0;
                for (int i = 0; i < 4; i++)
                {
                    if (deck[i].Rank == deck[i + 1].Rank)
                    {
                        count++;                                               
                    }                    
                }
                return count;
                }
            //===============================================
            public bool IsTwoPairs(PokerCard[] deck)
            {

                if (IsPair(deck) == 2)
                {
                    return true;
                }
                return false;
            }
            //===============================================
            public bool IsOnePair(PokerCard[] deck)
            {
                if (IsPair(deck) == 1)
                    return true;
                return false;
            }
        }
    }
namespace Homework5
{
    public partial class Form1 : Form
    {
        CardDeck C = new CardDeck();
        float StraightFlushNum, FourofKindNum, FullhouseNum, FlushNum, StraightNum, ThreeofakindNum, TwoPairsNum, OnePairNum, NonNum, Percent = 0;
        int N = 50000000;
        public Form1()
        {
            InitializeComponent();
            C.CreateDeck();
            C.ResetDeck();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            
            if (rbtn1.Checked == true)
            {
                C.Shuffle();
                C.PokerDeck();
                C.BubbleSort(C.Player1);
                C.BubbleSort(C.Player2);
                CompareRankSuit();
                MessageBox.Show(PrintPoker(C));
                TxtB.Clear();
            }
            if (rbtn2.Checked == true)
            {
                C.PokerDeck();
                Probability();
            }
        }
        private void CompareRankSuit()
        {
            TxtB.AppendText("甲:" + TXT(C.IS(C.Player1)) + '\n');
            TxtB.AppendText("乙:" + TXT(C.IS(C.Player2)) + '\n');
            if (C.IS(C.Player1) > C.IS(C.Player2))
            {
                TxtB.AppendText("甲方獲勝!");
            }
            else if (C.IS(C.Player2) > C.IS(C.Player1))
            {
                TxtB.AppendText("乙方獲勝!");
            }
            else if (C.IS(C.Player1) == C.IS(C.Player2))
            {
                TxtB.AppendText("無法分出勝負!");
            }
        }
        private string TXT(int num)
        {
            string a="";
            switch (num)
            {
                case 8:
                    a += "同花順";
                    break;
                case 7:
                    a += "四條";
                    break;
                case 6:
                    a += "葫蘆";
                    break;
                case 5:
                    a += "同花";
                    break;
                case 4:
                    a += "順子";
                    break;
                case 3:
                    a += "三條";
                    break;
                case 2:
                    a += "兩對";
                    break;
                case 1:
                    a += "一對";
                    break;
                case 0:
                    a += "無對";
                    break;
            }
            return a;
        }
        private void Probability()
        {
            float SUM = 0;
            int Percent_int = 0;
            for (int z = 0; z < N; z++)
            {                
                C.Shuffle();
                C.PokerDeck();
                C.BubbleSort(C.Player1);
                if (C.IS(C.Player1) == 8)
                {
                    TxtB.Clear();
                    StraightFlushNum++;
                    SUM++;
                    TxtB.AppendText(SUM.ToString() + "/"+ N.ToString() + "\n");
                    Percent_int = Convert.ToInt32(Percent);
                    Percent = (SUM / N)*100;
                    PrgBar.Value = Percent_int;
                    TxtB.AppendText("Processing..." + Percent_int + "% complete" + "\n");

                }
                else if (C.IS(C.Player1) == 7)
                {
                    TxtB.Clear();
                    FourofKindNum++;
                    SUM++;
                    TxtB.AppendText(SUM.ToString() + "/" + N.ToString());
                    Percent_int = Convert.ToInt32(Percent);
                    Percent = (SUM / N) * 100;
                    PrgBar.Value = Percent_int;
                    TxtB.AppendText("Processing..." + Percent_int + "% complete" + "\n");
                }
                else if (C.IS(C.Player1) == 6)
                {
                    TxtB.Clear();
                    FullhouseNum++;
                    SUM++;
                    TxtB.AppendText(SUM.ToString() + "/" + N.ToString() + "\n");
                    Percent_int = Convert.ToInt32(Percent);
                    Percent = (SUM / N) * 100;
                    PrgBar.Value = Percent_int;
                    TxtB.AppendText("Processing..." + Percent_int + "% complete" + "\n");
                }
                else if (C.IS(C.Player1) == 5)
                {
                    TxtB.Clear();
                    FlushNum++;
                    SUM++;
                    TxtB.AppendText(SUM.ToString() + "/" + N.ToString() + "\n");
                    Percent_int = Convert.ToInt32(Percent);
                    Percent = (SUM / N) * 100;
                    PrgBar.Value = Percent_int;
                    TxtB.AppendText("Processing..." + Percent_int + "% complete" + "\n");
                }
                else if (C.IS(C.Player1) == 4)
                {
                    TxtB.Clear();
                    StraightNum++;
                    SUM++;
                    TxtB.AppendText(SUM.ToString() + "/" + N.ToString() + "\n");
                    Percent_int = Convert.ToInt32(Percent);
                    Percent = (SUM / N) * 100;
                    PrgBar.Value = Percent_int;
                    TxtB.AppendText("Processing..." + Percent_int + "% complete" + "\n");
                }
                else if (C.IS(C.Player1) == 3)
                {
                    TxtB.Clear();
                    ThreeofakindNum++;
                    SUM++;
                    TxtB.AppendText(SUM.ToString() + "/" + N.ToString() + "\n");
                    Percent_int = Convert.ToInt32(Percent);
                    Percent = (SUM / N) * 100;
                    PrgBar.Value = Percent_int;
                    TxtB.AppendText("Processing..." + Percent_int + "% complete" + "\n");
                }
                else if (C.IS(C.Player1) == 2)
                {
                    TxtB.Clear();
                    TwoPairsNum++;
                    SUM++;
                    TxtB.AppendText(SUM.ToString() + "/" + N.ToString() + "\n");
                    Percent_int = Convert.ToInt32(Percent);
                    Percent = (SUM / N) * 100;
                    PrgBar.Value = Percent_int;
                    TxtB.AppendText("Processing..." + Percent_int + "% complete" + "\n");
                }
                else if (C.IS(C.Player1) == 1)
                {
                    TxtB.Clear();
                    OnePairNum++;
                    SUM++;
                    TxtB.AppendText(SUM.ToString() + "/" + N.ToString() + "\n");
                    Percent_int = Convert.ToInt32(Percent);
                    Percent = (SUM / N) * 100;
                    PrgBar.Value = Percent_int;
                    TxtB.AppendText("Processing..." + Percent_int + "% complete" + "\n");
                }
                else if (C.IS(C.Player1) == 0)
                {
                    TxtB.Clear();
                    NonNum++;
                    SUM++;
                    TxtB.AppendText(SUM.ToString() + "/" + N.ToString() + "\n");
                    Percent_int = Convert.ToInt32(Percent);
                    Percent = (SUM / N) * 100;
                    PrgBar.Value = Percent_int;
                    TxtB.AppendText("Processing..." + Percent_int + "% complete" + "\n");
                }                
            }
            StraightFlushNum = (StraightFlushNum / N) * 100;
            FourofKindNum = (FourofKindNum / N) * 100;
            FullhouseNum = (FullhouseNum / N) * 100;
            FlushNum = (FlushNum / N) * 100;
            StraightNum = (StraightNum / N) * 100;
            ThreeofakindNum = (ThreeofakindNum / N) * 100;
            TwoPairsNum = (TwoPairsNum / N) * 100;
            OnePairNum = (OnePairNum / N) * 100;
            NonNum = (NonNum / N) * 100;
            MessageBox.Show("同花順:" + StraightFlushNum.ToString() + "%" + "\n" + "四條:" + FourofKindNum.ToString() + "%" + "\n" + "葫蘆:" + FullhouseNum.ToString() + "%" + "\n" + "同花:" + FlushNum.ToString() + "%" + "\n" + "順子:" + StraightNum.ToString() + "%" + "\n" + "三條:" + ThreeofakindNum.ToString() + "%" + "\n" + "兩對:" + TwoPairsNum.ToString() + "%" + "\n" + "一對:" + OnePairNum.ToString() + "%" + "\n" + "無對:" + NonNum.ToString() + "%" + "\n");          
            TxtB.Clear();            
        }

        static string PrintPoker(CardDeck C)
        {
            string str_1 = "";
            str_1 += "甲:";
            for (int i = 0; i < 5; i++)
            {
                string str_2 = C.Player1[i].RankToStr() + C.Player1[i].SuitToAscii();
                str_1 += "  " + str_2;
            }
            str_1 += "\n" + "乙:";
            for (int i = 0; i < 5; i++)
            {
                string str_2 = C.Player2[i].RankToStr() + C.Player2[i].SuitToAscii();
                str_1 += "  " + str_2;
            }
            return str_1;
        }
        }
        
    }

4 則留言:

  1. deck[0].Rank += 8;
    for (int i = 0; i < 4; i++)
    {
    if ((deck[i].Rank + 1) != deck[i + 1].Rank)
    {
    deck[0].Rank -= 8;
    return false;
    }
    }
    deck[0].Rank -= 8;
    return true;
    在這段程式碼中有對撲克牌的點數做更動
    雖然有記得減回來
    但是撲克牌的點數應該是唯獨屬性
    做這樣的更動是很危險的
    如果真的需要這樣做 應該使用一個暫存空間來儲存需要更動的點數

    回覆刪除
    回覆
    1. 好的,謝謝您的指教!我會以此修改

      刪除
  2. 投影片很漂亮
    連花色一起排序的想法也不錯

    可以試著將 player 寫成另一個類別,Probability()的部分重覆太多,可以試著簡化

    回覆刪除