anpu v0.1.0
anpu
安铺打地主的扑克牌玩法,服务端文档
TODO
- 贡牌通讯
- 清理Redis的Room
- 游戏端显示
- 重新匹配
对应关系
牌和数字
| 牌 | 索引值Point | 散角 | 花仔 | 红桃 | 大葵 |
|---|---|---|---|---|---|
| 4 | 0 | 1 | 2 | 3 | 4 |
| 5 | 1 | 5 | 6 | 7 | 8 |
| 6 | 2 | 9 | 10 | 11 | 12 |
| 7 | 3 | 13 | 14 | 15 | 16 |
| 8 | 4 | 17 | 16 | 19 | 20 |
| 9 | 5 | 21 | 22 | 23 | 24 |
| 10 | 6 | 25 | 26 | 27 | 28 |
| J | 7 | 29 | 30 | 31 | 32 |
| Q | 8 | 33 | 34 | 35 | 36 |
| K | 9 | 37 | 38 | 39 | 40 |
| A | 10 | 41 | 42 | 43 | 44 |
| 2 | 11 | 45 | 46 | 47 | 48 |
| 3 | 12 | 49 | 50 | 51 | 52 |
玩法没有大小鬼
角色
| 角色 | 索引 | 索引值Role | 特征 |
|---|---|---|---|
| 贫农 | 0 | Poor | - |
| 地主仔 | 1 | MiniBoss | 大葵A |
| 大地主 | 2 | BigBoss | 大葵3 |
| 双地 | 3 | DoubleBoss | 大葵A + 大葵3 |
贡牌规则
| 第一名 | 第二名 | 第三名 | 第四名 | 贡牌 | 第一名 | 第二名 | 第三名 | 第四名 |
|---|---|---|---|---|---|---|---|---|
| 双 | 农 | 农 | 农 | - | 6 | -1 | -1 | -1 |
| 农 | 双 | 农 | 农 | - | -1 | 3 | -1 | -1 |
| 农 | 农 | 双 | 农 | - | 1 | 1 | -3 | 1 |
| 农 | 农 | 农 | 双 | - | 2 | 2 | 2 | -6 |
| - | - | - | - | - | - | - | - | - |
| 主 | 主 | 农 | 农 | - | 2 | 2 | -1 | -1 |
| 主 | 农 | 主 | 农 | - | 1 | -1 | 1 | -1 |
| 主 | 农 | 农 | 主 | - | 0 | 0 | 0 | 0 |
| - | - | - | - | - | - | - | - | - |
| 农 | 农 | 主 | 主 | - | 2 | 2 | -1 | -1 |
| 农 | 主 | 主 | 农 | - | 0 | 0 | 0 | 0 |
| 农 | 主 | 农 | 主 | - | 1 | -1 | 1 | -1 |
花色 Suit(enum)
| 花色 | 数字 |
|---|---|
| 大葵 | 0 |
| 散角 | 1 |
| 花仔 | 2 |
| 红桃 | 3 |
牌型 Kind(enum)
| 牌型 | 类型名 | 索引 |
|---|---|---|
| 单张 | ONE | 0 |
| 对 | PAIR | 1 |
| 葫芦,三带二 | FULLHOUSE | 2 |
| 同花 | FLUSH | 3 |
| 拖尸,四带一 | FOUR | 4 |
| 蛇,顺 | STRAIGHT | 5 |
| 同花顺 | STRAIGHTFLUSH | 6 |
http接口(BODY JSON)
登录和注册
/login
post = { inputname: string inputpass: string }
resp = { success:boolean uid:number access:string username:string }
## ws全局约定
### c2s auth{ uid:number // 用户id access:string // 访问token }
## 事件定义
### 要求重新登录,不认tokens2cRelogin = {}
### 加入等候c2sJoinWaiting = {}
### 等候状态s2cWaitingStatus = { roomUsers: string[] // 等待中的用户名称列表 }
### 开始游戏
s2cGameStart = s2cPlayCard // 内容相同,只是事件名不同
### 玩家游戏端出牌c2sPlayCard = { sentCards:number[] // 出牌 pass:boolean // 是否pass }
### 服务端给单个玩家下发s2cPlayCard = { uid:number username:string myCards:number[] // 我的手牌 active:boolean // 是否可行动,准备出牌
ready: { // 可以行动,准备决策的内容 previousCard: number[] // 上家出牌 availableCards: number // 可用的牌组 enablePass: boolean // 是否可以过牌:开始时和傍风时不能pass isAllPassed: boolean // 是否所有玩家都pass了,即傍风 }
leftPlayer: { // 左边玩家 uid:number username:string cardCount: number // 剩余牌数 active: boolean // 是否在行动,准备出牌 winRank: number // 第几名,默认0未赢 winScore: number // 输赢分数 isBigBoss: boolean // 是否是大地主 isMiniBoss: boolean // 是否是小地主 isPrevious: boolean // 是否是上家 isAllPassed: boolean // 是否所有玩家都pass了,即傍风 hasDiamondFour: boolean, // 是否有散角4 }, rightPlayer = leftPlayer // 右边玩家 upperPlayer = leftPlayer // 上方玩家 }
### 结束结算s2cGameOver = { continue:boolean // 是否继续游戏,或者直接退出到准备阶段 currentPlayer: Player, // 当前玩家 leftPlayer: Player, // 左边玩家 rightPlayer: Player, // 右边玩家 upperPlayer: Player, // 上方玩家 }
## 数据库表
### 用户表CREATE TABLE user (
uid int NOT NULL AUTO_INCREMENT,
username varchar(100) DEFAULT NULL,
password varchar(100) DEFAULT NULL,
PRIMARY KEY (uid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
### 游戏记录表CREATE TABLE game_log (
id int NOT NULL AUTO_INCREMENT,
room_id varchar(100) COLLATE utf8mb4_general_ci NOT NULL,
start_time datetime DEFAULT NULL,
end_time datetime DEFAULT NULL,
user_ids varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL,
records text COLLATE utf8mb4_general_ci,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
### 玩家记录表CREATE TABLE play_log (
id int NOT NULL AUTO_INCREMENT,
game_log_id int NOT NULL,
room_id varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
uid int DEFAULT NULL,
username varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
role tinyint DEFAULT NULL COMMENT '0贫农,1地主仔,2大地主,3双地',
score tinyint DEFAULT NULL COMMENT '贡牌得分,有负数',
rank tinyint DEFAULT NULL COMMENT '排第几',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;