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組
}
===我是林高遠===
回覆刪除public String SuitToUniCode() 也太冗長
太冗長是指註解? 還是程式碼?
回覆刪除實作方法的程式碼
刪除public void DownToUp() 的名稱不好,不清楚是花色還是數字由小排到大
回覆刪除第九組
OK 謝謝指正
刪除****蕭安盛*****
public String SuitToUniCode() 此方法必要性不高,且增加程式複雜度。
回覆刪除直接使用"\u "之方法較為簡易,也方便人閱讀。
林玠虢
===我是林高遠===
回覆刪除D 這個物件參考名稱取得太過簡略
每按一次按鈕就要生出一個新牌組沒有問題嗎?
回覆刪除第十組
===我是林高遠===
回覆刪除PrintCardDeck 是 return string, 所以這個方法名稱跟實作內容不太相符, 因為這個方法執行完畢後並沒有Print, 只是準備好要Print的字串
===林高遠===
回覆刪除你不會在書局買到只有空盒子的撲克牌,所以CarDeck被new 出來的時候就要馬上有52張牌比較合理