# thirty_point **Repository Path**: unkvcc/thirty_point ## Basic Information - **Project Name**: thirty_point - **Description**: 自创扑克牌游戏30点 - **Primary Language**: JavaScript - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-09-08 - **Last Updated**: 2022-08-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 目录结构 npm init && npm install 初始化并安装依赖后,直接运行 node index.js 即可启动后端服务 ### 玩家视角 登录:输入昵称登陆 大厅:点击可进入的房间 房间:等待房间人数到达3人时,自动开始游戏 游戏中:在房间的桌子上打牌 游戏结束时,桌子上弹出游戏结算画面,回到房间 ### 后端逻辑 接受玩家的登录 返回大厅中的房间的数据 将玩家分配到各个房间的桌子 在桌子上打牌 结算游戏结果 掉线重连 ### 玩法说明 规则一:牌面朝下的牌,只有发给玩家时或玩家抽牌时自身才能看,玩家从牌堆抽到的牌其他玩家不能查看;牌面朝上的牌,所有玩家都能看。 一副扑克牌,取出所有黑桃 ♠ 牌,牌面朝下洗牌,顺时针发给玩家 A 、B 、C 三人,每人一张,代表每个玩家的黑桃花色,初始的隐藏分值(打出一张牌获得的分值称为桌面分)。 剩余的牌牌面朝下单独放置在牌堆 D 同样的,取出所有红桃 ♥ 牌,重复上述操作,剩余的牌也放置在牌堆 D 最后,取出所有梅花 ♣ 牌,重复上述操作,剩余的牌放置在牌堆 D 牌堆 D 洗牌,每位玩家发放 4 张手牌 玩家 A 的三个花色的隐藏分变更为他的上家,玩家 C 的隐藏分,玩家 C 不能查看。 同样的,玩家 B 和 玩家 C 的隐藏分均变更为他们的上家的隐藏分,且变更后不能查看。 由玩家 A 执行他的回合,回合结束时,依次轮换到玩家 B 、玩家 C ### 我的回合 玩家在自己的回合可以执行以下 四种操作之一 ① 抽取抽牌堆顶牌面朝下的牌——点击抽牌堆,抓抽牌堆顶的一张牌到手牌,触发**抽牌得分**判定 ② 抽取弃牌堆顶牌面朝上的牌——点击弃牌堆,打出弃牌堆顶的一张牌,获得对应花色的桌面分 其中,以下行动结束后,触发**演化** ③ 直接打出手牌——点击手牌中任意一张牌,牌面朝下打出手牌中的任意一张牌,等待下家打出一张牌作为响应,如果下家不响应,则当前玩家直接揭示刚刚打出的牌,获得该牌对应花色的桌面分;如果下家响应,则进行**拼点**判定。 ④ 发起强制拼点——当你手牌中有一张牌 A 的分值大于等于其他玩家手牌中的一张明牌 B 的分值时才能这样做。首先,点击自身手牌中的该牌 A ,再点击其他玩家手牌的一张明牌 B 。当前玩家失去手牌 A ,直接获得该明牌 B 的分值;而另一位玩家失去手牌在的明牌 B ,获得 明牌 A。 ### 获胜条件 当一名玩家在自身回合结束时,某个花色之一的总分(桌面分 + 隐藏分)大于或等于 30 分。 在游戏对局中获得的分数都是桌面分(得分时该牌朝上放置在玩家的得分区),初始发牌时获得的分数就是隐藏分。 #### 明牌 明牌:所有玩家均能看见这张牌的花色和分值,持有明牌的玩家,需要等待 1 次轮转后,才能对明牌进行操作。 只有在触发拼点判定,下家获胜时,下家的响应拼点的牌才会变为明牌。 ### 判定解释 线下游玩时需要第四个玩家作为裁判 **演化**——如果抽牌堆有牌,那么从抽牌堆随机移出一张牌至弃牌堆;否则从弃牌堆移除最顶部的一张牌。 **抽牌得分**——抽到一张牌时,如果自身手上没有该类型的牌,或者自身手上有该类型的牌且比抽到的牌大,则判定成功,自动打出刚刚抽到的牌,获得对应桌面分;否则视为判定失败不得分,该牌进入手牌。 **拼点失败**——玩家A的牌分值 < 玩家B的牌分值时,玩家A失败,玩家B获胜,此时,玩家A失去拼点牌,该牌打出到玩家B的得分区,玩家B获得对应花色的桌面,同时玩家B揭开玩家A的三种隐藏分中最小的牌(如果玩家A三种隐藏分均已揭开,则玩家A直接获得抽牌堆顶部的一张牌,不触发抽牌得分),玩家B拼点牌成为一张明牌留在玩家B手牌中。 **拼点获胜**——玩家A的牌分值 ≥ 玩家B的牌分值时,玩家B的拼点牌打出到玩家A的得分区,玩家A获得对应花色桌面分,玩家A的拼点牌放入玩家B的手牌中,成为一种明牌 ### 配置细节 虽然已经用 nodejs 做服务器了,由于服务器已经装了 nginx ,修改 nginx 主配置文件(不是网站的配置文件),把请求转给 nodejs。 ```nginx location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { root /www/wwwroot/game.zengwangcheng.com/thirty_point/public/; expires 30d; error_log /dev/null; access_log off; } location ~ .*\.(js|css)?$ { include mime.types; default_type application/octet-stream; root /www/wwwroot/game.zengwangcheng.com/thirty_point/public/; expires 12h; error_log /dev/null; access_log off; } location ^~/socket.io { proxy_set_header X-Real_IP $remote_addr; proxy_set_header Host $host; proxy_set_header X_Forward_For $proxy_add_x_forwarded_for; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_pass http://127.0.0.1:9993; } location / { include mime.types; default_type application/octet-stream; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_http_version 1.1; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; #30点小游戏 proxy_pass http://127.0.0.1:9993; } ``` 2022/8/23 我在考虑放弃这个方案,使用 unity 的 Phont 解决,Phont 自带了游戏大厅、房间等,而 unity 引擎又可以在图形界面方便的设计 UI、动画等事件。