2014年4月9日 星期三
2014年4月7日 星期一
[Code Review] Team 08 - Hw05 (修改)
HandCard.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace homework5
{
class HandCard
{
public PokerCard[] hand = new PokerCard[5];
private int amount = 0;
private int maxRank = 0;
private int secRank = 0;
private int thrRank = 0;
private string cardtype = "";
private int cardtypenum = 0;
private enum eCardType {HighCard=0,OnePair,TwoPair,ThreeOfaKing,Straight,Flush,FullHouse,FourOfaKing,StraightFlush}
public HandCard()
{
for (int i = 0; i < 5; i++)
{
hand[i] = new PokerCard();
}
}
public void SortByRank()
{
//bubble sort
PokerCard ChangeCard;
for (int i = hand.GetUpperBound(0); i > 0; i--)
{
for (int j = 0; j < i; j++)
{
if (hand[j].Rank > hand[j + 1].Rank)
{
ChangeCard = hand[j];
hand[j] = hand[j+1];
hand[j+1] = ChangeCard;
}
}
}
}
public void GetCardType()
{
//同花順(Straight Flush)n = 8
//四條(Four of a Kind)n = 7
//葫蘆(Fullhouse) n = 6
//同花(Flush)n = 5
//順子(Straight)n = 4
//三條(Three of a kind)n = 3
//兩對(Two Pairs)n = 2
//一對(One Pair)n = 1
//無對(High Card) n = 0
SortByRank();
if (CheckStraight() == "Stragiht" && CheckFlush() == "Flush") // 同花順 8
{
GetMaxRank();
CardType = "Straight Flush";
CardTypeNum = (int)eCardType.StraightFlush;
return;
}
else if (CheckStraight() == null && CheckFlush() == "Flush") // 同花 5
{
GetMaxRank();
CardType = "Flush";
CardTypeNum = (int)eCardType.Flush;
return;
}
else if (CheckStraight() == "Stragiht" && CheckFlush() == null) // 順子 4
{
GetMaxRank();
CardType = "Straight";
CardTypeNum = (int)eCardType.Straight;
return;
}
else if(CheckPair() != null)
{
CardType = CheckPair();
}
else
{
GetMaxRank();
CardType = "High Card";
CardTypeNum = (int)eCardType.HighCard;
return;
}
}
//函數內容: 檢查是否為順子
//函數說明: 第2張是第1張 + 1 以此類推
//須注意 A 10 J Q K 特殊例子
public string CheckStraight()
{
int start = 0;
if (hand[0].Rank == 1) // A,10,J,Q,K 特例
{
start = 10;
for (int i = 0; i <= hand.GetUpperBound(0)-1; i++)
if (hand[i+1].Rank != start + i)
return null;
return "Stragiht";
}
start = hand[0].Rank;
for (int i = 0; i <= hand.GetUpperBound(0); i++)
if (hand[i].Rank != start + i)
return null;
return "Stragiht";
}
//函數內容: 檢查是否為同花
//函數說明: 只要有一張不同即null
public string CheckFlush()
{
int start = hand[0].Suit;
foreach (PokerCard card in hand)
if (card.Suit != start)
return null;
return "Flush";
}
//函數內容: 檢查是否為對子(包含 三條 葫蘆 鐵支)
//函數說明: 先使用GETMAX()函數取得最長值
//再依各情況分析
public string CheckPair()
{
SortByRank();
int sum = GetMax(); // 取得相同點數最長的數量
// 4 張 只有鐵支
if (sum == 4)
{
CardTypeNum = (int)eCardType.FourOfaKing;
return "Four Of a King";
}
// 3 張 有葫蘆 跟 三條
// 葫蘆判斷 OOO XX 或 OO XXX 所以 1.2 與 3.4 張必相同
// 為非則為三條
if (sum == 3)
{
if (hand[0].Rank == hand[1].Rank && hand[3].Rank == hand[4].Rank)
{
CardTypeNum = (int)eCardType.FullHouse;
return "Full House";
}
else
{
CardTypeNum = (int)eCardType.ThreeOfaKing;
return "Three Of aKing";
}
}
// 2張 有 Two pair 跟 One pair
// two pair排列組合 有 2 1 2 或 2 2 1 或 1 2 2 等情形
// 再分別對各情形處理即可
if (sum == 2)
{
if (hand[0].Rank == hand[1].Rank)
{
if (hand[3].Rank == hand[4].Rank||hand[2].Rank == hand[3].Rank)
{
secRank = hand[0].Rank; // 第二組PAIR
thrRank = hand[2].Rank; // 雜牌
CardTypeNum = (int)eCardType.TwoPair;
return "Two Pair";
}
else // 1 1 2 3 4 情形
{
secRank = hand[4].Rank; // 單支 最後一張
secRank = hand[3].Rank; // 單支 倒數第二張
CardTypeNum = (int)eCardType.OnePair;
return "One Pair";
}
}
else
{
if (hand[1].Rank == hand[2].Rank && hand[3].Rank == hand[4].Rank) // O XX WW 情形
{
secRank = hand[2].Rank; // 第二組PAIR
thrRank = hand[0].Rank; // 雜牌
CardTypeNum = (int)eCardType.TwoPair;
return "Two Pair";
}
else
{
//ONE PAIR牌剩下的三種情形 把最大 中間 第三 找到
if(hand[4].Rank == hand[3].Rank) //1 2 3 4 4 情形
{
secRank = hand[2].Rank;
thrRank = hand[1].Rank;
}
else if (hand[3].Rank == hand[2].Rank) // 1 2 3 3 4 情形
{
secRank = hand[4].Rank;
thrRank = hand[1].Rank;
}
else if (hand[2].Rank == hand[1].Rank) // 1 2 2 3 4 情形
{
secRank = hand[4].Rank;
thrRank = hand[3].Rank;
}
CardTypeNum = (int)eCardType.OnePair;
return "One Pair";
}
}
}
return null;
}
//函數內容:取得最大相同牌數,並用maxRank紀錄最多相同牌的值
//函數說明:
//3 3 2 2 2 回傳 3 並記錄 2
//3 2 2 2 2 回傳 4 並紀錄 2
//1 2 3 3 4 回傳 2 並記錄 3
//1 2 3 4 5 回傳 1
//以此類推
public int GetMax() //取得最多相同牌數
{
int count = 0;
int max = 1;
int last = 0;
for (int j = 0; j < 5; j++)
{
if (last != hand[j].Rank)
{
last = hand[j].Rank;
for (int i = j; i < 5; i++)
{
if (last == hand[i].Rank)
count++;
}
if (count > max)
{
max = count; // 紀錄長度
if (last == 1)
maxRank = last + 13; // 紀錄點數
else
maxRank = last;
}
}
count = 0;
}
return max;
}
//函數內容: 一般情況下判定最大張的牌並記錄在maxRank值內 (雜牌.順子.同花.同花順)
public void GetMaxRank()
{
if (hand[0].Rank == 1)
{
maxRank = hand[0].Rank + 13; // 若A為最大,A = 14點
secRank = hand[4].Rank;
thrRank = hand[3].Rank;
}
else
{
maxRank = hand[4].Rank; //最大張為 最後一張牌 (A 例外)
secRank = hand[3].Rank;
thrRank = hand[2].Rank;
}
}
//函數內容: 增加一張手牌
//函數說明: amount紀錄目前手牌數量,若超過傳回false
public bool Add(PokerCard c)
{
if (c == null || amount == 5)
return false;
hand[amount] = c;
amount++;
return true;
}
//函數內容: 兩張手牌比較牌的大小
//函數說明: 先比較牌型,牌型較大者獲勝
//牌行相同則比較最大張牌,若相同則在比較下一張,直到第三張
public bool CombatTo(HandCard p2)
{
int P1CardType = CardTypeNum;
int P2CardType = p2.CardTypeNum;
if (P1CardType > P2CardType)
return true;
else if (P1CardType < P2CardType)
return false;
else //牌型相同 則比最大張
{
if (MaxRank > p2.MaxRank)
return true;
else if (MaxRank < p2.MaxRank)
return false;
else // 最大張相同 則比第二大張
{
if (SecRank > p2.SecRank)
return true;
else if (SecRank < p2.SecRank)
return false;
else// 第二大張相同 則比第三大張
{
if (ThrRank > p2.ThrRank)
return true;
else if (ThrRank < p2.ThrRank)
return false;
}
}
}
//要是第三大張在比較點數總和
int player1Sum = 0;
int player2Sum = 0;
for (int i = 0; i < 5; i++)
{
player1Sum += hand[i].Rank;
player2Sum += p2.hand[i].Rank;
}
if (player1Sum > player2Sum)
return true;
else if (player1Sum < player2Sum)
return false;
//Default
return true;
}
public string CardType
{
get
{
if (cardtype == "")
GetCardType();
return cardtype;
}
set { cardtype = value; }
}
public int CardTypeNum
{
get
{
if (cardtypenum == 0)
GetCardType();
return cardtypenum;
}
set
{
if (value > 8 || value < 0)
cardtypenum = 0;
else
cardtypenum = value;
}
}
public int MaxRank
{
get { return maxRank; }
}
public int SecRank
{
get { return secRank; }
}
public int ThrRank
{
get { return thrRank; }
}
}
}
[Code Review] Team 09 - Hw05
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace HW5
{
class CardDeck
{
public PokerCard[] Deck = new PokerCard[52];
public void CreateDeck()
{
for (int i = 0; i < 52; i++)
{
Deck[i] = new PokerCard(i / 13, i % 13 + 1);
}
}
public void ResetDeck()
{
for (int i = 0; i < 52; i++)
{
Deck[i].Suit = i / 13;
Deck[i].Rank = i % 13 + 1;
}
}
public void Shuffle()
{
//亂數產生器
Random rand = new Random();
PokerCard temp;
int RandNum;
for (int i = 0; i < 52; i++)
{
RandNum = rand.Next(52);
temp = Deck[i];
Deck[i] = Deck[RandNum];
Deck[RandNum] = temp;
}
}
}
}
===================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace HW5
{
class HandCard
{
public PokerCard[] Hand = new PokerCard[5];
private static string[] Type = { "Zilch", "One Pair", "Two Pairs", "Three of a kind", "Straight", "Flush", "Fullhouse", "Four of a Kind", "Straight Flush" };
int TopIndex = 0;
private bool isSort = true;
public void Draw(CardDeck D)
{
for (int i = 0; i < 5; i++)
{
if (TopIndex >= 50)
{
D.ResetDeck();
D.Shuffle();
TopIndex = 0;
}
Hand[i] = D.Deck[TopIndex];
TopIndex++;
}
}
public void Draw(CardDeck D,int Limit)
{
int Lnum = 0;
while (Lnum<Limit)
{
for (int i = 0; i < 5; i++)
{
if (TopIndex >= 50)
{
D.ResetDeck();
D.Shuffle();
TopIndex = 0;
}
Hand[i] = D.Deck[TopIndex];
TopIndex++;
}
Lnum++;
}
TopIndex += 5;
}
public void Sort()
{
PokerCard temp;
for (int i = 0; i < 5; i++)
{
for (int j = 1; j < 5; j++)
{
if (Hand[j - 1].Rank > Hand[j].Rank)
{
temp = Hand[j - 1];
Hand[j - 1] = Hand[j];
Hand[j] = temp;
}
}
}
}
public int CardsTypeNum()
{
if (!isSort)
Sort();
int Num = 0;
//判斷對子數目
int TypeNum = 0;
for (int i = 0; i < 5; i++)
{
for (int j = i + 1; j < 5; j++)
{
if (Hand[i].Rank == Hand[j].Rank)
TypeNum++;
}
}
switch (TypeNum)
{
case 0:
Num = 0;
break;
case 1:
Num = 1;
break;
case 2:
Num = 2;
break;
case 3:
Num = 3;
break;
case 4:
Num = 6;
break;
case 6:
Num = 7;
break;
}
//判斷同花
int FlushNum = 0;
for (int i = 1; i < 5; i++)
{
if (Hand[0].Suit == Hand[i].Suit)
FlushNum++;
}
if (FlushNum == 4)
Num = 5;
//判斷順子
int StraightNum = 0;
for (int i = 1; i < 5; i++)
{
if (Hand[i - 1].Rank + 1 == Hand[i].Rank)
{
StraightNum++;
if (Hand[i - 1].Rank == 13 && Hand[i].Rank == 1)
StraightNum++;
}
}
if (StraightNum == 4)
Num = 4;
//判斷同花順
if (FlushNum == 4 && StraightNum == 4)
Num = 8;
return Num;
}
public string TypeNumToStr()
{
return Type[CardsTypeNum()];
}
public string TypeProbability(CardDeck D,int Order)
{
double ZilchNum = 0;
double OnePairNum = 0;
double TwoPairsNum = 0;
double ThreeOfaKindNum = 0;
double StraightNum = 0;
double FlushNum = 0;
double FullHouseNum = 0;
double FourOfaKindNum = 0;
double StraightFlushNum = 0;
int N = 50000000;
for (int i = 0; i <= N; i++)
{
Draw(D);
Sort();
CardsTypeNum();
switch (CardsTypeNum())
{
case 0:
ZilchNum++;
break;
case 1:
OnePairNum++;
break;
case 2:
TwoPairsNum++;
break;
case 3:
ThreeOfaKindNum++;
break;
case 4:
StraightNum++;
break;
case 5:
FlushNum++;
break;
case 6:
FullHouseNum++;
break;
case 7:
FourOfaKindNum++;
break;
case 8:
StraightFlushNum++;
break;
default:
break;
}
}
switch (Order)
{
case 0:
return (ZilchNum / N).ToString();
case 1:
return (OnePairNum / N).ToString();
case 2:
return (TwoPairsNum / N).ToString();
case 3:
return (ThreeOfaKindNum / N).ToString();
case 4:
return (StraightNum / N).ToString();
case 5:
return (FlushNum / N).ToString();
case 6:
return (FullHouseNum / N).ToString();
case 7:
return (FourOfaKindNum / N).ToString();
case 8:
return (StraightFlushNum / N).ToString();
default:
return "Error!!";
}
}
}
}
===================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace HW5
{
class PokerCard
{
//Fields
private int suit;
private int rank;
private static string[] StrUni = { "\u2665", "\u2666", "\u2663", "\u2660" };
//Constructors
public PokerCard(int suit, int rank)
{
this.suit = suit;
this.rank = rank;
}
//Attributes
public int Suit
{
get { return suit; }
set
{
if (value >= 0 && value < 4)
suit = value;
}
}
public int Rank
{
get { return rank; }
set
{
if (value > 0 && value <= 13)
rank = value;
}
}
/// <summary>
/// method
/// </summary>
/// <returns></returns>
public string SuitToUni()
{
return StrUni[Suit];
}
public string RankToStr()
{
string rankStr="";
switch (Rank)
{
case 1:
rankStr = "A";
return rankStr;
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
rankStr = rank.ToString();
return rankStr;
case 11:
rankStr = "J";
return rankStr;
case 12:
rankStr = "Q";
return rankStr;
case 13:
rankStr = "K";
return rankStr;
default:
return "Error!!";
}
}
}
}
===================================================
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace HW5
{
class CardDeck
{
public PokerCard[] Deck = new PokerCard[52];
public void CreateDeck()
{
for (int i = 0; i < 52; i++)
{
Deck[i] = new PokerCard(i / 13, i % 13 + 1);
}
}
public void ResetDeck()
{
for (int i = 0; i < 52; i++)
{
Deck[i].Suit = i / 13;
Deck[i].Rank = i % 13 + 1;
}
}
public void Shuffle()
{
//亂數產生器
Random rand = new Random();
PokerCard temp;
int RandNum;
for (int i = 0; i < 52; i++)
{
RandNum = rand.Next(52);
temp = Deck[i];
Deck[i] = Deck[RandNum];
Deck[RandNum] = temp;
}
}
}
}
===================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace HW5
{
class HandCard
{
public PokerCard[] Hand = new PokerCard[5];
private static string[] Type = { "Zilch", "One Pair", "Two Pairs", "Three of a kind", "Straight", "Flush", "Fullhouse", "Four of a Kind", "Straight Flush" };
int TopIndex = 0;
private bool isSort = true;
public void Draw(CardDeck D)
{
for (int i = 0; i < 5; i++)
{
if (TopIndex >= 50)
{
D.ResetDeck();
D.Shuffle();
TopIndex = 0;
}
Hand[i] = D.Deck[TopIndex];
TopIndex++;
}
}
public void Draw(CardDeck D,int Limit)
{
int Lnum = 0;
while (Lnum<Limit)
{
for (int i = 0; i < 5; i++)
{
if (TopIndex >= 50)
{
D.ResetDeck();
D.Shuffle();
TopIndex = 0;
}
Hand[i] = D.Deck[TopIndex];
TopIndex++;
}
Lnum++;
}
TopIndex += 5;
}
public void Sort()
{
PokerCard temp;
for (int i = 0; i < 5; i++)
{
for (int j = 1; j < 5; j++)
{
if (Hand[j - 1].Rank > Hand[j].Rank)
{
temp = Hand[j - 1];
Hand[j - 1] = Hand[j];
Hand[j] = temp;
}
}
}
}
public int CardsTypeNum()
{
if (!isSort)
Sort();
int Num = 0;
//判斷對子數目
int TypeNum = 0;
for (int i = 0; i < 5; i++)
{
for (int j = i + 1; j < 5; j++)
{
if (Hand[i].Rank == Hand[j].Rank)
TypeNum++;
}
}
switch (TypeNum)
{
case 0:
Num = 0;
break;
case 1:
Num = 1;
break;
case 2:
Num = 2;
break;
case 3:
Num = 3;
break;
case 4:
Num = 6;
break;
case 6:
Num = 7;
break;
}
//判斷同花
int FlushNum = 0;
for (int i = 1; i < 5; i++)
{
if (Hand[0].Suit == Hand[i].Suit)
FlushNum++;
}
if (FlushNum == 4)
Num = 5;
//判斷順子
int StraightNum = 0;
for (int i = 1; i < 5; i++)
{
if (Hand[i - 1].Rank + 1 == Hand[i].Rank)
{
StraightNum++;
if (Hand[i - 1].Rank == 13 && Hand[i].Rank == 1)
StraightNum++;
}
}
if (StraightNum == 4)
Num = 4;
//判斷同花順
if (FlushNum == 4 && StraightNum == 4)
Num = 8;
return Num;
}
public string TypeNumToStr()
{
return Type[CardsTypeNum()];
}
public string TypeProbability(CardDeck D,int Order)
{
double ZilchNum = 0;
double OnePairNum = 0;
double TwoPairsNum = 0;
double ThreeOfaKindNum = 0;
double StraightNum = 0;
double FlushNum = 0;
double FullHouseNum = 0;
double FourOfaKindNum = 0;
double StraightFlushNum = 0;
int N = 50000000;
for (int i = 0; i <= N; i++)
{
Draw(D);
Sort();
CardsTypeNum();
switch (CardsTypeNum())
{
case 0:
ZilchNum++;
break;
case 1:
OnePairNum++;
break;
case 2:
TwoPairsNum++;
break;
case 3:
ThreeOfaKindNum++;
break;
case 4:
StraightNum++;
break;
case 5:
FlushNum++;
break;
case 6:
FullHouseNum++;
break;
case 7:
FourOfaKindNum++;
break;
case 8:
StraightFlushNum++;
break;
default:
break;
}
}
switch (Order)
{
case 0:
return (ZilchNum / N).ToString();
case 1:
return (OnePairNum / N).ToString();
case 2:
return (TwoPairsNum / N).ToString();
case 3:
return (ThreeOfaKindNum / N).ToString();
case 4:
return (StraightNum / N).ToString();
case 5:
return (FlushNum / N).ToString();
case 6:
return (FullHouseNum / N).ToString();
case 7:
return (FourOfaKindNum / N).ToString();
case 8:
return (StraightFlushNum / N).ToString();
default:
return "Error!!";
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace HW5
{
class PokerCard
{
//Fields
private int suit;
private int rank;
private static string[] StrUni = { "\u2665", "\u2666", "\u2663", "\u2660" };
//Constructors
public PokerCard(int suit, int rank)
{
this.suit = suit;
this.rank = rank;
}
//Attributes
public int Suit
{
get { return suit; }
set
{
if (value >= 0 && value < 4)
suit = value;
}
}
public int Rank
{
get { return rank; }
set
{
if (value > 0 && value <= 13)
rank = value;
}
}
/// <summary>
/// method
/// </summary>
/// <returns></returns>
public string SuitToUni()
{
return StrUni[Suit];
}
public string RankToStr()
{
string rankStr="";
switch (Rank)
{
case 1:
rankStr = "A";
return rankStr;
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
rankStr = rank.ToString();
return rankStr;
case 11:
rankStr = "J";
return rankStr;
case 12:
rankStr = "Q";
return rankStr;
case 13:
rankStr = "K";
return rankStr;
default:
return "Error!!";
}
}
}
}
2014年4月6日 星期日
[Code Review] Team 03 - Hw05
執行檔 Form1.cs 按我顯示
CardDeck 按我顯示
PokerCard 按我顯示
HandCard 按我顯示
public HW5()
{
InitializeComponent();
}
private void btn_RunMyChioce_Click(object sender, EventArgs e)
{
HandCard hand1 = new HandCard();
CardDeck carddeck = new CardDeck();
carddeck.ResetDeck();
switch (cbox_MyChioce.SelectedIndex)
{
case 0:
carddeck.Shuffle();
hand1.Rest(carddeck);
MessageBox.Show(hand1.MyCardAndCardType());
break;
case 1:
HandCard hand2 = new HandCard();
carddeck.Shuffle();
hand1.Rest(carddeck);
hand2.Rest(carddeck);
string result = hand1.MyCardAndCardType() + hand2.MyCardAndCardType() + WhoWin(hand1,hand2);
MessageBox.Show(result);
break;
case 2:
float[] FrequencyData =new float[10];
for (int pass = 1; pass <= 5000000; pass++)
{
carddeck.ResetDeck();
carddeck.Shuffle();
for (int x = 1; x <= 10; x++)
{
hand1.Rest(carddeck);
FrequencyData[hand1.CardType()] += 1;
}
}
PrintProbability(hand1, FrequencyData);
break;
default:
MessageBox.Show("Error");
break;
}
}
string WhoWin(HandCard player1, HandCard player2)
{
if (player1.CardType() > player2.CardType())
return "Player1 Win";
else if(player1.CardType() < player2.CardType())
return "Player2 Win";
else
return "Draw Game";
}
void PrintProbability(HandCard p,float[] q)
{
string output;
for (int i = 0; i < 10; i++)
{
output = "";
output += p.TypeStr[i];
output += ":";
output += (q[i]/50000000).ToString();
output += "\n";
txt_ShowMessage.AppendText(output);
}
}
public PokerCard[] Cards = new PokerCard[52];
private int topIndex = 0;
public void ResetDeck()
{
for (int i = 0; i <= 51; i++)
{
Cards[i] = new PokerCard((i / 13) + 3, (i % 13) + 1);
}
topIndex = 0;
}
public void Shuffle()
{
Random rand = new Random();
PokerCard Change = new PokerCard();
for (int i = 0; i <= 51; i++)
{
Change = Cards[i];
int position = rand.Next(52);
Cards[i] = Cards[position];
Cards[position] = Change;
}
topIndex = 0;
}
public PokerCard Deal()
{
if (topIndex >= 52)
return null;
return Cards[topIndex++];
}
class PokerCard
{
private int suit;
private int rank;
public PokerCard(int suit, int rank)
{
this.suit = suit;
this.rank = rank;
}
public PokerCard()
{
}
public int Rank
{
get { return rank; }
set { rank = value; }
}
public int Suit
{
get { return suit; }
set { suit = value; }
}
private 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);
}
}
private string SuitToUni()
{
string Str_Suit;
switch (Suit)
{
case 3:
Str_Suit = "\u2665";
break;
case 4:
Str_Suit = "\u2666";
break;
case 5:
Str_Suit = "\u2663";
break;
case 6:
Str_Suit = "\u2660";
break;
default:
Str_Suit = "Error";
break;
}
return Str_Suit;
}
public string RankAndSuit()
{
return RankToStr() + SuitToUni();
}
private PokerCard[] Hand = new PokerCard[5];
private enum Type { Error,Highcard, Onepair, Twopair, Threeofkind, Straight, Flush, Fullhouse, Fourofkind, StraightFlush };
public string[] TypeStr = { "Error", "Highcard", "Onepair", "Twopair", "Threeofkind", "Straight", "Flush", "Fullhouse", "Fourofkind", "StraightFlush" };
//發牌和做大小排列
public void Rest(CardDeck p)
{
for (int i = 0; i < 5; i++)
{
Hand[i] = p.Deal();
}
this.Sort();
}
//將5張牌由點數小到大排列
private void Sort()
{
PokerCard temp = new PokerCard();
for (int pass = 0; pass < 5; pass++)
{
for (int i = 0; i < 4; i++)
{
if (Hand[i].Rank > Hand[i + 1].Rank)
{
temp = Hand[i];
Hand[i] = Hand[i + 1];
Hand[i + 1] = temp;
}
}
}
}
//判斷5張手牌所組成得類型
public int CardType()
{
switch (JudgeRepeatHowManyTime())
{
case 0:
if (isFlush())
{
if (isStraight())
return (int)(Type.StraightFlush);
else
return (int)(Type.Flush);
}
else if (isStraight())
return (int)(Type.Straight);
else
return (int)(Type.Highcard);
case 2:
return (int)(Type.Onepair);
case 4:
return (int)(Type.Twopair);
case 5:
return (int)(Type.Threeofkind);
case 7:
return (int)(Type.Fullhouse);
case 8:
return (int)(Type.Fourofkind);
default:
return (int)(Type.Error);
}
}
private bool isFlush()
{
for (int i = 0; i < 4; i++)
{
if (Hand[i].Suit != Hand[i + 1].Suit)
return false;
}
return true;
}
/*isStraight
* 如果單純檢查5張牌是否連續會使[A,10,J,Q,K]出現錯誤
*
* 所以先檢查第一張是否是A
* 是A=====>檢查第2~第5張是否連續。是連續======>檢查第2張是否是2或10。是2或10======>是順子
* 不是連續=====>不是順子
* 不是A======>屏蔽掉[A,10,J,Q,K]這個組合,直接檢查五張牌是否連續。是連續======>是順子
* 不是連續=====>不是順子
*/
private bool isStraight()
{
if (Hand[0].Rank == 1)
{
for (int i = 1; i < 4; i++)
{
if (Hand[i].Rank != (Hand[i + 1].Rank) - 1)
{
return false;
}
}
if (Hand[1].Rank == 2 || Hand[1].Rank == 10)
return true;
else
return false;
}
else
{
for (int i = 0; i < 4; i++)
{
if (Hand[i].Rank != (Hand[i + 1].Rank) - 1)
{
return false;
}
}
return true;
}
}
/*JudgeRepeatHowManyTime
若第i張和第(i+1)張相同,是的話x+1和y+1,並在檢查第(i+1)張和第(i+2)張相同,是的話y+1
若第i張和第(i+1)張不相同,不做任何事
for loop跑完時
若牌型是Highcard,則x=0、y=0
Onepair,則x=1,y=1
Twopair,則x=2、y=2
Threeofkind,則x=2、y=3
Straight,則x=0、y=0
Flush,則x=0、y=0
Fullhouse,則x=3、y=4
Fourofkind,則x=3、y=5
StraightFlush,則x=0、y=0*/
private int JudgeRepeatHowManyTime()
{
int x = 0, y = 0;
for (int i = 0; i < 4; i++)
{
if (Hand[i].Rank == Hand[i + 1].Rank)
{
x += 1;
y += 1;
if (i + 2 > 4) //只有五張牌
continue;
if (Hand[i + 1].Rank == Hand[i + 2].Rank)
{
y += 1;
}
}
}
return x+y;
}
//將5張牌和組成的牌型做成字串
public string MyCardAndCardType()
{
string output = "";
for (int i = 0; i < 5; i++)
{
output += Hand[i].RankAndSuit();
output += " ";
}
output += "\n";
output+=TypeStr[CardType()];
output += "\n";
return output;
}
2014年4月5日 星期六
[Code Review] Team 04 - Hw05
執行檔
Form1.cs
using System;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using quiz4_40273040H;
namespace HW5
{
public partial class Form1 : Form
{
private CardDeck deck = null;
private FiveCards[] Player = new FiveCards[10];
public enum HandCardsLevel { Zilch = 0, OnePair, TwoPairs, Threeofakind, Straight, Flush, Fullhouse, FourofaKind, StraightFlush };
private string[] HandCardsLevelName = { "Zilch", "OnePair", "TwoPairs", "Threeofakind", "Straight", "Flush", "Fullhouse", "FourofaKind", "StraightFlush" };
private int[] Statistic = new int[10];
public Form1()
{
InitializeComponent();
InitDeck();
InitFiveCards();
}
private void InitDeck()
{
deck = new CardDeck();
deck.CreateDeck();
deck.ResetDeck();
}
private void InitFiveCards()
{
for (int i = 0; i < 10; i++)
{
Player[i]=new FiveCards();
Player[i].CreatFiveCards();
}
}
private void button1_Click(object sender, EventArgs e)
{
if (null == deck)
InitDeck();
switch (comboBox1.SelectedIndex)
{
case 0:
deck.Shuffle();
Player[0].GetCards(0,deck.Cards);
Player[0].OrderFiveCardByRank();
MessageBox.Show(Player[0].PrintFiveCards());
break;
case 1:
deck.Shuffle();
for(int i=0;i<2 data-blogger-escaped-deck.cards="" data-blogger-escaped-etcards="" data-blogger-escaped-eterminehandcardlevel="" data-blogger-escaped-i="" data-blogger-escaped-if="" data-blogger-escaped-layer="" data-blogger-escaped-player="" data-blogger-escaped-rderfivecardbyrank="">Player[1].DetermineHandCardLevel())
MessageBox.Show("Player1:" +" "+Player[0].PrintFiveCards() + '\n' + "Player2:"+" "+Player[1].PrintFiveCards() + "\nPlayer1 win");
else if (Player[0].DetermineHandCardLevel() == Player[1].DetermineHandCardLevel())
MessageBox.Show("Player1:" +" "+Player[0].PrintFiveCards() + '\n' + "Player2:"+" "+Player[1].PrintFiveCards() + "\nEven");
else
MessageBox.Show("Player1:" +" "+Player[0].PrintFiveCards() + '\n' + "Player2:"+" "+Player[1].PrintFiveCards() + "\nPlayer2 win");
break;
case 2:
for (int k = 0; k < 10; k++)
Statistic[k] = 0;
for (int i = 0; i < 5000000; i++)
{
deck.Shuffle();
for (int j = 0; j <= 9; j++)
{
Player[j].GetCards(j, deck.Cards);
Player[j].OrderFiveCardByRank();
Statistic[(int)Player[j].DetermineHandCardLevel()]++;
// textBox1.AppendText(Player[j].PrintFiveCards()+'\n');
}
}
for (int i = 0; i < 9; i++)
textBox1.AppendText(HandCardsLevelName[i]+"出現機率為" + ((float)Statistic[i] / 50000000).ToString() + '\n');
break;
default:
break;
}
}
private void button2_Click(object sender, EventArgs e)
{
Player[0].fivecard[0].Rank = 1;
Player[0].fivecard[0].Suit = 5;
Player[0].fivecard[1].Rank = 8;
Player[0].fivecard[1].Suit = 5;
Player[0].fivecard[2].Rank = 1;
Player[0].fivecard[2].Suit = 4;
Player[0].fivecard[3].Rank = 6;
Player[0].fivecard[3].Suit = 6;
Player[0].fivecard[4].Rank = 8;
Player[0].fivecard[4].Suit = 4;
Player[0].OrderFiveCardByRank();
MessageBox.Show(Player[0].PrintFiveCards());
}
}
}
FiveCards.cs
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using quiz4_40273040H;
namespace HW5
{
class FiveCards
{
public PokerCard[] fivecard = new PokerCard[5];
public void CreatFiveCards()
{
for (int i = 0; i < 5;i++ )
fivecard[i] = new PokerCard();
}
public void GetCards(int start,PokerCard[] deck)
{
int i,j;
j = 5 * (start);
for (i =j;i-j<5 data-blogger-escaped--="" data-blogger-escaped-4="" data-blogger-escaped-5="" data-blogger-escaped-ank="" data-blogger-escaped-fivecard="" data-blogger-escaped-for="" data-blogger-escaped-i="" data-blogger-escaped-if="" data-blogger-escaped-int="" data-blogger-escaped-orderfivecardbyrank="" data-blogger-escaped-pass="" data-blogger-escaped-pokercard="" data-blogger-escaped-public="" data-blogger-escaped-temp="new" data-blogger-escaped-uit="deck[i].Suit;" data-blogger-escaped-void="">= fivecard[i + 1].Rank)
{
temp = fivecard[i];
fivecard[i] = fivecard[i + 1];
fivecard[i + 1] = temp;
}
}
}
}
public string PrintFiveCards()
{
string str = "";
for (int i = 0; i <= 4; i++)
{
str += fivecard[i].RankToStr() + fivecard[i].SuitToUnicode() + " ";
}
str += '\n';
str += DetermineHandCardLevel();
return str;
}
public bool FlushCombo()
{
int flushCombo = 1;
for (int i=1; i <= 4; i++)
{
if (fivecard[i].Suit == fivecard[0].Suit)
flushCombo++;
}
if (flushCombo == 5)
return true;
else
return false;
}
public int StraightCombo()
{
int straightCombo = 1;
for (int i = 0; i <= 3; i++)
{
if (fivecard[i + 1].Rank - fivecard[i].Rank == 1)
straightCombo++;
}
return straightCombo;
}
public int RankType()
{
int rardType = 1;
int temp = fivecard[0].Rank;
for (int i = 1; i <= 4; i++)
{
if (fivecard[i].Rank != temp)
rardType++;
temp = fivecard[i].Rank;
}
return rardType;
}
public Form1.HandCardsLevel DetermineHandCardLevel()
{
if (FlushCombo())
{
switch (StraightCombo())
{
case 5:
return Form1.HandCardsLevel.StraightFlush;
case 4:
if(fivecard[4].Rank == 13 && fivecard[0].Rank == 1)
return Form1.HandCardsLevel.StraightFlush;
else
return Form1.HandCardsLevel.Flush;
default:
return Form1.HandCardsLevel.Flush;
}
}
else
{
switch (RankType())
{
case 2:
if (fivecard[0].Rank == fivecard[3].Rank || fivecard[1].Rank == fivecard[4].Rank)
return Form1.HandCardsLevel.FourofaKind;
else
return Form1.HandCardsLevel.Fullhouse;
case 3:
if (fivecard[0].Rank == fivecard[2].Rank || fivecard[1].Rank == fivecard[3].Rank || fivecard[2].Rank == fivecard[4].Rank)
return Form1.HandCardsLevel.Threeofakind;
else
return Form1.HandCardsLevel.TwoPairs;
case 4:
return Form1.HandCardsLevel.OnePair;
case 5:
switch (StraightCombo())
{
case 5:
return Form1.HandCardsLevel.Straight;
case 4:
if (fivecard[4].Rank == 13 && fivecard[0].Rank == 1)
return Form1.HandCardsLevel.Straight;
else
return Form1.HandCardsLevel.Zilch;
default:
return Form1.HandCardsLevel.Zilch;
}
default:
return 0;
}
}
}
}
}
CardDeck.cs
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace quiz4_40273040H
{
class CardDeck
{
public PokerCard[] Cards = new PokerCard[52];
public void CreateDeck()
{
for (int i = 0; i < Cards.GetLength(0); i++)
{
Cards[i]=new PokerCard();
}
}
public void ResetDeck()
{
for (int i = 0; i < 52; i++)
{
int j = i;
Cards[i].Suit = i/13+3;
Cards[i].Rank=j%13+1;
}
}
public void Shuffle()
{
Random rand = new Random();
PokerCard temp=new PokerCard();
int j;
for (int i = 0; i < 52; i++)
{
j=rand.Next(52);
temp = Cards[i];
Cards[i] = Cards[j];
Cards[j] = temp;
}
}
public void OrderByRank()
{
int i,pass;
PokerCard temp=new PokerCard();
for(pass=0;pass<51 data-blogger-escaped-ank="" data-blogger-escaped-ards="" data-blogger-escaped-for="" data-blogger-escaped-i="" data-blogger-escaped-if="" data-blogger-escaped-pass="">=Cards[i+1].Rank)
{
temp=Cards[i];
Cards[i]=Cards[i+1];
Cards[i+1]=temp;
}
}
}
}
}
}
PokerCardcs.cs
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace quiz4_40273040H
{
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 Rank.ToString();
}
}//將點數轉為字串
public string SuitToUnicode()
{
string[] Unicode = { "\u2665", "\u2666", "\u2663", "\u2660" };
return Unicode[Suit-3];
}
}
}
2014年4月4日 星期五
[Code Review] Team 05 - Hw05
Form1.cs
PokerCard.cs
按我顯示
執行檔
public partial class Form1 : Form
{
CompleteCard PokerCardWeUse=new CompleteCard();
int player1, player2;
public Form1()
{
InitializeComponent();
PokerCardWeUse.startgame();
PokerCardWeUse.shuff();
}
private void button1_Click(object sender, EventArgs e)
{
switch(comboBox1.SelectedIndex)
{
case 0:
MessageBox.Show(PokerCardWeUse.putCard5());
break;
case 1:
player1 = PokerCardWeUse.studHi();
MessageBox.Show("玩家1\n"+PokerCardWeUse.putCard5());
player2 = PokerCardWeUse.studHi();
MessageBox.Show("玩家2\n"+PokerCardWeUse.putCard5());
if (player1 > player2)
MessageBox.Show("玩家1獲勝");
else if (player1 < player2)
MessageBox.Show("玩家2獲勝");
else
MessageBox.Show("雙方和局");
break;
case 2:
MessageBox.Show(PokerCardWeUse.chooseCard());
break;
}
}
}
class PokerCard
{
private int suit;
private int number;
private static string[] suitUse=new string[4]{"\u2660","\u2663","\u2665","\u2666"};
private static string[] numbUse = new string[13] { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
public PokerCard()
{
this.suit = 0;
this.number = 0;
}
public PokerCard(int num)//0-51張牌
{
this.suit = num / 13;
this.number = num % 13;
}
public string name
{
get { return " " + suitUse[suit] + numbUse[number]; }
}
public int Suit
{
get { return suit; }
}
public int Number
{
get { return number; }
}
}
class CompleteCard
{
private PokerCard[] Card = new PokerCard[52];
public int CardNum=0;
private static string[] level = new string[10] { "無對", "一對", "兩對", "三條", "順子", "同花", "胡", "四條", "空", "同花順" };
public void startgame()
{
for(int i=0;i<52 data-blogger-escaped-5="" data-blogger-escaped-a="" data-blogger-escaped-ard="" data-blogger-escaped-ardnum="" data-blogger-escaped-b="" data-blogger-escaped-card="" data-blogger-escaped-cardnum="" data-blogger-escaped-change="" data-blogger-escaped-for="" data-blogger-escaped-i="" data-blogger-escaped-if="" data-blogger-escaped-int="" data-blogger-escaped-level="" data-blogger-escaped-m="" data-blogger-escaped-n="" data-blogger-escaped-name="" data-blogger-escaped-new="" data-blogger-escaped-pokercard="" data-blogger-escaped-public="" data-blogger-escaped-putcard5="" data-blogger-escaped-rand="new" data-blogger-escaped-random="" data-blogger-escaped-shuff="" data-blogger-escaped-string="" data-blogger-escaped-studhi="" data-blogger-escaped-sum="" data-blogger-escaped-void="" data-blogger-escaped-x="">52)
{
CardNum = 0;
shuff();
}
return sum;
}
public string chooseCard()
{
string sum = "";
double zilch=0;//0
double onePair = 0;//1
double twoPairs = 0;//2
double threeofakind = 0;//3
double straight = 0;//4
double flush = 0;//5
double fullhouse = 0;//6
double fourofaKind = 0;//7
double straightFlush = 0;//9
for(int k=0;k<500000 data-blogger-escaped-0:="" data-blogger-escaped-1:="" data-blogger-escaped-1="" data-blogger-escaped-2:="" data-blogger-escaped-3:="" data-blogger-escaped-4:="" data-blogger-escaped-5:="" data-blogger-escaped-5="" data-blogger-escaped-6:="" data-blogger-escaped-7:="" data-blogger-escaped-9:="" data-blogger-escaped-ardnum="" data-blogger-escaped-break="" data-blogger-escaped-cardnum="" data-blogger-escaped-case="" data-blogger-escaped-default:="" data-blogger-escaped-flush="" data-blogger-escaped-fourofakind="" data-blogger-escaped-fullhouse="" data-blogger-escaped-if="" data-blogger-escaped-k="" data-blogger-escaped-onepair="" data-blogger-escaped-straight="" data-blogger-escaped-straightflush="" data-blogger-escaped-studhi="" data-blogger-escaped-switch="" data-blogger-escaped-threeofakind="" data-blogger-escaped-twopairs="" data-blogger-escaped-zilch=""> 52)
{
CardNum = 0;
shuff();
}
}
sum += "同花順(Straight Flush)" + (straightFlush/5000).ToString()+"%\n";
sum +=" 四條(Four of a Kind)"+(fourofaKind/5000).ToString()+"%\n";
sum +=" 葫蘆(Fullhouse) "+(fullhouse/5000).ToString()+"%\n";
sum +=" 同花(Flush) "+(flush/5000).ToString()+"%\n";
sum +=" 順子(Straight) "+(straight/5000).ToString()+"%\n";
sum +=" 三條(Three of a kind)"+(threeofakind/5000).ToString()+"%\n";
sum +=" 兩對(Two Pairs) "+(twoPairs/5000).ToString()+"%\n";
sum +=" 一對(One Pair) "+(onePair/5000).ToString()+"%\n";
sum +=" 無對(Zilch) " + (zilch/5000).ToString() + "%\n";
return sum;
}
public int studHi()
{
bubbleCard();
int num=0 ;
for(int i=CardNum+1;iCard[j+1].Number)
{
change(j, j + 1);
}
if(Card[j].Number==Card[j+1].Number&&Card[j].Suit>Card[j+1].Suit)
{
change(j, j + 1);
}
}
}
}
}
[Code Review] Team 02 - Hw05

