命令行版的鬥地主你玩過沒?

本文適合有 Java 基礎知識的人羣,跟着本文可以使用和快速搭建命令行鬥地主項目。java

本文做者:HelloGitHub-秦人git

HelloGitHub 推出的《講解開源項目》系列,今天給你們帶來一款命令行鬥地主開源項目—— ratelgithub

項目源碼地址:https://github.com/ainilili/ratel編程

1、項目簡介

鬥地主我想你們都會玩吧,今天分享一個 Java 命令行鬥地主的開源項目!項目是基於 Netty 實現,Netty 是一個高性能、異步事件驅動的 NIO 框架。下面就讓咱們一塊兒來把這個項目跑起來,而後看看它的代碼。json

2、項目結構

項目目錄結構以下圖:bash

目錄說明:服務器

  1. 客戶端:landlords-client
    • event:客戶端事件包
    • handle:客戶端事件處理包
    • SimpleClient:客戶端啓動程序
  2. 基礎包:landlords-common
    • channel:管道工具包
    • entity:實體類目錄
    • enums:枚舉類型目錄
    • exception:異常處理目錄
    • handler:業務處理,包含消息轉碼工具類
    • helper:工具類包,包括時間工具類等
    • print:打印工具包目錄,包括格式化輸出的工具類
    • robot:機器人出牌目錄,人機對戰時使用
    • transfer:類型轉換工具包目錄
    • utils:基礎工具類,包括集合、正則等工具類
  3. 服務端:landlords-server
    • event:服務端端事件包
    • handler:客戶端事件處理包
    • robot:機器人出牌目錄,人機對戰時使用
    • timer:定時任務目錄,計算房間存活時間。
    • SimpleServer:服務端啓動程序
  4. 服務器配置 serverlist.json:默認配置

3、實戰操做

3.1 運行項目

  1. 構建項目
    git clone https://github.com/ainilili/ratel.git cd ratel mvn install package框架

  2. 運行客戶端和服務端
    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):能夠設置卡牌的顯示樣式。

運行效果以下:

注意

  1. 小王是S,大王爲X
  2. 牌的別名
    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、工做原理

4.1 Netty 工做原理

server爲例:

  1. 初始化建立 2 個 EventLoopGroup,其中 parentGroup 用於 Accetpt 鏈接創建事件並分發請求。childGroup 用於處理 I/O 讀寫事件和業務邏輯。

  2. 基於 ServerBootstrap (服務端啓動引導類),配置 EventLoopGroupChannel 類型,鏈接參數、配置入站、出站事件 handler

  3. 綁定端口,開始工做

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;
}

5、最後

俗話說:興趣是學習的老師,當一我的對作一件事產生興趣時,慢慢地就開始喜歡這件事。編程也是同樣的。也許你以爲編程很枯燥,那是由於你以爲編程這件事讓你產生不了興趣。那麼如何讓咱們對編程產生興趣呢?那就回到本文的主旨,經過個人內容分享,讓更多的朋友感覺到開源項目的魅力,由而對編程產生興趣。

教程至此,你應該也能快速搭建鬥地主項目了。編程是否是也特別有意思呢?快邀請你的小夥伴一塊兒加入到命令行鬥地主的項目和樂趣中吧~

6、參考資料


『講解開源項目系列』——讓對開源項目感興趣的人再也不畏懼、讓開源項目的發起者再也不孤單。跟着咱們的文章,你會發現編程的樂趣、使用和發現參與開源項目如此簡單。歡迎留言聯繫咱們、加入咱們,讓更多人愛上開源、貢獻開源~

相關文章
相關標籤/搜索