说明
在这篇博文中,我记录了我开发德州扑 克 Web 小游戏的部分过程,包括想法来源、架构和技术栈、一些要点和问题、未来改进、游戏体验以及整活总结。
项目启动时间:2023 年 3 月 22 日;后端技术栈:Node.js,Express,JavaScript(后期将转写为TypeScript);前端技术栈:Vue.js 3,Axios。
先贴张图镇楼 ;-)
想法来源
德州扑克
我的朋友们喜欢在周五周六晚上,在寝室里玩德州扑克来消遣。
有一次一位朋友带着扑克牌和筹码,出去和他的其他好友玩;那天晚上,其他人因为没有扑克牌和筹码而无法开局。
因此产生了这个想法:写一个能玩德州扑克的软件,让大家能在没有其他辅助设施的情况下,也能愉快的玩德州扑克;
之后也可能通过代码的拓展,让大家玩上其他牌类游戏。
洗牌
我们玩牌类游戏的一大问题,就是洗牌洗的不够分散。通过计算机模拟洗牌,能做到既快又让牌的分布更加随机。
结算
对于德州扑克,还有一个特殊的问 题:当有玩家牌面大小相同或者 all in 时,计算并分割筹码会显得比较麻烦。
使用计算机程序解决这个问题,虽然需要下点功夫将问题抽象并用计算机语言解决,但毕竟是个一劳永逸的操作,也算值得一做。
架构和技术栈
B/S 架构
考虑到游戏即兴开局的性质,我选择了 Web 开发。这样玩家就能在不用安装其他软件的情况下,直接使用手机上的浏览器进行游戏。
顺便,为了再次体验下大前端的魅力,我将使用 JavaScript 贯穿整个开发流程。因此,前端采用 Vue.js,后端采用 Node.js;后续可能会使用 TypeScript 对代码进行重构。
Vue.js
Vue 的开发非常灵活,这里我选择使用单页应用开发方式。这个应用仅需一个页面,即用户的看牌和操作界面。再结合之前的 iOS 开发经历,我选择用单文件组件编写 UI,因为这令我感到非常熟悉。
下面聊聊使用到的 Vue 技术细节:
模板
我用模板来做文本插值,显示一些简单的信息,例如:玩家名、筹码数和下注情况。在用户尚未翻牌时,通过在模板中插入三元表达式来保护牌面信息。每张扑 克牌的花色和大小同样由插值传递。
计算属性
计算属性被拿来表示用户可以下注的最高筹码,即当前下注筹码和持有筹码的和。
条件渲染
随着游戏的进行,玩家可以进行的操作如下注、弃牌等,也在不停变化。同时,每种扑克牌的牌面展示花色的位置也不相同。因此我用不同的单页文件制作了 A
- 10
和带文字描述的 JQK
。
这里用条件渲染来区分不同牌和展示不同状态下的按钮。
列表渲染
列表渲染用于展示桌面上的牌和玩家手牌。
事件处理
玩家调整下注筹码的操作会调用本地事件处理;玩家选择下注或弃牌等操作会触发事件让后端服务器处理。
生命周期
向后端请求数据来更新前端界面时,需要等待 Vue 挂载结束,即 onMounted()
回调函数。