NodeJS 井字棋多人游戏

8

我非常沮丧,无法解决这个问题,我已经尝试了好几天。我正在开发一个游戏(井字棋),使用nodeJS实现多人游戏功能。问题不在于游戏本身,而是在于如何处理不同的房间...

我使用socket.join等方法,使用户可以加入不同的房间和游戏板。例如,通过url传递游戏名称:

localhost?gameId=test

然后我解析这个名称,并开始向这些用户发送游戏板信息。问题是,当我有多个房间时,游戏会崩溃,而且来自房间1的游戏板信息也与房间2一起崩溃...我找不到错误,我在这里粘贴代码:

Create.html jsfiddle.net/svaae1vL/

Enter.html jsfiddle.net/6qzbpbxx/

Server.js jsfiddle.net/1q0qo8xo/

就像我之前说过的,问题在于:

房间1:玩家1、玩家2 房间2:玩家3、玩家4

room1:
[x,o,x]
[0, 0, 0]
[x,x,x]

room2:
[x,o,x]
[0, 0, 0]
[x,x,x]

当我点击房间1时,它会影响房间2,请帮忙,我已经卡住几天了...
2个回答

2
我认为你的问题在于你在createRoom事件中共享了变量emptyBoard:

我相信您的问题是在createRoom事件中共享了变量emptyBoard

boards[data.name] = emptyBoard;

因此,如果您编辑其中一个板块,它也会编辑所有其他板块。尝试将分配更改为:
boards[data.name] = emptyBoard.slice(0);

这应该将数组克隆到另一个对象中。

编辑:

使用 slice(0) 克隆数组不会克隆数组中的对象,所以也许你需要进行深度克隆,例如在此处描述。


0

@Dygestor

非常感谢,不过这一行:

boards[data.name] = emptyBoard.slice(0);

还没有被修复,但问题就像你所说的那样,所以我试了这个:

    // Initalize board.
    boards[data.name] = [
                ['', '', ''],
                ['', '', ''],
                ['', '', '']
            ];

它起作用了,非常感谢!


1
正如我在编辑中提到的那样,使用“slice”是不够的,因为您的数组包含其他数组,而“slice”不执行深层克隆。无论如何,我很高兴它能够工作。 - Dygestor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接