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

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

12124 次点击
所在节点    程序员
107 条回复
kulove
2018-11-07 13:48:47 +08:00
直接输牌数字也行吧?比如对 2,是 2 2,三带一是,9 9 9 6.。
iamniconico
2018-11-07 13:50:59 +08:00
@leavan 命令行打印只能 append,不能 modify 之前已经输出的,所以做不到的
crab
2018-11-07 13:51:28 +08:00
给阿姨倒杯卡布奇诺
leavan
2018-11-07 13:52:05 +08:00
最好能做一个光标,不需要鼠标,用类似 Vim 的操作模式,然后空格弹出或弹回某张牌,回车出牌,操作模式会简单很多。对这种精致的小项目很喜欢,已 star,不过不太喜欢这种交互性比较少的出牌方式,期待改进哈~
iamniconico
2018-11-07 13:53:25 +08:00
@kulove 主意不错,这样方便选取,感谢
Skifary
2018-11-07 13:54:14 +08:00
@natforum 莫名其妙的笑到不停
leavan
2018-11-07 13:54:33 +08:00
@iamniconico 我记得是有方法的,你去搜一下某些进度条的实现方式...
iamniconico
2018-11-07 13:54:40 +08:00
@leavan 感谢,之后会扩展客户端至其他平台,可能 linux 的 shell 下就可以实现你说的
iamniconico
2018-11-07 13:55:38 +08:00
@crab 作者是男的,只是爱好动漫
ID2333
2018-11-07 14:08:49 +08:00
脑洞真 6,想玩~
NotNil1
2018-11-07 14:11:12 +08:00
感觉做个下五子棋的会简单一点哈
1847bell
2018-11-07 14:14:58 +08:00
我的🐴🦆,看得出来你确实很闲……
NotNil1
2018-11-07 14:20:07 +08:00
客户端代码怎么分发呢
MicroPan
2018-11-07 14:35:32 +08:00
666,前排关注~
MrUser
2018-11-07 14:37:40 +08:00
出牌时直接输入要出的牌呗,程序给转成索引,输入 index 太难受了:1=3,3=5,5=6 ……快绕晕了都还怎么记牌
realpg
2018-11-07 14:47:28 +08:00
@iamniconico #65
其实直接输入牌字母也可以
定义一下两个王是什么符号,比如 A 和 B
然后 1(A)23456789XJQK
问你出啥牌 直接输 111JJ
有效避免图形界面摸鱼困难

另外 提供老板键 一键终端变为编译界面
iamniconico
2018-11-07 15:12:06 +08:00
@MrUser 没问题,我也发现这个挺蛋疼的
iamniconico
2018-11-07 15:21:36 +08:00
@realpg 我再考虑 10 用什么字母代替,还是说用 0 ?
realpg
2018-11-07 15:24:57 +08:00
@iamniconico #78
用 X 比较好吧
然后考虑用户习惯兼容个 A=1
iamniconico
2018-11-07 15:25:04 +08:00
3 4 5 6 7 8 9 T J Q K A 2 S X
3 4 5 6 7 8 9 10 J Q K A 2 小王 大王
单字母取消空格

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

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

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

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

© 2021 V2EX