You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js回合制游戏:实现服务端等待玩家输入再执行后续逻辑

问题:Node.js回合制游戏等待玩家输入的异步处理方案

我用Node.js做回合制游戏服务端,现在卡在怎么让程序等玩家输入后再执行后续函数。理想流程是等玩家1操作完、接收输入后,再等下一位玩家,直到所有回合结束。

目前代码会直接执行nextFunction(),符合异步特性但不符合需求,现有代码:

this._players.forEach((player, idx) => {
  player.on('turn', (turn) => {
    this._turns[index] = turn;
  });
});
nextFunction();

我试过async、await和Promise,但应该是实现错了。也不确定该不该用.on()方法,客户端点击按钮会emit一个id,服务端靠这个处理逻辑。觉得.then()能用,但写多了代码难维护。想知道Node.js里有没有更好的实现方式,核心就是让代码等用户输入后再继续。

解决方案

核心思路是把玩家的turn事件转换成Promise,再用async/await配合顺序循环,实现逐个等待玩家输入的效果,避免回调地狱。

1. 封装事件为Promise

写一个工具函数,把单个玩家的回合事件包装成Promise,只监听一次事件(避免重复触发):

function waitForPlayerTurn(player) {
  return new Promise((resolve, reject) => {
    // 用once代替on,确保只响应一次玩家的回合操作
    player.once('turn', (turn) => {
      resolve(turn);
    });
    // 可选:处理玩家断开的异常情况
    player.once('disconnect', () => {
      reject(new Error(`玩家断开连接`));
    });
  });
}

2. 顺序处理所有玩家回合

用for...of循环配合await,逐个等待玩家完成操作,所有回合结束后再执行后续函数:

async function runTurnSequence() {
  try {
    // 遍历玩家,顺序等待每个玩家的输入
    for (const [idx, player] of this._players.entries()) {
      const turn = await waitForPlayerTurn(player);
      this._turns[idx] = turn;
      // 可选:这里可以加单个玩家完成后的逻辑,比如广播该玩家的操作给其他人
    }
    // 所有玩家回合完成后,再执行后续函数
    nextFunction();
  } catch (err) {
    // 处理异常,比如玩家断开、超时等
    console.error('回合流程出错:', err);
    // 这里可以加异常处理逻辑,比如终止回合、通知其他玩家等
  }
}

// 在游戏开始时启动这个回合流程
runTurnSequence();

关键说明

  • 用once而非on:确保每个玩家的回合事件只被监听一次,不会因为重复触发导致Promise多次resolve
  • for...of+await:保证玩家顺序执行,前一个玩家完成输入后才会处理下一个,完全符合回合制的顺序要求
  • 异步流程同步化:用async/await替代.then()链式调用,代码结构更清晰,避免回调地狱
  • 异常处理:通过Promise的reject和try/catch,能处理玩家断开等意外情况,保证流程健壮性

可选优化

  • 超时控制:在waitForPlayerTurn里加setTimeout,超时后自动reject,避免无限等待玩家输入
function waitForPlayerTurn(player, timeout = 30000) {
  return new Promise((resolve, reject) => {
    const timeoutId = setTimeout(() => {
      reject(new Error('玩家操作超时'));
    }, timeout);

    player.once('turn', (turn) => {
      clearTimeout(timeoutId);
      resolve(turn);
    });

    player.once('disconnect', () => {
      clearTimeout(timeoutId);
      reject(new Error(`玩家断开连接`));
    });
  });
}

内容的提问来源于stack exchange,提问作者Ace

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 05:51:30