# 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 卡牌游戏。
## 截图
## 开发
```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、请求发牌、等待同意互斥。