執行檔在此
Frm_ShowHand.cs(表單)
/********************** Frm_ShowHand.cs **********************/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace HW5
{
public partial class Frm_ShowHand : Form
{
CardDeck Deck = new CardDeck();
StudCard[] Players = new StudCard[2];
ScoreTable Table = new ScoreTable();
TextBox[,] txt_player_cardArray;
/*********** 建構子 ***********/
public Frm_ShowHand()
{
InitializeComponent();
CreateStudCard();
CreateTxtArray();
}
/*********** 控制項函數 ***********/
private void btn_DealOnePlayer_Click(object sender, EventArgs e) // 按鈕 發一副牌
{
Deck.ShufflePartial(5); // 洗5張牌
Deck.Deal(Players[0], 0, 5); // 發牌給玩家0,從第0張起,共5張牌
OnePlayerShowCards(); // 顯示牌面
OnePlayerShowType(); // 顯示牌形
Players[0].Reset(); // 玩家0捨棄手牌
// Test1();
}
private void btn_DealTwoPlayers_Click(object sender, EventArgs e) // 按鈕 發兩副牌
{
Deck.ShufflePartial(10); // 洗10張牌
Deck.Deal(Players[0], 0, 5); // 發牌給玩家0,從第0張起,共5張牌
Deck.Deal(Players[1], 0, 5); // 發牌給玩家1,從第0張起,共5張牌
TwoPlayersShowCards(); // 顯示兩玩家的牌面
TwoPlayersShowType(); // 顯示兩玩家的牌型
ShowWhoWin(); // 顯示贏家
Players[0].Reset(); // 玩家0捨棄手牌
Players[1].Reset(); // 玩家1捨棄手牌
}
private void btn_DealManyTimes_Click(object sender, EventArgs e) // 按鈕 發多副牌
{
Table.Reset(); // 記分板先清空資料
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); // 引用stopwatch物件
sw.Reset(); // 碼表歸零
sw.Start(); // 碼表開始計時
BuildSamples(50000000); // 建立樣本
sw.Stop(); // 碼錶停止
CleanAllTxt(); // 清空顯示欄位
ShowCostTime(sw.Elapsed.TotalMilliseconds); // 印出所花費的總豪秒數
ShowProbability(); // 顯示機率表
}
/*********** 其他函數 ***********/
private void CreateStudCard() // 產生手牌物件
{
for (int i = 0; i < Players.Length; i++)
{
Players[i] = new StudCard();
}
}
private void CreateTxtArray() // 產生txtbox陣列參考
{
txt_player_cardArray = new TextBox[,] {{ txt_player1_card1, txt_player1_card2, txt_player1_card3, txt_player1_card4, txt_player1_card5 },
{ txt_player2_card1, txt_player2_card2, txt_player2_card3, txt_player2_card4, txt_player2_card5 }};
}
private void BuildSamples(int NumberOfSamples) // 建立統計樣本
{
switch (GetAlgorithmsSelectIndex())
{
case -1:
case 0: // 方法0: 二分法,由低至高
for (int i = 0; i < NumberOfSamples; i++) // 50000000次測試
{
Deck.ShufflePartial(5); // 洗5張牌
Deck.Deal(Players[0], 0, 5); // 發牌給玩家0,從第0張起,共5張牌
Table.TypeCount[Players[0].CardType]++; // 記分板紀錄牌形出現次數
Players[0].Reset(); // 玩家0捨棄手牌
}
break;
case 1: // 方法1: 二分法,由高至低
for (int i = 0; i < NumberOfSamples; i++) // 50000000次測試
{
Deck.ShufflePartial(5); // 洗5張牌
Deck.Deal(Players[0], 0, 5); // 發牌給玩家0,從第0張起,共5張牌
Table.TypeCount[Players[0].CardType_By_CheckTypeHighToLow]++; // 記分板紀錄牌形出現次數
Players[0].Reset(); // 玩家0捨棄手牌
}
break;
case 2: // 方法2: 同步判斷法 (不含牌分)
for (int i = 0; i < NumberOfSamples; i++) // 50000000次測試
{
Deck.ShufflePartial(5); // 洗5張牌
Deck.Deal(Players[0], 0, 5); // 發牌給玩家0,從第0張起,共5張牌
Table.TypeCount[Players[0].CardType_By_CheckTypeAllInOne]++; // 記分板紀錄牌形出現次數
Players[0].Reset(); // 玩家0捨棄手牌
}
break;
case 3: // 方法3: 同步判斷法 (含牌分)
for (int i = 0; i < NumberOfSamples; i++) // 50000000次測試
{
Deck.ShufflePartial(5); // 洗5張牌
Deck.Deal(Players[0], 0, 5); // 發牌給玩家0,從第0張起,共5張牌
Table.TypeCount[Players[0].CardType_By_CheckTypeAndGradeAllInOne]++;// 記分板紀錄牌形出現次數
Players[0].Reset(); // 玩家0捨棄手牌
}
break;
case 4: // 方法4: 直接判斷法
for (int i = 0; i < NumberOfSamples; i++) // 50000000次測試
{
Deck.ShufflePartial(5); // 洗5張牌
Deck.Deal(Players[0], 0, 5); // 發牌給玩家0,從第0張起,共5張牌
Table.TypeCount[Players[0].CardType_By_CheckTypeStraightly]++; // 記分板紀錄牌形出現次數
Players[0].ResetTypeAndGrade(); // 玩家0捨棄手牌
}
break;
default:
break;
}
}
/*********** 與介面輸入及輸出相關函數 ***********/
static private string[] TypeString = { "", "Zilch", "One Pair", "Two Pairs", "Three of a Kind", "Straight", "Flush", "Fullhouse", "Four of a Kind", "Straight Flush" };
private void OnePlayerShowCards() // 顯示發一副牌的牌面
{
string s = "";
CleanAllTxt();
for (int i = 0; i < txt_player_cardArray.GetLength(1); i++)
{
s = Players[0].cards[i].RankToStr() + Players[0].cards[i].SuitToStr();
if ((Players[0].cards[i].Suit == 2) || (Players[0].cards[i].Suit == 3))
{
txt_player_cardArray[0, i].ForeColor = Color.Red;
}
else
{
txt_player_cardArray[0, i].ForeColor = Color.Black;
}
txt_player_cardArray[0, i].Text = s;
}
}
private void OnePlayerShowType() // 顯示發一副牌的牌型
{
lbl_Display.Text = TypeString[Players[0].CardType_By_CheckTypeAndGradeAllInOne] + " " + Convert.ToString(Players[0].CardGrade);
// lbl_Display.Text = TypeString[Players[0].CardType_By_CheckType2];
}
private void TwoPlayersShowCards() // 顯示發兩副牌的牌面
{
string s = "";
CleanAllTxt();
for (int i = 0; i < txt_player_cardArray.GetLength(0); i++)
{
for (int j = 0; j < txt_player_cardArray.GetLength(1); j++)
{
s = Players[i].cards[j].RankToStr() + Players[i].cards[j].SuitToStr();
if ((Players[i].cards[j].Suit == 2) || (Players[i].cards[j].Suit == 3))
{
txt_player_cardArray[i,j].ForeColor = Color.Red;
}
else
{
txt_player_cardArray[i,j].ForeColor = Color.Black;
}
txt_player_cardArray[i,j].Text = s;
}
}
}
private void TwoPlayersShowType() // 顯示發兩副牌的牌型
{
lbl_player1display.Text = TypeString[Players[0].CardType_By_CheckTypeAndGradeAllInOne] + " " + Convert.ToString(Players[0].CardGrade);
lbl_player2display.Text = TypeString[Players[1].CardType_By_CheckTypeAndGradeAllInOne] + " " + Convert.ToString(Players[1].CardGrade);
}
private void ShowWhoWin() // 顯示誰贏了
{
if (Players[0].CardType > Players[1].CardType)
{
lbl_Display.Text = "Player1 Won!";
}
else if (Players[0].CardType < Players[1].CardType)
{
lbl_Display.Text = "Player2 Won!";
}
else
{
if (Players[0].CardGrade > Players[1].CardGrade)
{
lbl_Display.Text = "Player1 Won!";
}
else
{
lbl_Display.Text = "Player2 Won!";
}
}
}
private void CleanAllTxt() // 清除所有顯示欄位
{
string s = "";
for (int i = 0; i < txt_player_cardArray.GetLength(0); i++)
{
for (int j = 0; j < txt_player_cardArray.GetLength(1); j++)
{
txt_player_cardArray[i, j].Text = s;
}
}
txt_Display.Text = s;
lbl_Display.Text = s;
lbl_player1display.Text = s;
lbl_player2display.Text = s;
}
private void ShowProbability() // 顯示統計機率
{
double[] prob = Table.Probability();
string s = "";
for (int i = 1; i <= 9; i++)
{
s += TypeString[i] + ": ";
s += Convert.ToString(prob[i]);
s += Environment.NewLine;
}
txt_Display.Text = s;
}
private void ShowCostTime(double CostTime) // 顯示花費時間
{
CostTime /= 1000;
lbl_Display.Text = "時間: " + CostTime.ToString() + " (s)";
}
private int GetAlgorithmsSelectIndex() // 取得演算法的選擇
{
return cmo_AlgorithmsSelect.SelectedIndex;
}
/*********** 測試 ***********/
private void Test1() // 確認是否能出現指定牌形
{
// 測試牌形
while (true)
{
Deck.ShufflePartial(5);
Deck.Deal(Players[0], 0, 5);
if (Players[0].CardType == 7)
break;
else
Players[0].Reset();
}
OnePlayerShowCards();
OnePlayerShowType();
Players[0].Reset();
}
}
}
/********************** StudCard.cs **********************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HW5
{
class StudCard
{
public PokerCard[] cards = new PokerCard[5];
private int[] RankTable = new int[15];
private int cardtype = 0;
private int cardgrade = 0;
public int CardType // 牌形
{
get
{
if (cardtype == 0)
{
SetupRankTable();
CheckType();
}
return cardtype;
}
}
public int CardType_By_CheckTypeHighToLow // 牌形(以二分法,由同花開始)
{
get
{
if (cardtype == 0)
{
SetupRankTable();
CheckTypeHighToLow();
}
return cardtype;
}
}
public int CardType_By_CheckTypeAllInOne // 牌形(以同步判斷法)
{
get
{
if (cardtype == 0)
{
SetupRankTable();
CheckTypeAllInOne();
}
return cardtype;
}
}
public int CardType_By_CheckTypeAndGradeAllInOne // 牌形(以含牌分同步判斷法)
{
get
{
if (cardtype == 0)
{
SetupRankTable();
CheckTypeAndGradeAllInOne();
}
return cardtype;
}
}
public int CardType_By_CheckTypeStraightly // 牌形(以直接判斷法)
{
get
{
if (cardtype == 0)
{
CheckTypeStraightly();
}
return cardtype;
}
}
public int CardGrade // 牌分
{
get
{
if (cardtype == 0)
{
CheckTypeAndGradeAllInOne();
}
else if (cardgrade == 0)
{
CheckGrade();
}
return cardgrade;
}
}
public void Reset() // 丟棄手牌
{
/* 迴圈比較慢
for (int i = 0; i < cards.Length; i++)
{
RankTable[cards[i].Rank] = 0;
// cards[i] = null; // No need in here!
}
*/
RankTable[cards[0].Rank] = 0;
RankTable[cards[1].Rank] = 0;
RankTable[cards[2].Rank] = 0;
RankTable[cards[3].Rank] = 0;
RankTable[cards[4].Rank] = 0;
cardtype = 0;
cardgrade = 0;
}
public void ResetTypeAndGrade() // 初始化牌型與分數
{
cardtype = 0;
cardgrade = 0;
}
private void SetupRankTable() // 紀錄點數出現次數
{
/*
for (int i = 0; i < cards.Length; i++)
{
RankTable[cards[i].Rank]++;
}*/
RankTable[cards[0].Rank]++;
RankTable[cards[1].Rank]++;
RankTable[cards[2].Rank]++;
RankTable[cards[3].Rank]++;
RankTable[cards[4].Rank]++;
RankTable[14] = RankTable[1];
}
private bool isOnePair() // 一對
{
for (int i = 1; i <= 13; i++)
{
if (RankTable[i] > 1)
{
return true;
}
}
return false;
}
private bool isTwoPairs() // 二對
{
for (int i = 1; i <= 12; i++)
{
if (RankTable[i] > 1)
{
if (RankTable[i] > 3)
{
return true;
}
for (int j = i + 1; j <= 13; j++)
{
if (RankTable[j] > 1)
{
return true;
}
}
return false;
}
}
return false;
}
private bool isThreeOfAKind() // 三條
{
for (int i = 1; i <= 13; i++)
{
if (RankTable[i] > 2)
{
return true;
}
}
return false;
}
private bool isStraight() // 順子
{
for (int j = 1; j <= 5; j++)
{
if (RankTable[j] != 1)
{
break;
}
if (j == 5)
{
return true;
}
}
for (int i = 2; i <= 10; i++)
{
if (RankTable[i] == 1)
{
for (int j = i + 1; j <= i + 4; j++)
{
if (RankTable[j] != 1)
{
return false;
}
}
return true;
}
}
return false;
}
private bool isFlush() // 同花
{
int Flush = cards[0].Suit;
for (int i = 1; i < 5; i++)
{
if (cards[i].Suit != Flush)
{
return false;
}
}
return true;
}
private bool isFullhouse() // 葫蘆
{
bool ThreeOfAKind = false;
bool OnePair = false;
int i = 1;
for (i = 1; i <= 13; i++)
{
if (RankTable[i] == 2)
{
OnePair = true;
break;
}
if (RankTable[i] == 3)
{
ThreeOfAKind = true;
break;
}
}
if (OnePair)
{
for (int j = i + 1; j <= 13; j++)
{
if (RankTable[j] == 3)
{
return true;
}
}
}
if (ThreeOfAKind)
{
for (int j = i + 1; j <= 13; j++)
{
if (RankTable[j] == 2)
{
return true;
}
}
}
return false;
}
private bool isFourOfAKind() // 鐵支
{
for (int i = 1; i <= 13; i++)
{
if (RankTable[i] > 3)
{
return true;
}
}
return false;
}
private void CheckType() // 判斷牌型
{
if (isOnePair())
{
if (isTwoPairs())
{
if (isFullhouse())
{
cardtype = 7; // Fullhouse
}
else
{
if (isFourOfAKind())
{
cardtype = 8; // Four Of A Kind
}
else
{
cardtype = 3; // Two Pairs
}
}
}
else
{
if (isThreeOfAKind())
{
cardtype = 4; // Three Of A Kind
}
else
{
cardtype = 2; // One Pair
}
}
}
else
{
if (isStraight())
{
if (isFlush())
{
cardtype = 9; // Straight Flush
}
else
{
cardtype = 5; // Straight
}
}
else
{
if (isFlush())
{
cardtype = 6; // Flush
}
else
{
cardtype = 1; // Zilch
}
}
}
}
private void CheckGrade() // 判斷牌分
{
int RankGrade = 0;
int SuitGrade = 0;
switch (CardType)
{
case 1: // 無對
case 6: // 同花
for (int i = 14; i >= 1; i--)
{
if (RankTable[i] == 1)
{
RankGrade = i;
break;
}
}
break;
case 2: // 一對
case 3: // 二對
for (int i = 14; i >= 1; i--)
{
if (RankTable[i] == 2)
{
RankGrade = i;
break;
}
}
break;
case 4: // 三條
case 7: // 葫蘆
for (int i = 14; i >= 1; i--)
{
if (RankTable[i] == 3)
{
RankGrade = i;
break;
}
}
break;
case 8: // 鐵支
for (int i = 14; i >= 1; i--)
{
if (RankTable[i] == 4)
{
RankGrade = i;
break;
}
}
break;
case 5: // 順子
case 9: // 同花順
if ((RankTable[1]==1)&&(RankTable[2]==1))
{
RankGrade = 5;
}
else
{
for (int i = 14; i >= 1; i--)
{
if (RankTable[i] == 1)
{
RankGrade = i;
break;
}
}
}
break;
default:
RankGrade = 0;
break;
}
RankGrade = (RankGrade - 1) % 13 + 1;
for (int i = 0; i < cards.Length; i++)
{
if ((cards[i].Rank == RankGrade) && ((5 - cards[i].Suit) > SuitGrade))
{
SuitGrade = 5 - cards[i].Suit;
}
}
if (RankGrade == 1)
{
RankGrade += 13;
}
cardgrade = RankGrade * 4 + SuitGrade;
}
private void CheckTypeAllInOne() // 判斷牌型 (同步判斷)
{
for (int i = 14; i >= 1; i--)
{
if (RankTable[i] > 0)
{
switch (RankTable[i])
{
case 1: // 至少是無對
cardtype = 1;
for (int j = i - 1; i >= 1; j--)
{
if (RankTable[j] > 0)
{
switch (RankTable[j])
{
case 1: // 至少是無對
for (int k = j - 1; k >= 1; k--)
{
if (RankTable[k] > 0)
{
switch (RankTable[k])
{
case 1: // 至少是無對
for (int l = k - 1; l >= 1; l--)
{
if (RankTable[l] > 0)
{
switch (RankTable[l])
{
case 1: // 至少是無對
bool isFlushHere = true; // 判斷是否為同花,初始設定為是
int Flush = cards[0].Suit;
for (int m = 1; m < 5; m++)
{
if (cards[m].Suit != Flush)
{
isFlushHere = false; // 不是
}
}
if ((i - 3 == l && RankTable[i - 4] == 1) || // 一般順子
(i - 9== j)) // A2345順子
{
if (isFlushHere) // 同花順
{
cardtype = 9;
}
else // 順子
{
cardtype = 5;
}
}
else if (isFlushHere) // 同花
{
cardtype = 6;
}
goto LeaveThisLoop;
case 2: // 一對
cardtype = 2;
goto LeaveThisLoop;
}
}
}
goto LeaveThisLoop;
case 2: // 一對
cardtype = 2;
goto LeaveThisLoop;
case 3: // 三條
cardtype = 4;
goto LeaveThisLoop;
}
}
}
goto LeaveThisLoop;
case 2: // 至少是一對
cardtype = 2;
for (int k = j - 1; k >= 1; k--)
{
if (RankTable[k] > 0)
{
switch (RankTable[k])
{
case 1: // 一對
goto LeaveThisLoop;
case 2: // 兩對
cardtype = 3;
goto LeaveThisLoop;
}
}
}
goto LeaveThisLoop;
case 3: // 三條
cardtype = 4;
goto LeaveThisLoop;
case 4: // 鐵支
cardtype = 8;
goto LeaveThisLoop;
}
}
}
goto LeaveThisLoop;
case 2: // 至少是一對
cardtype = 2;
for (int j = i - 1; i >= 1; j--)
{
if (RankTable[j] > 0)
{
switch (RankTable[j])
{
case 1: // 至少是一對
for (int k = j - 1; k >= 1; k--)
{
if (RankTable[k] > 0)
{
switch (RankTable[k])
{
case 1: // 一對
goto LeaveThisLoop;
case 2: // 兩對
cardtype = 3;
goto LeaveThisLoop;
}
}
}
goto LeaveThisLoop;
case 2: // 兩對
cardtype = 3;
goto LeaveThisLoop;
case 3: // 葫蘆
cardtype = 7;
goto LeaveThisLoop;
}
}
}
goto LeaveThisLoop;
case 3: // 至少是三條
cardtype = 4;
for (int j = i - 1; i >= 1; j--)
{
if (RankTable[j] > 0)
{
switch (RankTable[j])
{
case 1: // 三條
goto LeaveThisLoop;
case 2: // 葫蘆
cardtype = 7;
goto LeaveThisLoop;
}
}
}
goto LeaveThisLoop;
case 4: // 鐵支
cardtype = 8;
goto LeaveThisLoop;
}
}
}
LeaveThisLoop:
cardgrade = 0;
}
private void CheckTypeAndGradeAllInOne() // 判斷牌型與牌分 (同步判斷)
{
int RankGrade = 0;
int SuitGrade = 0;
for (int i = 14; i >= 1; i--)
{
if (RankTable[i] > 0)
{
switch (RankTable[i])
{
case 1: // 至少是無對
cardtype = 1;
RankGrade = i;
for (int j = i - 1; i >= 1; j--)
{
if (RankTable[j] > 0)
{
switch (RankTable[j])
{
case 1: // 至少是無對
for (int k = j - 1; k >= 1; k--)
{
if (RankTable[k] > 0)
{
switch (RankTable[k])
{
case 1: // 至少是無對
for (int l = k - 1; l >= 1; l--)
{
if (RankTable[l] > 0)
{
switch (RankTable[l])
{
case 1: // 至少是無對
bool isFlushHere = true; // 判斷是否為同花,初始設定為是
int Flush = cards[0].Suit;
for (int m = 1; m < 5; m++)
{
if (cards[m].Suit != Flush)
{
isFlushHere = false; // 不是
break;
}
}
if ((i - 3 == l && RankTable[i - 4] == 1) || // 一般順子
(i - 9 == j)) // A2345順子
{
if (i - 9 == j) // A2345順子, 最大為5
{
RankGrade = 5;
}
else // 一般順子
{
RankGrade = i;
}
if (isFlushHere) // 同花順
{
cardtype = 9;
}
else // 順子
{
cardtype = 5;
}
}
else if (isFlushHere) // 同花
{
cardtype = 6;
RankGrade = i;
}
goto LeaveThisLoop;
case 2: // 一對
cardtype = 2;
RankGrade = l;
goto LeaveThisLoop;
}
}
}
goto LeaveThisLoop;
case 2: // 一對
cardtype = 2;
RankGrade = k;
goto LeaveThisLoop;
case 3: // 三條
cardtype = 4;
RankGrade = k;
goto LeaveThisLoop;
}
}
}
goto LeaveThisLoop;
case 2: // 至少是一對
cardtype = 2;
RankGrade = j;
for (int k = j - 1; k >= 1; k--)
{
if (RankTable[k] > 0)
{
switch (RankTable[k])
{
case 1: // 一對
goto LeaveThisLoop;
case 2: // 兩對
cardtype = 3;
goto LeaveThisLoop;
}
}
}
goto LeaveThisLoop;
case 3: // 三條
cardtype = 4;
RankGrade = j;
goto LeaveThisLoop;
case 4: // 鐵支
cardtype = 8;
RankGrade = j;
goto LeaveThisLoop;
}
}
}
goto LeaveThisLoop;
case 2: // 至少是一對
cardtype = 2;
RankGrade = i;
for (int j = i - 1; i >= 1; j--)
{
if (RankTable[j] > 0)
{
switch (RankTable[j])
{
case 1: // 至少是一對
for (int k = j - 1; k >= 1; k--)
{
if (RankTable[k] > 0)
{
switch (RankTable[k])
{
case 1: // 一對
goto LeaveThisLoop;
case 2: // 兩對
cardtype = 3;
goto LeaveThisLoop;
}
}
}
goto LeaveThisLoop;
case 2: // 兩對
cardtype = 3;
goto LeaveThisLoop;
case 3: // 葫蘆
cardtype = 7;
RankGrade = j;
goto LeaveThisLoop;
}
}
}
goto LeaveThisLoop;
case 3: // 至少是三條
cardtype = 4;
RankGrade = i;
for (int j = i - 1; i >= 1; j--)
{
if (RankTable[j] > 0)
{
switch (RankTable[j])
{
case 1: // 三條
goto LeaveThisLoop;
case 2: // 葫蘆
cardtype = 7;
goto LeaveThisLoop;
}
}
}
goto LeaveThisLoop;
case 4: // 鐵支
cardtype = 8;
RankGrade = i;
goto LeaveThisLoop;
}
}
}
LeaveThisLoop:
RankGrade = (RankGrade - 1) % 13 + 1;
for (int i = 0; i < cards.Length; i++)
{
if ((cards[i].Rank == RankGrade) && ((5 - cards[i].Suit) > SuitGrade))
{
SuitGrade = 5 - cards[i].Suit;
}
}
if (RankGrade == 1)
{
RankGrade += 13;
}
cardgrade = RankGrade * 4 + SuitGrade;
}
private void CheckTypeHighToLow() // 判斷牌型 (二分法,由同花開始)
{
if (isFlush() && isStraight())
{
cardtype = 9;
}
else if (isFourOfAKind())
{
cardtype = 8;
}
else if (isFullhouse())
{
cardtype = 7;
}
else if (isFlush())
{
cardtype = 6;
}
else if (isStraight())
{
cardtype = 5;
}
else if (isThreeOfAKind())
{
cardtype = 4;
}
else if (isTwoPairs())
{
cardtype = 3;
}
else if (isOnePair())
{
cardtype = 2;
}
else
{
cardtype = 1;
}
}
private static int[] PairTable = { 0, 2, 3, 4, 7, 0, 8 }; // 對數與牌型轉換表
private void CheckTypeStraightly() // 判斷牌型 (直接判斷)
{
int PairCount = 0;
for (int i = 0; i < 4; i++)
{
for (int j = i + 1; j < 5; j++)
{
if (cards[i].Rank == cards[j].Rank)
{
PairCount++;
}
}
}
if (PairCount > 0)
{
cardtype = PairTable[PairCount];
}
else
{
bool isFlushHere = true; // 判斷是否為同花,初始設定為是
int Flush = cards[0].Suit;
for (int m = 1; m < 5; m++)
{
if (cards[m].Suit != Flush)
{
isFlushHere = false; // 不是
break;
}
}
int X = cards[0].Rank + cards[1].Rank + cards[2].Rank + cards[3].Rank + cards[4].Rank;
int Y = cards[0].Rank * cards[0].Rank + cards[1].Rank * cards[1].Rank + cards[2].Rank * cards[2].Rank + cards[3].Rank * cards[3].Rank + cards[4].Rank * cards[4].Rank;
if ((5 * Y - X * X == 50) || (X == 47 && Y == 535))
{
if (isFlushHere)
{
cardtype = 9;
}
else
{
cardtype = 5;
}
}
else
{
if (isFlushHere)
{
cardtype = 6;
}
else
{
cardtype = 1;
}
}
}
}
}
}
/********************** CardDeck.cs **********************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HW5
{
class CardDeck
{
private int CardNum = 52;
private int TopIndex = 0;
private PokerCard[] Cards;
private Random rand = new Random();
public CardDeck()
{
Cards = new PokerCard[CardNum];
CreateDeck();
ResetDeck();
}
public void CreateDeck() // 產生卡片
{
for (int i = 0; i < CardNum; i++)
{
Cards[i] = new PokerCard();
}
}
public void ResetDeck() // 復歸初始排列
{
for (int i = 0; i < CardNum; i++)
{
Cards[i].Suit = i / 13 + 1;
Cards[i].Rank = i % 13 + 1;
}
TopIndex = 0;
}
public void Shuffle() // 洗牌
{
int RandNum = 0;
PokerCard TempCard;
for (int i = 0; i < CardNum; i++)
{
RandNum = rand.Next(CardNum);
TempCard = Cards[RandNum];
Cards[RandNum] = Cards[i];
Cards[i] = TempCard;
}
TopIndex = 0;
}
public void ShufflePartial(int Num) // 部分洗牌
{
int RandNum = 0;
PokerCard TempCard;
for (int i = 0; i < Num; i++)
{
RandNum = rand.Next(CardNum);
TempCard = Cards[RandNum];
Cards[RandNum] = Cards[i];
Cards[i] = TempCard;
}
TopIndex = 0;
}
public void Deal(StudCard player, int StartIndex, int NumberOfCards) // 發牌
{
for (int i = StartIndex; i < StartIndex + NumberOfCards; i++)
{
player.cards[i] = Cards[TopIndex];
TopIndex++;
}
}
}
}
/********************** ScoreTable.cs **********************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HW5
{
class ScoreTable
{
public int[] TypeCount = new int[10];
public double[] Probability() // 計算機率
{
int sum = 0;
double[] Prob = new double[10];
for (int i = 0; i < TypeCount.Length; i++)
{
sum += TypeCount[i];
}
for (int i = 0; i < TypeCount.Length; i++)
{
Prob[i] = (double)TypeCount[i] / (double)sum;
}
return Prob;
}
public void Reset() // 清空資料
{
for (int i = 0; i < TypeCount.Length; i++)
{
TypeCount[i] = 0;
}
}
}
}
/********************** PokerCard.cs **********************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HW5
{
class PokerCard
{
public int Suit = 0; //花色
public int Rank = 0; //點數
private static string[] RankTable = {"", "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
private static string[] SuitTable = {"", "♠", "♥", "♦", "♣"};
public string RankToStr() //將點數轉為字串
{
return RankTable[Rank];
}
public string SuitToStr() //將花色轉為字串
{
return SuitTable[Suit];
}
}
}
訂閱:
文章 (Atom)