2014年3月24日 星期一

[Code Review] Team 07 - Hw04


namespace Homework4
{
    public partial class Form1 : Form
    {
        
        public Form1()
        {
            InitializeComponent();
        }
            
        private void ButtonForComBox_Click(object sender, EventArgs e)
        {
            CardDeck D = new CardDeck();
            D.CreateDeck();
            D.ResetDeck();
            switch (comboBox1.SelectedIndex)
            {
                case 0:
                    textBox1.AppendText("ComboBox 花色排列 已被選定");
                    D.ResetDeck();
                    MessageBox.Show(PrintCardDeck(D));
                    break;
                case 1:
                    textBox1.AppendText("ComboBox 亂數洗牌 已被選定");
                    D.Shuffle();
                    MessageBox.Show(PrintCardDeck(D));
                    break;
                case 2:
                    textBox1.AppendText("ComboBox 按點數大小排列 已被選定");
                    D.DownToUp();
                    MessageBox.Show(PrintCardDeck(D));
                    break;

            }
            textBox1.Clear();
        }
        private string PrintCardDeck(CardDeck deck) //列印字串的方法
        {
            string a = ""; //宣告一個空字串
            
            for (int i = 0; i < 52; i++)
            {
                string b = deck.Cards[i].RankToStr() + deck.Cards[i].SuitToUniCode(); //宣告b為Card[i]裡的"數字屬性方法"與花色屬性方法的累加字串
                a +="  "+b; //做字串累加輸出
                    if ((i + 1) % 13 == 0) //若到達13次 則換行
                        a += "\n";
            }
            return a;            
        }
        private void ButtonForCheckBox_Click(object sender, EventArgs e)
        {
            CardDeck D = new CardDeck();
            D.CreateDeck();
            D.ResetDeck();
            if (checkBox1.Checked)
            {
                textBox1.AppendText("CheckBox 花色排列 已被選定\n");
                D.ResetDeck();
                MessageBox.Show(PrintCardDeck(D));
            }
            if (checkBox2.Checked)
            {
                textBox1.AppendText("CheckBox 亂數洗牌 已被選定\n");
                D.Shuffle();
                MessageBox.Show(PrintCardDeck(D));            
            }
            if (checkBox3.Checked)
            {
                textBox1.AppendText("CheckBox 按點數大小排列 已被選定\n");
                D.DownToUp();
                MessageBox.Show(PrintCardDeck(D));             
            }
            textBox1.Clear();
        }
    }
}
//******************************
 public String SuitToUniCode()
        {
            string SuitStr = Suit.ToString(); //宣告一個字串,用來表示Suit.ToString()
            byte[] bytes = new byte[2]; //宣告一個矩陣
            bytes[1] = Convert.ToByte(SuitStr.Substring(0, 2), 16); // EX: string SuitStr = "2665", SuitStr.Substring(0, 2) 從第"0"位開始擷取之後"2"位數字(Hint:2(第0位) 6(第1位) 6(第2位) 5(第3位)),故擷取第0位與第1位得"26",轉換為16進位為"1A"
            bytes[0] = Convert.ToByte(SuitStr.Substring(2, 2), 16); //同理,從第"2"位開始擷取之後"2"位數字(Hint:2(第0位) 6(第1位) 6(第2位) 5(第3位)),故擷取第2位與第3位得"65",轉換為16進位為"41"*/
            string result = Encoding.Unicode.GetString(bytes); //透過指令轉換矩陣[1A, 41]得"紅心符號"            
            return result;
        }
        //將花色轉為 UniCode 字元碼
//******************************
 public void ResetDeck()  //將Cards[i]矩陣,重新依序排列,
        {
            for (int i = 0; i < 52; i++)
            {
                int ChooseSuit = (i / 13);          //撲克牌共有4種花色,各有1~13張點數牌,故直接/13分成四堆牌
                switch (ChooseSuit)
                {
                    case 0:                //若整除,歸類為紅心
                        Cards[i].Suit = 2665;
                        break;
                    case 1:                //若商數為1,歸類為菱形     
                        Cards[i].Suit = 2666;
                        break;
                    case 2:                //若商數為2,歸類為梅花
                        Cards[i].Suit = 2663;
                        break;
                    case 3:                //若商數為3,歸類為黑桃
                        Cards[i].Suit = 2660;
                        break;
                }
                Cards[i].Rank = (i % 13) + 1; //同花色共有13張牌,因此/13取餘數,因點數從1點開始,故須加上1
            }
        }//牌堆回復原始狀態
        public void DownToUp()
        {
            for (int i = 0; i < 52; i++)
            {
                int ChooseSuit = (i % 4);             //按照點數大小排列,因此須從點數1以及四種花色開始排列,EX:1紅心 1菱形 1梅花 1黑桃 2紅心 2菱形 1梅花 2黑桃...
                switch (ChooseSuit)                   //因此可以假設共有13組由四種花色之組合
                {
                    case 0:
                        Cards[i].Suit = 2665;
                        break;
                    case 1:
                        Cards[i].Suit = 2666;
                        break;
                    case 2:
                        Cards[i].Suit = 2663;
                        break;
                    case 3:
                        Cards[i].Suit = 2660;
                        break;
                }

                Cards[i].Rank = (i / 4) + 1;  //按照數字大小排列有13組由四種花色之組合,因此第一組內之紅心,菱形,梅花,黑桃數字皆為1,第二組數字為2
            }                                 //以此類推共有13組
        }  

10 則留言:

  1. ===我是林高遠===
    public String SuitToUniCode() 也太冗長

    回覆刪除
  2. 太冗長是指註解? 還是程式碼?

    回覆刪除
  3. public void DownToUp() 的名稱不好,不清楚是花色還是數字由小排到大


    第九組

    回覆刪除
  4. public String SuitToUniCode() 此方法必要性不高,且增加程式複雜度。
    直接使用"\u "之方法較為簡易,也方便人閱讀。

    林玠虢

    回覆刪除
  5. ===我是林高遠===
    D 這個物件參考名稱取得太過簡略

    回覆刪除
  6. 每按一次按鈕就要生出一個新牌組沒有問題嗎?
    第十組

    回覆刪除
  7. ===我是林高遠===
    PrintCardDeck 是 return string, 所以這個方法名稱跟實作內容不太相符, 因為這個方法執行完畢後並沒有Print, 只是準備好要Print的字串

    回覆刪除
  8. ===林高遠===
    你不會在書局買到只有空盒子的撲克牌,所以CarDeck被new 出來的時候就要馬上有52張牌比較合理

    回覆刪除