前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >命令行版的斗地主你玩过没?

命令行版的斗地主你玩过没?

作者头像
HelloGitHub
发布2021-05-14 15:35:41
4620
发布2021-05-14 15:35:41
举报
文章被收录于专栏:HelloGitHub

本文适合有 Java 基础知识的人群,跟着本文可使用和快速搭建命令行斗地主项目。

本文作者:HelloGitHub-秦人

HelloGitHub 推出的《讲解开源项目》系列,今天给大家带来一款命令行斗地主开源项目—— ratel

项目源码地址: https://github.com/ainilili/ratel

一、项目简介

斗地主我想大家都会玩吧,今天分享一个 Java 命令行斗地主的开源项目!项目是基于 Netty 实现,Netty 是一个高性能、异步事件驱动的 NIO 框架。下面就让我们一起来把这个项目跑起来,然后看看它的代码。

二、项目结构

项目目录结构如下图:

目录说明:

  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.1 运行项目

构建项目

代码语言:javascript
复制
git clone https://github.com/ainilili/ratel.git
cd ratel
mvn install package

运行客户端和服务端

代码语言:javascript
复制
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

牌的别名

代码语言:javascript
复制
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为例:

  1. 初始化创建 2 个 EventLoopGroup,其中 parentGroup 用于 Accetpt 连接建立事件并分发请求。childGroup 用于处理 I/O 读写事件和业务逻辑。
  2. 基于 ServerBootstrap (服务端启动引导类),配置 EventLoopGroupChannel 类型,连接参数、配置入站、出站事件 handler
  3. 绑定端口,开始工作

4.2 命令行运行

代码语言:javascript
复制
java -jar xxx.jar -p/port 1024

看到 Server 的入口方法可知,-p 1024 是通过入口 main 接参数的。-p-port 都表示为端口。

代码语言:javascript
复制
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 张。

代码语言:javascript
复制
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 入门初体验
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 HelloGitHub 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、项目简介
  • 二、项目结构
  • 三、实战操作
    • 3.1 运行项目
      • 3.2 开始斗地主
      • 四、工作原理
        • 4.1 Netty 工作原理
          • 4.2 命令行运行
            • 4.3 斗地主规则
            • 五、最后
            • 六、参考资料
            相关产品与服务
            云服务器
            云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档