使用Socket.io从客户端转向基于输入

时间:2014-08-27 01:06:30

标签: javascript node.js sockets asynchronous socket.io

大家好我这里有一个小问题。 我正在使用Socket.io进行基于回合制的纸牌游戏。我有一系列播放器对象,我可以访问每个播放器的套接字并用于发送或接收事件。我需要通过每个玩家(插座),向他们发送一个事件告诉他们轮到他们,等他们转弯(让我们说按屏幕上的按钮)然后再转到下一个玩家等等。我做了几次尝试,但我知道socket.io是异步的,基本上循环继续执行而不实际等待任何玩家轮流。有关如何管理它的任何想法?为了更清楚我想要实现的目标,我将展示我最后的尝试。谢谢!

for(i = 0; i < players.length; i++) {
    players[i].getSocket().emit('yourTurn');
    players[i].getSocket().on('turnTaken', function(data) {
        //do something with the data
    }
    //the loop then goes to the next player
}

2 个答案:

答案 0 :(得分:0)

你应该做的是重构你的逻辑和用户界面,这样你只有在轮到他们轮到他们时才通知玩家,而不是连续。一旦其他人轮到他们(或其他一些事件......例如游戏开始),它就会轮到他们了。

答案 1 :(得分:0)

只要有人需要,就在这里张贴。

我遇到了同样的问题(开发一款名为Tarneeb的纸牌游戏,如果你知道它,游戏涉及玩家轮流放置那里的出价,然后轮流放置卡片)......设法通过以下方法解决问题逻辑:如果你知道它,它几乎就像有限状态机。我创建了一个名为game(服务器端)的类,它保持游戏当前状态以及谁应该移动,然后使用事件逐个触发游戏移动。

所以让我们说代码看起来像这样:

function game() //my constructor 
{
    this.gameState = 0 // starting with first state
    this.playerTurn = 0 // starting with first player
    this.gameEvents = new events.EventEmitter() // instantiating event emitter object to deal with game events

    var self = this; // important to access current object from inside event registering functions.
    self.gameEvents.on('init', function(){ 
    // place my init code here then set gameState to be 1 to move to next state 
    // emitting the event move
});
    self.gameEvents.on('move',function(){
    //here i decide which move to take.
    //should update the game object at each client here.
    if(self.gameState == 0)
    {
        // send to clients an event they should do at this state.
    }
    else if(self.gameState == 1)
    {
        //send to clients another (different) event.
    }
    //and so on....
}

然后我做了发射事件的伎俩。例如,在状态1,我向客户发出一个事件,要求他们捕获某个客户的出价。客户设法通过检查游戏对象的变量来解决客户端移动的冲突(这是我保留在每个客户端并在每次移动之前更新它的另一个对象)。并且只有设法接受它的客户端才会通过用户输入响应服务器。

因此客户端的代码将是这样的:

socket.on('takeTurn', function(){
if(game.gameState == 1 && game.playerTurn == myID){
//promote user for input
//send to server
}
}

当服务器收到此信息时,它会检查是否要转到其他状态或增加播放器不转而转向下一个播放器。试着把它想象成这样:让事件触发,使代码看起来像是顺序的。

希望我澄清一点。