闲来无事,写一个命令行版的斗地主

2018-11-06 21:50:10 +08:00
 iamniconico

我将之命名为 ratel,对,没错,平头哥,就是这么霸气(怂

在发这篇主题的时候,ratel 还在开发的最后阶段,已经完成了基本的交互和游戏环节,有待优化,这里放出技术栈:

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

整个流程不难,首先,我需要将客户端和服务端搭起来,netty 提供着简洁的 api,可以快速的部署服务端和客户端,所以这个环节没有任何难度!一个简单的结构图如下:

通讯这一块搞定,接下来要思考的问题就是如何进行互动,这个问题将会引发出更深层的问题?

作为一个正在开发的项目,更多的难以解决的疑难杂症还等待着我去发现,本帖也将持续更新至 ratel 完结。

针对于以上问题的思考之后,我决定将数据持久化在内存中(要考虑 jvm 会不会 gc 掉,所以这里使用 final 修饰 static ),服务端抽象出Room - 游戏房间,ClientSide - 客户端信息Poker - 结构这三个最主要的数据结构,网路逐渐变得复杂起来

详细结构如下

Room{				Client{				Poker{
 int 唯一标识			int 唯一标识			int 大小
 int 状态			int 房间标识			int 花色
 map 客户端字典			str 昵称			}
 list 客户端列表			list 手持牌
 int 地主标识			int 状态
 int 地主牌			int 类型(农民|地主)
 struct 上次出手的信息		client 下手
 int 上次出手人			client 上手
}				}

每当一个客户端连接时,将会构造一个 Client 对象,分配一个唯一的标识供服务端识别,Room 由客户端建立,并且在此基础之上,其他客户端可以加入已创建且状态未满的房间,当游戏开始后,将会为房间中的所有客户端派发 Poker。

这种流程看似可行,按照这种模式,ratel 由 0 走到了 1

但 ratel 的重点并不止于此,各种问题(网络,安全,用户体验等)还有待解决。

ratel 开发完毕之后,大家工作之余偷偷开心一下,命令行下划划水。

12185 次点击
所在节点    程序员
107 条回复
iamniconico
2018-11-07 15:27:01 +08:00
@realpg 可以的,不过 X 我准备用来表示大王
MrUser
2018-11-07 15:43:46 +08:00
大王大写 W,小王小写 w
abmin521
2018-11-07 16:02:01 +08:00
前排预定
Kirscheis
2018-11-07 16:10:24 +08:00
nb,插个眼
wsstest
2018-11-07 16:44:49 +08:00
坐等,更新求艾特
q397064399
2018-11-07 17:07:36 +08:00
现在搞个 Java 依赖是真的多,一下子 springboot 全家桶 全来了
ginux
2018-11-07 17:15:30 +08:00
服务端的高并发考虑是怎么处理的
iamniconico
2018-11-07 17:25:55 +08:00
@ginux
高并发危险点主要在于加入房间这一块,不过也简单,对 status 加 volatile 修饰,处理事件时判断一下,创建房间的 id 分配采用 AtomicInteger 生成 id,客户端的 id 则直接采用 channel 的 socketAddress 在服务端的应用端口。

当然还有一些未知的并发问题和安全问题,之后会加强优化
iamniconico
2018-11-07 17:27:16 +08:00
@q397064399 是的,应用体积太膨胀了,很多公司都自研框架,当然我也有一套
https://github.com/ainilili/no-framework
q397064399
2018-11-07 17:30:27 +08:00
@iamniconico #89 还有目前我都没跑起来你那个程序. 把打包上传到 maven 的跟使用的 隔离开来吧 或者写个打包运行的描述也好.
susucoolsama
2018-11-07 18:07:34 +08:00
lei 了,想法不错啊,有木有智障对手的设定。
iamniconico
2018-11-07 18:53:56 +08:00
@q397064399 不好意思,给你发个 demo 地址
https://gitee.com/ainilili/CoffeeTime
iamniconico
2018-11-07 18:54:42 +08:00
@wsstest 已更新,看附言<(_ _)>
dinjufen
2018-11-07 19:02:40 +08:00
看完了我想写一个 GUI 的斗地主,但感觉好难
iamniconico
2018-11-07 19:19:12 +08:00
@susucoolsama 说出你的想法
waruqi
2018-11-07 19:36:59 +08:00
纯字符?还是用 tui?
iamniconico
2018-11-07 19:47:30 +08:00
@waruqi 纯文字
mseasons
2018-11-07 19:49:28 +08:00
有意思,我去用 Python3 弄一个
lexuskingxx
2018-11-07 20:16:26 +08:00
牛 13 了
iamniconico
2018-11-07 22:38:37 +08:00
@mseasons 我准备将服务端做成通用的,以后你可以考虑用 py 写客户端<(_ _)>

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/505162

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX