當玩家出牌時,首先應判斷玩家的牌組類型。
我判斷牌組類型的方法是根據玩家所出牌組張數的不同來做出不同的處理。比如,玩家出的牌只有一張,那麼肯定是個子。如果有兩張肯定是對子。如果有三張,肯定是三個。如果有6張呢?就有三種情況了:1、順子。2、連對。、3、飛機。由於順子,連對,飛機這三種牌可以有很多組合,順子可以有6張順子或者7張順子,連對可以有4連對或者5連對。飛機可以有2連飛機,三連飛機。所以就需要寫幾個方法分別判斷牌組是否為順子,連對,飛機了。
順子和對子很好判斷,飛機就麻煩點了,由於飛機可以隨便帶一張或幾張牌,如果帶的牌的點數比飛機本身的點數大,那麼大的那張牌就被排序到飛機前面了,這樣對比較牌組的大小很不方便。所以還要有一個對飛機帶翅膀這樣的牌組進行排序的方法。
判斷牌組類型的代碼下載地址:
無序的牌組通過以上代碼的洗禮,已經變成了非常容易比較的牌組了。
比較牌組的大小就非常簡單了。首先排除特殊牌組炸彈,雙王。
然後再比較普通牌組的第一張牌就可以了。下面是牌組比較的代碼,重寫了PokerGroup的大於號運算符
public static bool Operator >(PokerGroup LP, PokerGroup RP)
{
bool IsGreater = false;
if (LP.type != RP.type && LP.type != PokerGroupType.炸彈 && LP.type != PokerGroupType.雙王)
{
IsGreater = false;
}
else
{
if (LP.type == PokerGroupType.炸彈 && RP.type == PokerGroupType.炸彈) //LPRP都為炸彈
{
if (LP[0] > RP[0]) //比較大小
{
IsGreater = true;
}
else
{
IsGreater = false;
}
}
else
{
if (LP.type == PokerGroupType.炸彈) //只有LP為炸彈
{
IsGreater = true;
}
else
{
if (LP.type == PokerGroupType.雙王) //LP為雙王
{
IsGreater = true;
}
else
{
if (LP[0] > RP[0]) //LP為普通牌組
{
IsGreater = true;
}
else
{
IsGreater = false;
}
}
}
}
}
return IsGreater;
}
然後在接收其他玩家牌組的時候調用IsRule方法給牌組定義一個類型,自己出牌的時候也定義一個類型,再在出牌的時候比較倆牌組的大小。
本文配套源碼