2011-04-17 134 views
4

我正在Node.js和Express js上編寫一個雙人牌遊戲(爲簡單起見說它是常規撲克)。有幾件事情我遇到了麻煩。首先,我如何確保只有2名玩家可以訪問遊戲實例,並且如果他們失去連接,是否可以讓他們重新連接?其次,如何將消息從服​​務器發送到客戶端?我可以在「socket.on」偵聽器調用中發送它,但在程序的正常範圍內,我無法使其工作。節點JS Express JS客戶端/服務器遊戲

var socket = io.listen(app); 
socket.on('connection', function(client){ 
    player++; 
    if(player <= 2) { 
    var messageout = "player " + player + " connected"; 
    client.broadcast(messageout); 
    client.on('message', function(data){console.log(data); }) 
    client.on('disconnect', function(){console.log('disconnected');}) 
    } 
    else { 
    socket.end; 
    } 

}); 

我在概念上遇到了什麼問題以及如何解決問題。例如,我是否使用套接字來做這件事?或者我每回合都會返回一個包含遊戲更新狀態(卡片,投注等)的網頁?

回答

2

首先,我怎麼確保有 只有2個可以訪問該遊戲的 實例球員呢?

創建一個實例對象數組。
當新玩家加入時,可以創建一個新實例並將其設置爲player1,或者將其作爲玩家二添加到現有實例。

var instances = []; 

function Instance() { 
    return { 
    name = 'game' + instances.length + 1, 
    gameVariables = defaults, 
    player1 = null, 
    player2 = null, 
    player1UUID = UUID(), 
    player2UUID = UUID() 
    } 
} 

是否有可能讓他們重新 如果他們失去了聯繫?

如果您在初次連接時向每個玩家發送一個UUID,您可以讓他們在重新連接時使用它進行身份驗證。

如何從 服務器向客戶端發送消息?

client.send({gameState:gameState()}); instances[ 'game1' ].player1.send(data);

我做這一切與插座:

如果你已經保存在客戶端爲對象的

我會處理與網絡套接字的所有動態交互。

我是否每次都返回一個包含遊戲更新狀態(卡片,投注等)的網頁?

我不會通過網絡套接字發送html。而是發送json並使用客戶端模板來呈現它。

0

嘗試now

// server 
var nowjs = require("now") 
var everyone = nowjs.initialize(app); 

everyone.connected(function() { 
    if (users.length < 2) { 
     users.push(this); 
    } 
}); 

everyone.now.sendMessage = function(message, cb) { 
    gameLogic(message); 
    users.forEach(function(user) { 
     user.update(gameLogic.getState()); 
    }); 
}; 

//client 
$("#action").click(function() { 
    now.sendMessage($(this).data("action")); 
}); 

now.update = function(data) { 
    // update UI 
};