2016-07-03 13 views
0

Ich bin gerade dabei, ein einfaches Spiel, wo ein Benutzer zuerst verbindet einen Benutzernamen eingibt und dann ist es weg gespeichert.Socket.io und multidimensionale Arrays?

Also die Frage ist, ich habe ein multidimensionales Array. Aber nein, wenn ein zweiter Spieler verbindet, wie wird es wissen? Muss ich zwei von ihnen erstellen? Und wenn ja, woher weiß es, wohin es gehen soll?

Da ich dann die .length finden muss, damit ich sehen kann, gibt es zwei Benutzer.

var socketStorage = {}; 
// =============================================== 
// GAME LOGIC 
// =============================================== 
    socketStorage[socket.id] = {}; 

    socketStorage[socket.id] = { 
     username : "username",  
     socket : socket,  
     currQuestion : { 
      answered : false, 
      answer : false 
     }, 
     allQuestionsAnswers : [] 
    }; 

    socket.on("setusername", function(msg){ 
     socketStorage[socket.id].username = msg.username; 
     console.log(socketStorage[socket.id].username); 
    }); 

Antwort

1

In Ihrem Beispiel gibt es keine multidimensionalen Arrays. Du hast es auch nicht im Spiel erklärt - spielt jeder gleichzeitig zusammen oder gibt es verschiedene Spiele, die jeweils eigene, voneinander isolierte Spieler enthalten können?

Hier ist ein Beispiel dafür: Ich habe seit einiger Zeit keine Sockets mehr verwendet, also verwende ich Ihren Code und meine grobe Erinnerung daran, wie er gehandhabt wird - korrigieren Sie alle Fehler nach Bedarf.

var games = [] 
var socketStorage = {}; 
// =============================================== 
// GAME LOGIC 
// =============================================== 
// socketStorage[socket.id] = {}; // <- this line is unnecessary. 

socketStorage[socket.id] = { 
    username : "username",  
    socket : socket,  
    currQuestion : { 
     answered : false, 
     answer : false 
    }, 
    allQuestionsAnswers : [] 
}; 

socket.on("setusername", function(msg){ 
    socketStorage[socket.id].username = msg.username; 
    console.log(socketStorage[socket.id].username); 
}); 

socket.on("newgame", function(msg){ 
    newGameId = games.length; 
    games.push([]); 
    games[gameId].push(socketStorage[socket.id]); 
    socket.emit("newgamecreated", { gameId: newGameId }); 
}); 

socket.on("joingame", function(msg){ 
    var gameId = msg.gameNumber; 
    games[gameId].push(socketStorage[socket.id]); 
}); 

socket.on("getgames", function(msg){ 
    gamesToUsers = {}; 
    games.forEach(function(game, index) { 
    gamesToUsers[index] = game.map(function(socket) { 
     return socket.username 
    }); 
    }); 
    socket.emit("currentgames", gamesToUsers); 
}); 

Dies ist unvollständig und unglaublich einfach, und hat wahrscheinlich mehrere Fehler, aber sollten Sie genug geben das Konzept zu verstehen, wie um dies zu realisieren. Immer wenn jemand etwas in einem Spiel tut, willst du einfach eine Schleife zu socket.emit die neue Information zu jedem verwenden, der im selben Spiel ist. so,

socket.on("somethinghappenedingame", function(msg){ 
    game = msg.gameNumber; 
    update = msg.update; 
    games[game].forEach(function(socketObj){ 
    socketObj.socket.emit("gameUpdate", update); 
    }); 
}); 

Hoffe, dass hilft.

+0

Ist es möglich, die Anzahl der Spieler zu ermitteln, die erfolgreich einen Benutzernamen eingegeben haben? Wenn ich erreichen kann, dass ich den Rest meiner Logik ausführen kann. Ich muss sehen, wie viele Leute sich verbunden haben, bevor ein neues Spiel startet. –

+0

Sie fügen einfach alle zu einem Spiel hinzu, wenn Sie diesen Code wiederverwenden wollen. Oder Sie erhöhen nur einen Zähler außerhalb des Gültigkeitsbereichs. Oder Sie ordnen die Spielearrays nur ihren Längen zu und reduzieren sie dann. 'games.map (Spiel => Spiel.Länge) .Reduce ((kumulativ, gameLen) => gameLen + kumulativ)' oder so ähnlich. –

+0

Wenn es Ihnen möglich wäre, ein Beispiel für einen Zähler zu geben? Sehr neu bei der Verwendung dieser Art von Daten –

Verwandte Themen