2014年3月24日 星期一

[Code Review] Team 01 - Hw04

Form1.cs
namespace OOPHW4
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void btn_ComboBoxTest_Click(object sender, EventArgs e)
        {
            CardDeck Deck = new CardDeck();
            Deck.CreateDeck();
            Deck.ResetDeck();
            txt_Display.Text = "";
            switch (cbo_SetWay.SelectedIndex)
            {
                case 0:
                    txt_Display.AppendText("ComboBox按花色排列 已被選定\n");
                    Deck.ResetDeck();
                    CardString(Deck);
                    break;
                case 1:
                    txt_Display.AppendText("ComboBox亂數排列 已被選定\n");
                    Deck.Shuffle();
                    CardString(Deck);
                    break;
                case 2:
                    txt_Display.AppendText("ComboBox按點數大小排列 已被選定\n");
                    Deck.SetDeckByRank();
                    CardString(Deck);
                    break;
                default:
                    break;
            }
        }
        private void btn_CheckBoxTest_Click(object sender, EventArgs e)
        {
            CardDeck Deck = new CardDeck();
            Deck.CreateDeck();
            Deck.ResetDeck();
            txt_Display.Text = "";
            if (chk_SetBySuit.Checked)
            {
                txt_Display.AppendText("CheckBox按花色排列 已被選定\n");
                Deck.ResetDeck();
                CardString(Deck);
            }
            if (chk_SetByRand.Checked)
            {
                txt_Display.AppendText("CheckBox亂數排列 已被選定\n");
                Deck.Shuffle();
                CardString(Deck);
            }
            if (chk_SetByRank.Checked)
            {
                txt_Display.AppendText("CheckBox按點數大小排列 已被選定\n");
                Deck.SetDeckByRank();
                CardString(Deck);
            }
        }
        static void CardString(CardDeck deck)
        {
            string S="";
            for (int i = 0; i <52 data-blogger-escaped-0="" data-blogger-escaped-anktostr="" data-blogger-escaped-deck.cards="" data-blogger-escaped-i="" data-blogger-escaped-if="" data-blogger-escaped-messagebox.show="" data-blogger-escaped-n="" data-blogger-escaped-pre="" data-blogger-escaped-s="" data-blogger-escaped-uittounicode="">



CardDeck.cs

namespace OOPHW4
{
    class CardDeck
    {
        public PokerCard[] Cards = new PokerCard[52];

        public void CreateDeck() //產生出52個PokerCard的物件
        {
            for (int i = 0; i < 52; i++)
            {
                Cards[i] = new PokerCard();
            }
        }
        public void ResetDeck() //牌堆回復原始狀態
        {
            for (int i = 0; i < 52; i++)
            {
                Cards[i].Suit = i / 13 + 3;
                Cards[i].Rank = i % 13 + 1;
            }
        }
        public void Shuffle() //洗牌
        {
            Random rand = new Random();
            PokerCard temp = new PokerCard();
            for (int i = 0; i < 52; i++)
            {
                int T = rand.Next(52);
                temp = Cards[i];
                Cards[i] = Cards[T];
                Cards[T] = temp;
            }
        }
        public void SetDeckByRank()
        {
            for (int i = 0; i < 52; i++)
            {
                Cards[i].Suit = i % 4 + 3;
                Cards[i].Rank = i /4  + 1;
            }
        }
    }
}

PokerCard.cs
namespace OOPHW4
{
    class PokerCard
    {
        public int Suit;  //花色
        public int Rank;  //點數
        public string RankToStr()  //將點數轉為字串
        {
            switch (Rank)
            {
                case 1:
                    return "A";
                case 11:
                    return "J";
                case 12:
                    return "Q";
                case 13:
                    return "K";
                default:
                    return Convert.ToString(Rank);
            }
        }
        public string SuitToUnicode()  //將花色轉為 Unicode
        {
            string S;
            switch(Suit)
            {
                case 3:
                    S = "\u2665";
                    break;
                case 4:
                    S = "\u2666";
                    break;
                case 5:
                    S = "\u2663";
                    break;
                case 6:
                    S = "\u2660";
                    break;
                default:
                    S = "";
                    break;
            }
            return S;
        }
    }
}

5 則留言:

  1. 如果 CardDeck Deck = new CardDeck(); 寫在button內,
    則每按一次就需要配置一次記憶體,離開後又把這個物件丟掉,
    感覺運作缺乏效率。

    回覆刪除
  2. ASCII轉Unicode時用switch來寫,看起來簡單易懂
    比起老師用string陣列,對於使用陣列意識較弱的人,switch較簡易,一目了然

    by 詹宛真

    回覆刪除
  3. CardDeck Deck = new CardDeck();
    Deck.CreateDeck();
    不用在combobox跟checkbox重複new一次
    然後重新配置記憶體
    整個過程中做一次即可

    然後CardString(Deck);不用丟Deck進去
    在同一個class中可以直接使用
    用CardString();即可

    回覆刪除
  4. Form1.cs中
    1.何不寫成MessageBox.Show(CardString(Deck));?
    2.static void CardString(CardDeck deck) 函式名稱 有更清楚明瞭的命名?
    By 吳珠鈺

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

    回覆刪除