Java寫的鬥地主遊戲源碼
源碼下載在最後
現在開始構架遊戲,爲了不讓代碼那麼難看,我們很有必要加入設計模式和麪向對象思想。
首先,我們列出54張牌。
大家可以看到,撲克數字相同時,有4種花色,桃心梅方
利用這個特性,我們採用了數字間隔,0-3一組 , 4-7一組,如果想得到花色,取模就可以了,是不是很方便?
/**
2 * 背面牌都是負數
3 */
4 public static final int BG_NORMAL = -3;
5 public static final int BG_NONGMING = -2;
6 public static final int BG_DIZHU = -1;
7
8 public static final int F_3 = 0;
9 public static final int M_3 = 1;
10 public static final int X_3 = 2;
11 public static final int T_3 = 3;
12
13 public static final int F_4 = 4;
14 public static final int M_4 = 5;
15 public static final int X_4 = 6;
16 public static final int T_4 = 7;
17
18 public static final int F_5 = 8;
19 public static final int M_5 = 9;
20 public static final int X_5 = 10;
21 public static final int T_5 = 11;
22
23 public static final int F_6 = 12;
24 public static final int M_6 = 13;
25 public static final int X_6 = 14;
26 public static final int T_6 = 15;
27
28 public static final int F_7 = 16;
29 public static final int M_7 = 17;
30 public static final int X_7 = 18;
31 public static final int T_7 = 19;
32
33 public static final int F_8 = 20;
34 public static final int M_8 = 21;
35 public static final int X_8 = 22;
36 public static final int T_8 = 23;
37
38 public static final int F_9 = 24;
39 public static final int M_9 = 25;
40 public static final int X_9 = 26;
41 public static final int T_9 = 27;
42
43 public static final int F_10 = 28;
44 public static final int M_10 = 29;
45 public static final int X_10 = 30;
46 public static final int T_10 = 31;
47
48 public static final int F_J = 32;
49 public static final int M_J = 33;
50 public static final int X_J = 34;
51 public static final int T_J = 35;
52
53 public static final int F_Q = 36;
54 public static final int M_Q = 37;
55 public static final int X_Q = 38;
56 public static final int T_Q = 39;
57
58 public static final int F_K = 40;
59 public static final int M_K = 41;
60 public static final int X_K = 42;
61 public static final int T_K = 43;
62
63 public static final int F_A = 44;
64 public static final int M_A = 45;
65 public static final int X_A = 46;
66 public static final int T_A = 47;
67
68 public static final int F_2 = 56;
69 public static final int M_2 = 57;
70 public static final int X_2 = 58;
71 public static final int T_2 = 59;
72
73 public static final int JOKER_XIAO = 60;
74 public static final int JOKER_DA = 64;
/**
洗牌
*/
public final void xipai()
{
//
reset();
//
int i = 0;
int len = 0;
int n = 0;
//clone pai name
java.util.ArrayList<String> p = PAI_NAME.GetList();
//第一次發17張牌
len = 17;
//提高隨機數不重複概率的種子生成方法:
//Millisecond 取值範圍是 0 - 999
//DateTime.Now.Ticks是指從1970年1月1日(具體哪年忘了哈,好像是1970)開始到目前所經過的毫秒數——刻度數。
//54張牌的組合是 54!
//是一個非常大的數,結果是: 2.3e + 71
//因此我們的seed的取值範圍也應該非常大,也就是0到上面的結果,
//Millisecond小了,導致只會出現999種牌的組合
//guid方法不可取,每回都是一樣的
//直接以Random做爲隨機數生成器因爲時鐘精度問題,
//在一個小的時間段內會得到同樣的僞隨機數序列,
//你shuffle後會得到同一個結果。
//.net提供了RNGCryptoServiceProvider可以避免這種情況
//GetRandSeed後的取值範圍是 0 - int32.MaxValue,雖然還差很遠,但是999要好很多
java.util.Random r = new java.util.Random(RandomUtil.GetRandSeed());
for (i = 0; i < len; i++)
{
n = r.nextInt(p.size());
grid[0][i] = p.get(n);
p.remove(n);
}
for (i = 0; i < len; i++)
{
n = r.nextInt(p.size());
grid[1][i] = p.get(n);
p.remove(n);
}
for (i = 0; i < len; i++)
{
n = r.nextInt(p.size());
grid[2][i] = p.get(n);
p.remove(n);
} //end for
//底牌
grid2[0] = p.get(0);
grid2[1] = p.get(1);
grid2[2] = p.get(2);
//distory
p.clear();
}
過Win7的紙牌遊戲的朋友,一定對於遊戲中的發牌動畫記憶深刻,現在我們自己來實現這個動畫過程。提到發牌動畫,90%的程序員肯定會想到利用位置(Location)的變化來刷新界面,可能需要啓用一些線程或者計時器之類的。但是Flash天生就是用來做動畫的,用Tween緩動可以很容易實現。
源碼
https://github.com/wdmir/521266750_qq_com.git