# SET **Repository Path**: sinceow/set ## Basic Information - **Project Name**: SET - **Description**: SET 形色牌游戏 web 版 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-03-12 - **Last Updated**: 2026-09-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SET · 形色牌
SET LOGO
双人面对面(同屏)的 SET 卡牌游戏。 ## 截图
开局设置   叫牌抢答   游戏主界面
## 开发 ```bash npm install npm run dev # http://localhost:5173/set-next/ npm run build # 类型检查 + 产物构建 npm run preview ``` ## 规则 - 81 张牌,每张有四个属性(颜色 / 数量 / 形状 / 填充),各三种取值 - 三张牌每个属性「全同」或「全不同」即为一个 SET - 开局弹窗可设置声音与提示、查看 SET 示例,点「开始游戏」后 3-2-1 倒计时发 12 张 - 任意玩家点 **SET** 抢答,获得 10 秒选牌时间;**叫牌 3 秒后可再点自己的 SET 取消,计犯规一次** - 选满三张:是 SET → 收牌(**获得 3 张牌**)并从牌堆原位补牌;不是 → 犯规(犯规数 +1,**扣除 1 张已获得的牌**);超时同理 - 无人叫 SET 时可 **请求发牌**(桌面 +3,上限 24),需对方同意;**若桌面仍有 SET,请求方需在其操作位上二次确认** - **提示**:每方每局 3 次(开局可开关),随机高亮桌面一组 SET(桌面无 SET 时不消耗并提示可加牌) - 牌堆发完且桌面无 SET 时终局:**获得的牌多者获胜;牌数相同则犯规少者获胜;两者都相同为平局** - 双方操作区为绿 / 红毛毡桌面;剩余牌数以水印形式印在桌面右下角与左上角(对方视角) ## 许可 [MIT](./LICENSE) ## 架构 ``` src/ game/ cards.ts 牌号 ↔ 属性映射(三进制拆位)、洗牌 rules.ts isSet / findSets(按位模 3 判定) images.ts 81 张牌面图映射 + 预载 composables/ useGame.ts 全部游戏状态与动作(显式状态机,动作带互斥守卫) useSounds.ts Howler 音效封装(模块加载即预载)+ 静音持久化 components/ PlayerBar.vue 红/绿毛毡玩家栏(SET / 请求发牌 / 提示 / 战绩) CardGrid.vue 桌面牌格(等间距居中、选牌/收牌/犯规/提示动画) StartDialog.vue 开局设置(LOGO / 声音 / 提示 / 示例 / 开始游戏) GameOverOverlay.vue 终局结算 + 再来一局 ``` 状态机:`setup → countdown → dealing → idle → (calling | confirmDeal → asking) → resolving → idle … → over`。 所有按钮的可用性都由当前 phase 决定,叫 SET、请求发牌、等待同意互斥。