轮到socket.io和Nodejs轮stream的游戏

我用Socket.io使用Nodejs来制作一个基于回合的游戏。

每当“Pass”button被按下或转弯开始后经过5秒时,每一转都必须结束。 无论首先发生什么事都必须触发“通行证”事件。

即使不是当前玩家转身,我目前的对手也会持续循环,并且在某些情况下会提前结束。

我在使用什么逻辑方面有问题,让我的轮到正常工作。

我的客户端有这个function

//Pressing "Pass" button $('#pass_turn').on('click', function(){ socket.emit('pass_turn'); $('#your_turn').hide(); $('#not_turn').show(); }); //This runs everytime the server tells the player its their turn socket.on('your_turn', function() { $('#your_turn').show(); $('#not_turn').hide(); var counter = 0; var interval = setInterval(function() { counter++; if (counter == 5) { console.log('pass_turn'); clearInterval(interval); $('#pass_turn').trigger("click"); } }, 1000); }); 

这是我的服务器端代码:

 socket.on('pass_turn', function () { var room = socket.rooms; for(var item in socket.rooms){ if(item.substring(0, 7) == 'room_0.'){ //if conditions met, emit turn to opponent socket.broadcast.to(item).emit('your_turn'); } } }); 

我以自己的方式实现了你的逻辑。
我有一个arrays来存储每个连接的球员(套接字)
这将被用于追踪哪个玩家当前正在转弯并向玩家发出事件。

服务器端

  let players = []; let current_turn = 0; let timeOut; let _turn = 0; const MAX_WAITING = 5000; function next_turn(){ _turn = current_turn++ % players.length; players[_turn].emit('your_turn'); console.log("next turn triggered " , _turn); triggerTimeout(); } function triggerTimeout(){ timeOut = setTimeout(()=>{ next_turn(); },MAX_WAITING); } function resetTimeOut(){ if(typeof timeOut === 'object'){ console.log("timeout reset"); clearTimeout(timeOut); } } io.on('connection', function(socket){ console.log('A player connected'); players.push(socket); socket.on('pass_turn',function(){ if(players[_turn] == socket){ resetTimeOut(); next_turn(); } }) socket.on('disconnect', function(){ console.log('A player disconnected'); players.splice(players.indexOf(socket),1); _turn--; console.log("A number of players now ",players.length); }); }); 
  1. 玩家连接到服务器后,我把它们推入arrays,只有通过点击客户端的一个button(可以修改这个)按照第一个连接的玩家的请求才能开始游戏。

  2. 如果你看看pass_turn事件,只有当前玩家可以触发事件,这意味着其他玩家被阻止5秒,

  3. 如果任何玩家断开连接,我们将他从arrays中删除,并减less索引。

  4. 如果经过5秒或玩家在客户端按下button,next_turn函数被触发。

  5. triggerTimeout函数用于计数5秒,5秒后触发next_turn函数来转向下一个玩家。

  6. 当当前玩家在客户端按下一个button时,会触发resetTimeout函数。 时间被重置,立即转向下一个玩家

客户

  <button type="button" id="turn" name="button">Next Turn</button> $("#turn").on("click",function(e){ socket.emit('pass_turn'); }) 

打开服务器,打开3〜4个浏览器并尝试

祝你好运 :)