Discord (javascript) 中使用 类 的井字游戏,第一次运行正常,然后以一种奇怪的方式中断

Tic tac toe game in Discord (javascript) using classes, works first time around, then breaks in a weird way

我对 javascript 和一般编程还很陌生,我正在为我的服务器创建一个 Discord 机器人,供人们玩井字游戏。

由于我对 javascript 的工作原理以及这款游戏在 Discord 中的工作原理了解有限,我决定使用 classes 作为每个游戏的模板。 为了防止文本频道在每次移动后都被新消息发送垃圾邮件,我决定为井字游戏的每个实例创建一个 class 实例,然后继续编辑一条相同的消息用作一场特定比赛的比赛场地。这也将允许同时玩多个游戏而不会相互干扰。

在 'main script' 中,我管理侦听传入消息的事件,并在那里侦听与对手开始井字游戏的命令。

在这里,我从 tictactoe 文件中的 class 实例化了一个游戏:

client.on('message', async msg => {
    if(msg.author.bot || msg.channel.id != gamesChannel) return

    let args = msg.content.split(' ')
    let cmd = args[0].slice(prefix.length)

    switch(cmd){
        case 'ttt':
                let player = msg.author
                let opponent = GetUserFromMention(args[1])

                let tttGame = new tictactoe.Game(msg.channel, player, opponent)
                tttGame.Invite()
            }
        break
    }
})

来自井字游戏 class 的 invite() 方法,游戏是 'managed' 通过在 class 的其他方法中来回调用方法。

这个游戏的玩法是玩家可以通过按下这些标记的反应按钮来对消息做出反应(这些标记每个代表棋盘上的 9 个点之一),这些标记在这样的数组中初始化在 tic tac toe 模块中: const markers = ['↖️', '⬆️', '↗️', '⬅️', '⏺️', '➡️', '↙️', '⬇️', '↘️']

此列表作为对 post 的反应由 discord 机器人添加,并且还添加到构造函数中的 class: this.markers = markers

这样我就可以在游戏过程中从这个数组中删除标记,以指示棋盘上的这个位置已经被其中一个玩家的动作占据。 (这是通过在 class 的方法中执行 this.markers[i] = 'used' 来完成的)

游戏第一次开始时一切正常,但第二次开始时,似乎这个恒定的标记数组不知何故被改变了,就像我在第一场比赛中说的 3 回合,然后结束那个游戏并开始第二个游戏,控制台记录这个数组,它显示数组 'used' 字符串替换第一个游戏中用完的相同标记,尽管这个数组是一个常量变量,而我永远更改绑定到 class 的数组。这让我很困惑。

如果有人能够阐明我在这里做错了什么,那就太好了。

提前致谢!

In your constructor, use this.markers = markers.slice(); A const declaration doesn't make the array constant, just the variable binding. An assignment does not copy the array reference either, so you need to perform a shallow copy of the array in order to avoid mutating what the initial markers should be. – Patrick Roberts 25 mins ago

非常感谢!现在完美运行! :)