Java寫的鬥地主遊戲原始碼
原始碼下載在最後
我們的前年的課設要求做一個鬥地主程式,當時正在愁如何做介面,當時剛好在學習C#,於是就用C#完成了這個程式。
一方面,當時我C#功底還很差(其實現在也不怎麼樣),很多地方用了“笨辦法”,實現的比較幼稚,程式效率很低,另一方面感覺很對不起老師,因為做這個程式的本意是研究鬥地主程式的AI出牌等等演算法相關的東西,而我卻幾乎忽略了這些內容。(我會好好學習演算法的……^-^)
最可怕的是,由於當時時間比較緊,只有幾天的時間,所以我本著“能跑就行”的想法完成了這個程式。從程式本身來說,我覺得我的程式碼幾乎沒有任何參考價值,滿篇的switch...case...,亂七八糟的結構,而且最可怕的是,所有程式碼幾乎都集中在了一個mainform.xaml.cs檔案裡。。。太恐怖了。我一直為我會寫出這樣的程式碼感到羞恥……因此也就沒敢釋出這些原始碼。
最近又在研究Java,做另外的專案,看了看以前的程式碼,覺得雖然程式碼很爛,但有些地方的處理還是有一定意義的,畢竟這也算是個中小遊戲應用,於是又用JAVA重寫了一遍,發上來和大家分享。如果能對你的學習或者工作起到任何作用,我都會非常高興。
此原始碼完全自由使用,你可以利用它做任何事情,包括商業應用,而不需要提前通知我。
這次採用的是JAVA8 ,最新發布的JAVA版本,
IDE是netbeans,一共有80MB左右大小,體積不大,安裝也容易
程式資料夾結構是從C#轉過來的,期間使用一個叫C#轉JAVA的工具,轉換了一下語法,效果不是很理想,還是手工改了許多地方
可以看到,程式是從Program.java啟動(和VS的專案一樣)
遊戲是網頁版聯機的,因此分服務端和客戶端二部分,
服務端JAVA包括鬥地主邏輯服務 和 記錄服務(生成SQL語句發給資料庫)
遊戲客戶端 -》 鬥地主邏輯服務 - 》 記錄服務 -》 資料庫
《- 《- 《-
客戶端發訊息到鬥地主邏輯,鬥地主邏輯轉發到記錄服務,再返回來,這樣一個通訊過程
分成邏輯和記錄二部分的好處是 可以並行執行提高效率,比如在SQL語句執行時,鬥地主邏輯可以繼續處理請求
現在開始構架遊戲,為了不讓程式碼那麼難看,我們很有必要加入設計模式和麵向物件思想。
首先,我們列出54張牌。
大家可以看到,撲克數字相同時,有4種花色,桃心梅方
利用這個特性,我們採用了數字間隔,0-3一組 , 4-7一組,如果想得到花色,取模就可以了,是不是很方便?
1 /**
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;
在PaiBoardByDdz類中,負責生成新牌和洗牌操作。我的思想是這樣的,先通過演算法按順序生成54張牌,然後隨機抽取這些牌,被抽取的牌從原來集合中刪除,直到所有的牌都被抽取完畢為止,從而達到洗牌的目的。參考如下程式碼:可以看出生成新牌的時候使用了增強的隨機數。
/**
洗牌
*/
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緩動可以很容易實現。
客戶端採用了FLASH編寫,IDE為Flash Builder,語言則換成了AS3,由於本篇主講JAVA,因此這裡略過。
唯一需要注意的是,為保證程式程式碼的一致性,基本都是JAVA寫好後,直接複製到客戶端那邊,這樣省了建模欄位不一樣,或者名稱不一致的問題
這個遊戲採用了外掛設計, 目前可以整合DISCUZ,
自已不需要獨立的資料庫,共用DISCUZ的,
需要使用的童鞋,先架設好DISCUZ和MYSQL資料庫(可以用WAMP整合環境)
成品下載地址
http://pan.baidu.com/s/1gdjOIYZ
獨立資料庫,需要VPS或獨立主機一臺,有獨立外網IP
可與論壇放同一主機,或分開放也可(共用論壇的資料庫)
安裝說明
1.將鬥地主客戶端所有檔案 拷貝到論壇根目錄
2.在伺服器上安裝好Java 8
修改DdzServer、RecordServer 目錄裡的run.bat,將裡面路徑修改為當前路
RecordServer 引數還包括連線論壇MYSQL資料庫的使用者名稱,密碼等
依次啟動DdzServer,RecordServer 和SecurityServer安全策略服務
支援win,Linux作業系統,
Linux在terminal上輸入 sudo java -jar 完整路徑
*需要伺服器開放9300 ,843 TCP埠
3.在瀏覽器輸入 http://你的網址/ddz.php 開始遊戲
可多人同時玩,有排行榜,可聊天
原始碼
https://github.com/wdmir/521266750_qq_com.git
轉載請註明本文地址:Java寫的鬥地主遊戲原始碼
相關文章
- Java鬥地主專案碎片Java
- springboot+Java+cocos creater鬥地主,麻將非常的完整棋牌遊戲專案Spring BootJava遊戲
- 遊戲《鬥遊鬥地主》被撤銷出版物號,為今年首款遊戲
- Python魂鬥羅小遊戲原始碼Python遊戲原始碼
- Python鬥地主Python
- 使用Java實現簡單的鬥地主案例Java
- 用Python寫個魂鬥羅,另附30個Python小遊戲原始碼Python遊戲原始碼
- Python 三人鬥地主程式碼Python
- 模擬鬥地主
- 8、用java的ArrayList集合完成模擬鬥地主案例Java
- 用鬥地主的例項學會使用java Collections工具類Java
- 射擊遊戲的原始模型——牛仔決鬥遊戲模型
- 自己實現鬥地主引擎
- 賽博鬥地主——使用大語言模型扮演Agent智慧體玩牌類遊戲。模型智慧體遊戲
- 用Python破解鬥地主殘局Python
- 鬥地主產品問鼎小遊戲榜單 位元組跳動超休閒遊戲仍受歡迎遊戲
- 一款“鬥地主”遊戲靠位元組跳動的流量空降免費榜TOP1遊戲
- 《鬼鬥》Steam: “純粹”的格鬥遊戲遊戲
- Golang多執行緒簡單鬥地主Golang執行緒
- 宮鬥遊戲,另類財富密碼遊戲密碼
- 趁老王不在,和隔壁鄰居鬥鬥地主,比比大小
- 文字格鬥遊戲遊戲
- 手寫 Java HashMap 核心原始碼JavaHashMap原始碼
- Map實現鬥地主發牌有序版二
- 【180720】打字遊戲原始碼遊戲原始碼
- 遊戲戰鬥的設計分析遊戲
- 從零開始:用REACT寫一個格鬥遊戲(二)React遊戲
- 從零開始:用REACT寫一個格鬥遊戲(一)React遊戲
- Java 讀寫鎖 ReentrantReadWriteLock 原始碼分析Java原始碼
- java原始碼-ReentrantReadWriteLock寫鎖介紹Java原始碼
- 簡易撲克牌遊戲JAVA原始碼_新手上路遊戲Java原始碼
- xss小遊戲原始碼分析遊戲原始碼
- 2月小遊戲Top 20:棋牌整體大漲,歡樂鬥地主第一,《我不是豬頭》成黑馬遊戲
- 直播原始碼網站,直播間小遊戲java遞迴的實現方式原始碼網站遊戲Java遞迴
- 當官、宮鬥哪家強?淺談官鬥遊戲的前世今生遊戲
- 女性宮鬥遊戲的飯好恰嗎?遊戲
- 騰訊遊戲掃碼登入原始碼遊戲原始碼
- 無法超越的怪獵系列,關於共鬥遊戲的戰鬥思考遊戲