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;
}
}
}
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;
在這段程式碼中有對撲克牌的點數做更動
雖然有記得減回來
但是撲克牌的點數應該是唯獨屬性
做這樣的更動是很危險的
如果真的需要這樣做 應該使用一個暫存空間來儲存需要更動的點數
好的,謝謝您的指教!我會以此修改
刪除投影片很漂亮
回覆刪除連花色一起排序的想法也不錯
可以試著將 player 寫成另一個類別,Probability()的部分重覆太多,可以試著簡化
謝謝您,我會試著修改^^
刪除