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

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 开发完毕之后,大家工作之余偷偷开心一下,命令行下划划水。

12123 次点击
所在节点    程序员
107 条回复
iamniconico
2018-11-07 09:55:21 +08:00
@Cbdy json 固然好,我之前也考虑用之,不足的一点是 json 无法传递对象类型,接收方在不知道什么类型的情况下,只能转为 map 结构,数据处理起来不太方便,但是我之后还是会换一种编解码方式的,jvm serialization 局限性太高,影响 ratel client 向 python,shell 发展
qwe61655
2018-11-07 10:30:42 +08:00
收藏了,
bullettrain1433
2018-11-07 10:45:15 +08:00
等消息
loveCoding
2018-11-07 10:47:54 +08:00
@iamniconico #41 pb 序列化吧
iamniconico
2018-11-07 10:47:54 +08:00
ratel 不会让大家久等的
iamniconico
2018-11-07 10:48:54 +08:00
@loveCoding pb 好麻烦的,回头试试,不知道适不适合当前模型
lrh3321
2018-11-07 10:59:03 +08:00
star 了
zclHIT
2018-11-07 11:09:18 +08:00
star 了,坐等 beta test 和 release:)
iamniconico
2018-11-07 11:37:33 +08:00
@zclHIT 感谢支持
tianlang1989
2018-11-07 11:44:58 +08:00
能不能不要有牌的样式 就纯数字就行了
划水利器
先 star 为敬
iamniconico
2018-11-07 11:56:10 +08:00
@tianlang1989 好主意,我会提供主题的修改入口的
tigerZhang
2018-11-07 11:58:54 +08:00
输入 index ,有点蛋疼,能不能通过光标左右选牌
mason961125
2018-11-07 12:00:32 +08:00
工作量严重不饱和!(滑稽
leavan
2018-11-07 12:48:28 +08:00
我觉得可以增加选牌的动态效果。比如输入 2,第二张牌就弹出来...比较直观。
iamniconico
2018-11-07 13:17:46 +08:00
@tigerZhang 命令行版的应该做不了,我会思考一下的
iamniconico
2018-11-07 13:19:38 +08:00
@leavan 优化时会改进一下选牌方案,不过弹出来有点不现实,可能需要 gui 的支持
natforum
2018-11-07 13:30:26 +08:00
cstj0505
2018-11-07 13:32:11 +08:00
@iamniconico 对象类型作为属性放进去,反序列化先去拿到对象类型
iamniconico
2018-11-07 13:41:31 +08:00
@cstj0505 我也这样想过,准备换一种跨平台的方式,优化一下数据传输结构
leavan
2018-11-07 13:45:54 +08:00
@iamniconico 没有不现实吧,你就在字符界面里牌的顶端留一个空白行,弹出来的就把这张牌空白行放到底端就行了

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

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

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

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

© 2021 V2EX