Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tic tac toe game in Discord(javascript)使用类,第一次运行,然后以一种奇怪的方式中断_Javascript_Node.js_Class_Discord.js_Tic Tac Toe - Fatal编程技术网

Tic tac toe game in Discord(javascript)使用类,第一次运行,然后以一种奇怪的方式中断

Tic tac toe game in Discord(javascript)使用类,第一次运行,然后以一种奇怪的方式中断,javascript,node.js,class,discord.js,tic-tac-toe,Javascript,Node.js,Class,Discord.js,Tic Tac Toe,我对javascript和编程都很陌生,我正在为我的服务器创建一个Discord机器人,让人们互相玩tic-tac-toe游戏 由于我对javascript如何工作以及这个游戏在Discord中应该如何工作的知识有限,我决定使用类作为每个游戏的模板。 为了防止文本频道在每次移动后被新消息垃圾邮件,我决定为tic-tac-toe游戏的每个实例创建一个类实例,然后继续编辑一条与某个特定游戏的游戏场相同的消息。这也将允许同时玩多个游戏,而不会相互干扰 在“主脚本”中,我管理侦听传入消息的事件,并在那里

我对javascript和编程都很陌生,我正在为我的服务器创建一个Discord机器人,让人们互相玩tic-tac-toe游戏

由于我对javascript如何工作以及这个游戏在Discord中应该如何工作的知识有限,我决定使用类作为每个游戏的模板。 为了防止文本频道在每次移动后被新消息垃圾邮件,我决定为tic-tac-toe游戏的每个实例创建一个类实例,然后继续编辑一条与某个特定游戏的游戏场相同的消息。这也将允许同时玩多个游戏,而不会相互干扰

在“主脚本”中,我管理侦听传入消息的事件,并在那里侦听命令,以开始与对手的tic-tac-toe游戏

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

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
    }
})
通过tic-tac-toe游戏类上的invite()方法,通过从类上的其他方法内部来回调用方法来“管理”游戏

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

此列表作为discord bot对帖子的反应添加,也添加到构造函数中的类中:
this.markers=markers

这样,我可以在游戏期间从这个数组中移除标记,以表明棋盘上的这个位置已经被玩家的一个移动占据。(这是通过在类上的一个方法中执行
This.markers[I]=“used”
来完成的)

第一次开始游戏时,一切正常,但第二次似乎不知何故,这个恒定的标记数组被改变了,就像我说的第一场游戏中3圈,然后结束游戏并开始第二场游戏,然后控制台记录这个数组,它用“使用过的”字符串显示数组,替换相同的标记尽管这个数组是一个常量变量,但在第一场游戏中已经用光了,我只改变了绑定到类的数组。这让我非常困惑

如果有人能告诉我我做错了什么,那就太好了

提前谢谢

在构造函数中,使用this.markers=markers.slice();常量声明不会使数组变为常量,只会使变量绑定变为常量。赋值也不会复制数组引用,因此您需要执行数组的浅层复制,以避免改变初始标记应该是什么


非常感谢!现在可以很好地工作了!:)

这太多了,无法解包。请尽可能狭窄地找到问题所在,并简要说明错误所在。我编辑了我的帖子,删除了许多示例,使其更加紧凑,希望这能让它更清晰。在构造函数中,使用
This.markers=markers.slice();
A
const
声明不会使数组变为常量,只会使变量绑定变为常量。赋值也不会复制数组引用,因此需要执行数组的浅层复制,以避免改变初始标记应该是什么。