2017-02-08 39 views
2

我正在使用NodeJs和Socket.io來製作基於回合的遊戲。在turn-based遊戲中通過socket.io和Nodejs輪流

無論何時按下「Pass」按鈕或轉動開始後5秒過去,每一轉都必須結束。無論首先發生什麼,都必須觸發「通行證」事件。

即使當前玩家不是當前玩家,我的當前計數器仍會繼續循環,並且在某些情況下它會過早地結束回合。

我在使用什麼邏輯來讓我的回合正常工作時遇到問題。

我的客戶端有這個功能

//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'); 
     } 
    } 
}); 

回答

2

我實現你的邏輯在我的方式。
我有一個陣列來存儲每個連接的球員(插座)
這將用於跟蹤哪個球員是當前轉彎並向球員發出事件。

服務器端

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. 玩家連接到服務器後,我把它們放入數組,只有遊戲能夠與第一連接播放器的要求通過點擊客戶端一鍵啓動(你可以修改這個)。

  2. 如果你看一下pass_turn事件,只是當前玩家可以觸發事件,這意味着其他球員被封鎖,持續5秒,

  3. 如果任何球員被斷開,我們從數組中刪除他,並減少指數以及。

  4. 如果傳遞5秒或玩家在客戶端按下按鈕,next_turn函數將被觸發。

  5. triggerTimeout函數用於計數5秒,5秒後觸發next_turn函數轉向下一個玩家。

  6. 噹噹前播放器被按下客戶端的一個按鈕時,觸發resetTimeout函數。時間被重置並開啓未來的球員立即

客戶

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

打開你的服務器上,開3〜4個瀏覽器,並嘗試

祝你好運:)