本文是對C#網絡版斗地主的開發總結,同時也是最後一篇。
大家知道,斗地主這個游戲是將一些特有的牌組合成牌組然後來比較牌組的大小,那麼,就應該給PokerGroup類定義一個屬性type,即牌組的類型,type的值是一個枚舉類型
1 public enum PokerGroupType
2 {
3 單張 = 1,
4 對子 = 2,
5 雙王 = 3,
6 三張相同 = 4,
7 三帶一 = 5,
8 炸彈 = 6,
9 五張順子 = 7,
10 六張順子 = 8,
11 三連對 = 9,
12 四帶二 = 10,
13 二連飛機 = 11,
14 七張順子 = 12,
15 四連對 = 13,
16 八張順子 = 14,
17 飛機帶翅膀 = 15,
18 九張順子 = 16,
19 三連飛機 = 17,
20 五連對 = 18,
21 十張順子 = 19,
22 十一張順子 = 20,
23 十二張順子 = 21,
24 四連飛機 = 22,
25 三連飛機帶翅膀 = 23,
26 六連對 = 24,
27 //沒有13
28 七連對 = 25,
29 五連飛機 = 26,
30 八連對 = 27,
31 四連飛機帶翅膀 = 28,
32 //沒有17
33 九連對 = 29,
34 六連飛機 = 30,
35 //沒有19
36 十連對 = 31,
37 五連飛機帶翅膀 = 32
38
39
40 //下面是各種牌組對應的牌的張數
41 //單張 = 1,
42 //對子 = 2,
43 //雙王 = 2,
44 //三張相同 = 3,
45 //三帶一 = 4,
46 //炸彈 = 4,
47 //五張順子 = 5,
48 //六張順子 = 6,
49 //三連對 = 6,
50 //四帶二 = 6,
51 //二連飛機 = 6,
52 //七張順子 = 7,
53 //四連對 = 8,
54 //八張順子 = 8,
55 //飛機帶翅膀 = 8,
56 //九張順子 = 9,
57 //三連飛機 = 9,
58 //五連對 = 10,
59 //十張順子 = 10,
60 //十一張順子 = 11,
61 //十二張順子 = 12,
62 //四連飛機 = 12,
63 //三連飛機帶翅膀 = 12,
64 //六連對 = 12,
65 ////沒有13
66 //七連對 = 14,
67 //五連飛機 = 15,
68 //八連對 = 16,
69 //四連飛機帶翅膀 = 16,
70 ////沒有17
71 //九連對 = 18,
72 //六連飛機 = 18,
73 ////沒有19
74 //十連對 = 20,
75 //五連飛機帶翅膀 = 20
76 }
當玩家出牌時,首先應判斷玩家的牌組類型。
我判斷牌組類型的方法是根據玩家所出牌組張數的不同來做出不同的處理。比如,玩家出的牌只有一張,那麼肯定是個子。如果有兩張肯定是對子。如果有三張,肯定是三個。如果有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方法給牌組定義一個類型,自己出牌的時候也定義一個類型,再在出牌的時候比較倆牌組的大小。
本文配套源碼