NodeJSとsocket.ioを使用してオンラインブラウザカードゲームを作成しています。オブジェクトにランダムオブジェクトを設定し、javacriptで特定のプロパティを設定する
オブジェクトは2つのプレーヤ(0と1)でオブジェクトが生成され、そのそれぞれがデッキを保持するオブジェクトを取得し、その中にさらに2つのオブジェクトがあり、カードをオブジェクトの形で保持する。
しかし、これは疑問であり、下のコードは実際には望ましい結果を生み出すものではありません。実際には、まず最初に、希望の数値を出力しますが、クライアントに"position"
(実際には他のプロパティも)送信される(function snddcks()
)時点で、としていくらかコピーされます。 "Type":"Knight"
の場合は"position":0
となります。
それが実際にどうして起こるのかわかりませんが、それは問題です。私はすぐにプロセスを説明します最後に
、:よく
- 、すべての最初には、参加するプレイヤー、(それのNR 1、0ではない)は、(ゲーム・セッション・オブジェクトを作成します
userlists["g"][roomid]
でサーバー側)、roomidはランダムに生成された文字列 - NR1であり、そして "機能は、サーバー側でサーバー
- に「playerhasjoined」その後、返信者、彼が参加したことNR0を伝えますpopulateDeck "が呼び出され、デッキに最初にNR0、次にNR1のためにデリバリされます。
- 最後に "snddcks"が呼び出され、すべてのデータが両方のクライアントに送信されます
したがって、すべての「位置」とその他のプロパティは正しく設定されていますが、手順4では、それらは上書きされます。
function joingid() {
var roomid = userlists["eo"][socket.username]["gid"];
socket.state = "playing";
socket.join(roomid);
socket.leave("lobby");
socket.leave("searching");
socket.emit("playerfound", {
gid: roomid
});
socket.broadcast.to(roomid).emit('playerjoined', {
usr: socket.username,
gid: roomid
});
}
socket.on('playerhasjoined', function(data) {
socket.state = "playing";
socket.leave("lobby");
var roomid = userlists["eo"][socket.username]["gid"];
socket.broadcast.to(roomid).emit('otheropponent', {
usr: socket.username
});
setTimeout(function() {
populateDeck2(roomid, data["oppo"]);
}, 500);
});
function gRC(roomid, i, i2) {
userlists["g"][roomid]["Players"][i2]["deck"]["onHand"][i] = standardDeckCards[Math.floor(Math.random() * standardDeckCards.length)];
userlists["g"][roomid]["Players"][i2]["deck"]["onHand"][i]["CID"] = "CID-"+(Math.floor((Math.random() * 1000) + 1)).toString();
userlists["g"][roomid]["Players"][i2]["deck"]["onHand"][i]["position"] = i;
}
function gRCc(roomid, i, i2) {
return function() {
gRC(roomid, i, i2);
};
}
function gRC2(roomid, i, i2) {
userlists["g"][roomid]["Players"][i2]["deck"]["inBlock"][i] = standardDeckCards[Math.floor(Math.random() * standardDeckCards.length)];
userlists["g"][roomid]["Players"][i2]["deck"]["inBlock"][i]["CID"] = "CID-"+(Math.floor((Math.random() * 1000) + 1)).toString();
userlists["g"][roomid]["Players"][i2]["deck"]["inBlock"][i]["position"] = i;
}
function gRCc2(roomid, i, i2) {
return function() {
gRC2(roomid, i, i2);
};
}
function gRC2_1(roomid, a1i, a2i, card) {
return function() {
userlists["g"][roomid]["Players"][a1i]["deck"]["onHand"].push(card);
userlists["g"][roomid]["Players"][a1i]["deck"]["onHand"][a2i]["CID"] = "CID-"+(Math.floor((Math.random() * 1000) + 1)).toString();
userlists["g"][roomid]["Players"][a1i]["deck"]["onHand"][a2i]["position"] = a2i;
};
}
function populateDeck2(roomid, oppo) {
var oppos = [socket.username, oppo];
userlists["g"][roomid] = {
"RoomID": roomid,
"Players": {
0: {
"Player": socket.username,
"deck": {
"onHand": [],
"onField": [],
"inBlock": []
},
"MP-Left": 20
},
1: {
"Player": oppo,
"deck": {
"onHand": [],
"onField": [],
"inBlock": []
},
"MP-Left": 20
}
},
"Creationdate": Date().toString(),
"Winner": null,
"currentPlayer": oppos[Math.floor(Math.random() * oppos.length)],
"roundNR": 0
};
for (var a1 = 0; a1 < 2; a1++) { // plnr
for (var a2 = 0; a2 < 5; a2++) { // onHand
(function() {
gRCc(roomid, a2, a1)();
})();
// gRC2_1(roomid, a1, a2, gRC())();
// (function() {
// var card1 = gRC();
// userlists["g"][roomid]["Players"][a1]["deck"]["onHand"].push(card1);
// userlists["g"][roomid]["Players"][a1]["deck"]["onHand"][a2]["CID"] = "CID-"+(Math.floor((Math.random() * 1000) + 1)).toString();
// userlists["g"][roomid]["Players"][a1]["deck"]["onHand"][a2]["position"] = a2;
// console.log("@"+a1+"::"+a2+" >> "+userlists["g"][roomid]["Players"][a1]["deck"]["onHand"][a2]["CID"]+" AND "+userlists["g"][roomid]["Players"][a1]["deck"]["onHand"][a2]["position"]);
// })();
}
for (var a3 = 0; a3 < 50; a3++) { // inBlock
(function() {
gRCc2(roomid, a3, a1)();
})();
// (function() {
// userlists["g"][roomid]["Players"][a1]["deck"]["inBlock"].push(gRC());
// userlists["g"][roomid]["Players"][a1]["deck"]["inBlock"][a3]["CID"] = "CID-"+(Math.floor((Math.random() * 1000) + 1)).toString();
// })();
}
fs.writeFile("userlistsLOG_1.log", "ONE: "+a1+""+Date().toString()+":\n"+JSON.stringify(userlists["g"][roomid]["Players"][a1]["deck"]["onHand"])+"\n\n", {flag:"a"}, function (err) {
if (err) {
console.log('error happened during writing to log')
return console.log(err)
}
});
}
SP("gamepage.html", function FNCr(CALLBACKf) {
setTimeout(function() {
$(".gameid").html(roomid);
$(".opponent").html(opponent);
$(".giveupbutton").on('click', function() {
socket.emit('giveup');
});
$(".get_g_button").on('click', function() {
socket.emit('get_g', {
gid: roomid
});
});
$("#PAGETITLE").html("Da_Cards: VS "+opponent);
// socket.emit("rcvsrlst");
typeof CALLBACKf === 'function' && CALLBACKf();
}, 1500);
}, "aiI", roomid);
SCL("gamepage loaded", "", "aiI", roomid);
snddcks();
snddcks(true);
}
function snddcks(oppo) {
var oppo = oppo || false;
var roomid = userlists["eo"][socket.username]["gid"];
if (oppo === true) {
socket.broadcast.to(roomid).emit('snddcks', {
"d0_MP-Left": userlists["g"][roomid]["Players"][1]["MP-Left"],
"d0_onHand": userlists["g"][roomid]["Players"][1]["deck"]["onHand"],
"d0_onField": userlists["g"][roomid]["Players"][1]["deck"]["onField"],
"d0_inBlockC": userlists["g"][roomid]["Players"][1]["deck"]["inBlock"].length,
"d1_MP-Left": userlists["g"][roomid]["Players"][0]["MP-Left"],
"d1_onHand": userlists["g"][roomid]["Players"][0]["deck"]["onHand"].length,
"d1_onField": userlists["g"][roomid]["Players"][0]["deck"]["onField"],
"d1_inBlockC": userlists["g"][roomid]["Players"][0]["deck"]["inBlock"].length,
});
console.log("Sent decks into "+roomid);
fs.writeFile("userlistsLOG_2.log", "TWO 1: "+Date().toString()+":\n"+JSON.stringify(userlists["g"][roomid]["Players"][1]["deck"]["onHand"])+"\n\n", {flag:"a"}, function (err) {
if (err) {
console.log('error happened during writing to log')
return console.log(err)
}
});
} else if (oppo === false) {
socket.emit('snddcks', {
"d0_MP-Left": userlists["g"][roomid]["Players"][0]["MP-Left"],
"d0_onHand": userlists["g"][roomid]["Players"][0]["deck"]["onHand"],
"d0_onField": userlists["g"][roomid]["Players"][0]["deck"]["onField"],
"d0_inBlockC": userlists["g"][roomid]["Players"][0]["deck"]["inBlock"].length,
"d1_MP-Left": userlists["g"][roomid]["Players"][1]["MP-Left"],
"d1_onHand": userlists["g"][roomid]["Players"][1]["deck"]["onHand"].length,
"d1_onField": userlists["g"][roomid]["Players"][1]["deck"]["onField"],
"d1_inBlockC": userlists["g"][roomid]["Players"][1]["deck"]["inBlock"].length,
});
console.log("Sent decks to "+socket.username);
fs.writeFile("userlistsLOG_2.log", "TWO 0: "+Date().toString()+":\n"+JSON.stringify(userlists["g"][roomid]["Players"][0]["deck"]["onHand"])+"\n\n", {flag:"a"}, function (err) {
if (err) {
console.log('error happened during writing to log')
return console.log(err)
}
});
}
// setTimeout(function() {
// // fs.writeFileSync("userlistsLOG.log", Date().toString()+":\n"+JSON.stringify(userlists["g"][roomid]["Players"][0]["deck"])+"\n\n", {flag:"a"});
// // fs.writeFileSync("userlistsLOG.log", Date().toString()+":\n"+JSON.stringify(userlists["g"][roomid]["Players"][1]["deck"])+"\n\n", {flag:"a"});
// }, 100);
}
ここで古いコードです:
はここに新しいコードです。最後
function joingid() {
var roomid = userlists["eo"][socket.username]["gid"];
socket.state = "playing";
socket.join(roomid);
socket.leave("lobby");
socket.leave("searching");
socket.emit("playerfound", {
gid: roomid
});
socket.broadcast.to(roomid).emit('playerjoined', {
usr: socket.username,
gid: roomid
});
userlists["g"][roomid] = {
"RoomID": roomid,
"Players": {},
"Creationdate": Date().toString(),
"Winner": null,
"currentPlayer": null,
"roundNR": 0
};
}
socket.on('playerhasjoined', function (data) {
socket.state = "playing";
socket.leave("lobby");
var roomid = userlists["eo"][socket.username]["gid"];
socket.broadcast.to(roomid).emit('otheropponent', {
usr: socket.username
});
setTimeout(function() {
populateDeck(roomid, "0", function() {
setTimeout(function() {
// lgp(function() {
// snddcks();
// });
populateDeck(roomid, "1", function() {
setTimeout(function() {
SP("gamepage.html", function FNCr(CALLBACKf) {
setTimeout(function() {
$(".gameid").html(roomid);
$(".opponent").html(opponent);
$(".giveupbutton").on('click', function() {
socket.emit('giveup');
});
$(".get_g_button").on('click', function() {
socket.emit('get_g', {
gid: roomid
});
});
$("#PAGETITLE").html("Da_Cards: VS " + opponent);
// socket.emit("rcvsrlst");
typeof CALLBACKf === 'function' && CALLBACKf();
}, 1500);
}, "aiI", roomid);
SCL("gamepage loaded", "", "aiI", roomid);
snddcks();
snddcks(true);
// console.error("THE ROOMID IS "+roomid.toString());
// lgp(roomid, function() {
// console.error("THE ROOMID IS "+roomid.toString());
// snddcks(true);
// });
}, 100);
});
}, 100);
});
}, 100);
});
function gCA(mode, i, im, roomid, plnr, callback) {
if (mode === "1r") {
return standardDeckCards[Math.floor(Math.random() * standardDeckCards.length)];
} else if (mode === "pop_onHand") {
if (i < im) {
var card = standardDeckCards[Math.floor(Math.random() * standardDeckCards.length)];
// var randI = "CID-"+(Math.floor((Math.random() * 1000000) + 1)).toString();
var randI = "CID_" + i.toString();
card["CID"] = randI;
// card["position"] = i;
userlists["g"][roomid]["Players"][plnr]["deck"]["onHand"].push(card);
userlists["g"][roomid]["Players"][plnr]["deck"]["onHand"][i]["position"] = i;
console.log("1_" + plnr + " :: " + userlists["g"][roomid]["Players"][plnr]["deck"]["onHand"][i]["CID"] + " with " + userlists["g"][roomid]["Players"][plnr]["deck"]["onHand"][i]["position"] + " and " + card["position"]);
// userlists["g"][roomid]["Players"][plnr]["deck"]["onHand"].push(socket.card);
// console.log((i+" and "+card["position"])+" and "+userlists["g"][roomid]["Players"][plnr]["deck"]["onHand"][i]["position"]+" and "+plnr);
i++;
setTimeout(function() {
gCA("pop_onHand", i, 5, roomid, plnr, callback);
}, 150);
} else if (i === im) {
setTimeout(function() {
gCA("pop_inBlock", 0, 50, roomid, plnr, callback);
}, 150);
}
} else if (mode === "pop_inBlock") {
if (i < im) {
var card2 = standardDeckCards[Math.floor(Math.random() * standardDeckCards.length)];
userlists["g"][roomid]["Players"][plnr]["deck"]["inBlock"].push(card2);
console.log(i + " :: " + userlists["g"][roomid]["Players"][plnr]["deck"]["inBlock"][i]["position"]);
i++;
setTimeout(function() {
gCA("pop_inBlock", i, 50, roomid, plnr, callback);
}, 150);
} else if (i === im) {
for (var j = 0; j < userlists["g"][roomid]["Players"][plnr]["deck"]["onHand"].length; j++) {
console.log("2_" + plnr + " :: " + userlists["g"][roomid]["Players"][plnr]["deck"]["onHand"][j]["CID"] + " with " + userlists["g"][roomid]["Players"][plnr]["deck"]["onHand"][j]["position"]);
}
setTimeout(function() {
typeof callback === 'function' && callback();
}, 50);
}
}
}
function gRC() {
return standardDeckCards[Math.floor(Math.random() * standardDeckCards.length)];
}
function gCA2(roomid, plnr, callback) {
userlists["g"][roomid]["Players"][plnr]["deck"]["onHand"];
}
function populateDeck(roomid, plnr, callback) {
userlists["g"][roomid]["Players"][plnr] = {
"Player": socket.username,
"deck": null,
"MP-Left": 20
};
// Hier könnten nachher dann noch die gekauften Karten und so eingefügt werden,
// bzw. dat vorgefertigte Deck usw.
userlists["g"][roomid]["Players"][plnr]["deck"] = {
"onHand": [],
"onField": [],
"inBlock": []
};
// gCA("pop_onHand", 0, 5, roomid, plnr, callback);
var k1 = 0;
(function loop1() {
if (k1 < 5) {
userlists["g"][roomid]["Players"][plnr]["deck"]["onHand"].push(gRC());
userlists["g"][roomid]["Players"][plnr]["deck"]["onHand"][k1]["position"] = k1;
k1++;
loop1();
} else {
var k2 = 0;
(function loop2() {
if (k2 < 50) {
userlists["g"][roomid]["Players"][plnr]["deck"]["inBlock"].push(gRC());
k2++;
loop2();
} else {
var k3 = 0;
(function loop3() {
if (k3 < 5) {
userlists["g"][roomid]["Players"][plnr]["deck"]["onHand"][k3]["position"] = k3;
k3++;
loop3();
} else {
setTimeout(function() {
typeof callback === 'function' && callback();
}, 50);
}
}());
}
}());
}
}());
}
function snddcks(oppo) {
var oppo = oppo || false;
var roomid = userlists["eo"][socket.username]["gid"];
if (userlists["g"][roomid]["Setup"] === false) {
var k5 = 0;
(function loop5() {
if (k5 < 5) {
userlists["g"][roomid]["Players"][0]["deck"]["onHand"][k5]["position"] = k5;
k5++;
loop5();
} else {
var k6 = 0;
(function loop6() {
if (k6 < 5) {
userlists["g"][roomid]["Players"][1]["deck"]["onHand"][k6]["position"] = k6;
k6++;
loop6();
} else {
setTimeout(function() {
typeof callback === 'function' && callback();
}, 50);
}
}());
}
}());
userlists["g"][roomid]["Setup"] = true;
}
if (oppo === true) {
socket.broadcast.to(roomid).emit('snddcks', {
"d0_MP-Left": userlists["g"][roomid]["Players"][1]["MP-Left"],
"d0_onHand": userlists["g"][roomid]["Players"][1]["deck"]["onHand"],
"d0_onField": userlists["g"][roomid]["Players"][1]["deck"]["onField"],
"d0_inBlockC": userlists["g"][roomid]["Players"][1]["deck"]["inBlock"].length,
"d1_MP-Left": userlists["g"][roomid]["Players"][0]["MP-Left"],
"d1_onHand": userlists["g"][roomid]["Players"][0]["deck"]["onHand"].length,
"d1_onField": userlists["g"][roomid]["Players"][0]["deck"]["onField"],
"d1_inBlockC": userlists["g"][roomid]["Players"][0]["deck"]["inBlock"].length,
});
console.log("Sent decks into " + roomid);
} else if (oppo === false) {
socket.emit('snddcks', {
"d0_MP-Left": userlists["g"][roomid]["Players"][0]["MP-Left"],
"d0_onHand": userlists["g"][roomid]["Players"][0]["deck"]["onHand"],
"d0_onField": userlists["g"][roomid]["Players"][0]["deck"]["onField"],
"d0_inBlockC": userlists["g"][roomid]["Players"][0]["deck"]["inBlock"].length,
"d1_MP-Left": userlists["g"][roomid]["Players"][1]["MP-Left"],
"d1_onHand": userlists["g"][roomid]["Players"][1]["deck"]["onHand"].length,
"d1_onField": userlists["g"][roomid]["Players"][1]["deck"]["onField"],
"d1_inBlockC": userlists["g"][roomid]["Players"][1]["deck"]["inBlock"].length,
});
console.log("Sent decks to " + socket.username);
}
setTimeout(function() {
fs.writeFileSync("userlistsLOG.log", Date().toString() + ":\n" + JSON.stringify(userlists["g"][roomid]["Players"][0]["deck"]["onHand"]) + "\n\n", {
flag: "a"
})
// fs.writeFileSync("userlistsLOG.log", Date().toString()+":\n"+JSON.stringify(userlists["g"][roomid]["Players"][0]["deck"])+"\n\n", {flag:"a"});
// fs.writeFileSync("userlistsLOG.log", Date().toString()+":\n"+JSON.stringify(userlists["g"][roomid]["Players"][1]["deck"])+"\n\n", {flag:"a"});
}, 500);
}
サーバー側でこのタイムアウト事は何を必要とされている:
そしてここでは、「完全固定の質問」-codeですか? 何故再帰的に反復するのですか? – Lemonade
私が理解する限り、NodeJSはほぼ完全に非同期です。 また、クライアントが特定のデータを他のものよりも先に受信しないため、タイムアウトが実際に必要な場所でも(私はかなり覚えていません)。 – AnthyG
実行時環境にいくつかのライブラリを持つJSです。ちょうどブラウザではない。簡単な反復のための関数を持つ理由はありません...あなたのループを書き直してみてください。 メソッド呼び出しの前にタイムアウトを使用しないでください。意味がありません。ブロックしていないソースを待って、しきい値を見積もる必要がある場合に限ります。しかし、これは危険です... – Lemonade