Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
P
paopao
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
cocktail-party
paopao
Commits
082c4031
提交
082c4031
authored
3月 19, 2026
作者:
lidongxu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
同步所有人分数
上级
3799d748
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
36 行增加
和
4 行删除
+36
-4
index.js
server/src/socket/index.js
+1
-0
roomHandler.js
server/src/socket/roomHandler.js
+35
-4
没有找到文件。
server/src/socket/index.js
浏览文件 @
082c4031
...
...
@@ -100,6 +100,7 @@ function initSocket(httpServer) {
broadcastToRoom
,
joinRoom
,
leaveAllRooms
,
roomSubscribers
,
});
const
screenCleanup
=
registerScreenHandlers
(
ws
,
{
...
...
server/src/socket/roomHandler.js
浏览文件 @
082c4031
...
...
@@ -6,6 +6,12 @@ const prisma = require('../prisma/client');
*/
const
waitingRooms
=
new
Map
();
/**
* 游戏结束分数收集表:roomId → Map<playerId, {score, nickname}>
* 用于收集房间内所有玩家的最终分数
*/
const
gameOverScores
=
new
Map
();
/** 房间玩家计数:roomId → number,用于分配递增的 playerId */
const
roomPlayerCounter
=
new
Map
();
...
...
@@ -38,7 +44,7 @@ const roomTimers = new Map();
* @param {{ broadcastToRoom, joinRoom, leaveAllRooms }} helpers
* @returns {Function} cleanup 函数,ws 关闭时调用
*/
function
registerRoomHandlers
(
ws
,
{
broadcastToRoom
,
joinRoom
,
leaveAllRooms
})
{
function
registerRoomHandlers
(
ws
,
{
broadcastToRoom
,
joinRoom
,
leaveAllRooms
,
roomSubscribers
})
{
if
(
!
ws
.
_handlers
)
ws
.
_handlers
=
{};
// ── room:create ────────────────────────────────────────────────────────────
...
...
@@ -230,9 +236,34 @@ function registerRoomHandlers(ws, { broadcastToRoom, joinRoom, leaveAllRooms })
where
:
{
roomId
},
data
:
{
status
:
'finished'
},
});
// 广播给大屏(含 playerId 和分数)
broadcastToRoom
(
roomId
,
'room:gameOver'
,
{
roomId
,
score
,
playerId
,
nickname
},
ws
);
console
.
log
(
`[Room] 游戏正常结束 roomId=
${
roomId
}
playerId=
${
playerId
}
score=
${
score
??
0
}
`);
// 收集该玩家的分数
if
(
!
gameOverScores
.
has
(
roomId
))
{
gameOverScores
.
set
(
roomId
,
new
Map
());
}
const
roomScores
=
gameOverScores
.
get
(
roomId
);
roomScores
.
set
(
playerId
,
{
score
:
score
??
0
,
nickname
});
// 获取房间内所有连接的 minigame 玩家数量
const
subs
=
roomSubscribers
.
get
(
roomId
);
const
minigamePlayers
=
subs
?
[...
subs
].
filter
(
s
=>
s
.
ctx
?.
role
===
'minigame'
)
:
[];
const
totalPlayers
=
minigamePlayers
.
length
;
const
reportedPlayers
=
roomScores
.
size
;
console
.
log
(
`[Room] 游戏结束分数收集 roomId=
${
roomId
}
playerId=
${
playerId
}
score=
${
score
??
0
}
(
$
{
reportedPlayers
}
/${totalPlayers}
)
`
)
;
// 广播当前收集到的分数给所有人(让客户端可以实时显示)
const
scoresObj
=
{};
for
(
const
[
pid
,
data
]
of
roomScores
)
{
scoresObj
[
pid
]
=
data
.
score
;
}
broadcastToRoom
(
roomId
,
'room:gameOver'
,
{
roomId
,
scores
:
scoresObj
,
playerId
,
nickname
});
// 如果所有玩家都已上报分数,清理收集表
if
(
reportedPlayers
>=
totalPlayers
)
{
console
.
log
(
`[Room] 所有玩家分数收集完成 roomId=
${
roomId
}
`
);
gameOverScores
.
delete
(
roomId
);
}
}
catch
(
err
)
{
console
.
error
(
'[room:gameOver] 错误:'
,
err
);
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论