命令列版的鬥地主你玩過沒?
本文適合有 Java 基礎知識的人群,跟著本文可使用和快速搭建命令列鬥地主專案。
本文作者:HelloGitHub-秦人
HelloGitHub 推出的《講解開源專案》系列,今天給大家帶來一款命令列鬥地主開源專案—— ratel
專案原始碼地址:https://github.com/ainilili/ratel
一、專案簡介
鬥地主我想大家都會玩吧,今天分享一個 Java 命令列鬥地主的開源專案!專案是基於 Netty 實現,Netty 是一個高效能、非同步事件驅動的 NIO 框架。下面就讓我們一起來把這個專案跑起來,然後看看它的程式碼。
二、專案結構
專案目錄結構如下圖:
目錄說明:
- 客戶端:
landlords-client
- event:客戶端事件包
- handle:客戶端事件處理包
- SimpleClient:客戶端啟動程式
- 基礎包:
landlords-common
- channel:管道工具包
- entity:實體類目錄
- enums:列舉型別目錄
- exception:異常處理目錄
- handler:業務處理,包含訊息轉碼工具類
- helper:工具類包,包括時間工具類等
- print:列印工具包目錄,包括格式化輸出的工具類
- robot:機器人出牌目錄,人機對戰時使用
- transfer:型別轉換工具包目錄
- utils:基礎工具類,包括集合、正則等工具類
- 服務端:
landlords-server
- event:服務端端事件包
- handler:客戶端事件處理包
- robot:機器人出牌目錄,人機對戰時使用
- timer:定時任務目錄,計算房間存活時間。
- SimpleServer:服務端啟動程式
- 伺服器配置
serverlist.json
:預設配置
三、實戰操作
3.1 執行專案
構建專案
git clone https://github.com/ainilili/ratel.git cd ratel mvn install package
執行客戶端和服務端
java -jar landlords-server/target/landlords-server-1.1.0.jar -p 1024 java -jar landlords-client/target/landlords-client-1.1.0.jar -p 1024 -h 127.0.0.1
- 客戶端執行效果
- 服務端執行效果
3.2 開始鬥地主
客戶端、服務端都已啟動,我們就可以開始娛樂一下了。
進入遊戲有三個選單:
- 真人模式(PvP):需要三個人加入房間,才可以開始。
- 人機模式(PvE):一個人加入,其他兩個人是機器。
- 設定(Setting):可以設定卡牌的顯示樣式。
執行效果如下:
注意
- 小王是
S
,大王為X
。 - 牌的別名
poker-> |10 |J |Q |K |A |2 |S |X | alias-> |T t 0|J j|Q q|K k|A a 1|2 |S s|X x|
四、工作原理
4.1 Netty 工作原理
以server
為例:
初始化建立 2 個
EventLoopGroup
,其中parentGroup
用於 Accetpt 連線建立事件並分發請求。childGroup
用於處理 I/O 讀寫事件和業務邏輯。基於
ServerBootstrap
(服務端啟動引導類),配置EventLoopGroup
、Channel
型別,連線引數、配置入站、出站事件handler
繫結埠,開始工作
4.2 命令列執行
java -jar xxx.jar -p/port 1024
看到 Server
的入口方法可知,-p 1024
是通過入口 main
接引數的。-p
和 -port
都表示為埠。
public static void main(String[] args) throws InterruptedException {
if(args != null && args.length > 1) {
if(args[0].equalsIgnoreCase("-p") || args[0].equalsIgnoreCase("-port")) {
ServerContains.port = Integer.valueOf(args[1]);
}
}
}
4.3 鬥地主規則
鬥地主的規則檔案是:landlords-common/helper/PorkerHelper.java
distributePoker
方法是構建發牌的集合。撲克牌共 54 張,分成 3 堆 17 張和一堆 3 張。
public static List<List<Poker>> distributePoker(){
Collections.shuffle(basePokers);
List<List<Poker>> pokersList = new ArrayList<List<Poker>>();
List<Poker> pokers1 = new ArrayList<>(17);
pokers1.addAll(basePokers.subList(0, 17));
List<Poker> pokers2 = new ArrayList<>(17);
pokers2.addAll(basePokers.subList(17, 34));
List<Poker> pokers3 = new ArrayList<>(17);
pokers3.addAll(basePokers.subList(34, 51));
List<Poker> pokers4 = new ArrayList<>(3);
pokers4.addAll(basePokers.subList(51, 54));
pokersList.add(pokers1);
pokersList.add(pokers2);
pokersList.add(pokers3);
pokersList.add(pokers4);
for(List<Poker> pokers: pokersList) {
sortPoker(pokers);
}
return pokersList;
}
五、最後
俗話說:興趣是學習的老師,當一個人對做一件事產生興趣時,慢慢地就開始喜歡這件事。程式設計也是一樣的。也許你覺得程式設計很枯燥,那是因為你覺得程式設計這件事讓你產生不了興趣。那麼如何讓我們對程式設計產生興趣呢?那就回到本文的主旨,通過我的內容分享,讓更多的朋友感受到開源專案的魅力,由而對程式設計產生興趣。
教程至此,你應該也能快速搭建鬥地主專案了。程式設計是不是也特別有意思呢?快邀請你的小夥伴一起加入到命令列鬥地主的專案和樂趣中吧~
六、參考資料
Netty原理框架
Netty 入門初體驗
『講解開源專案系列』——讓對開源專案感興趣的人不再畏懼、讓開源專案的發起者不再孤單。跟著我們的文章,你會發現程式設計的樂趣、使用和發現參與開源專案如此簡單。歡迎留言聯絡我們、加入我們,讓更多人愛上開源、貢獻開源~