Tic tac toe game in Discord(javascript)使用类,第一次运行,然后以一种奇怪的方式中断
我对javascript和编程都很陌生,我正在为我的服务器创建一个Discord机器人,让人们互相玩tic-tac-toe游戏 由于我对javascript如何工作以及这个游戏在Discord中应该如何工作的知识有限,我决定使用类作为每个游戏的模板。 为了防止文本频道在每次移动后被新消息垃圾邮件,我决定为tic-tac-toe游戏的每个实例创建一个类实例,然后继续编辑一条与某个特定游戏的游戏场相同的消息。这也将允许同时玩多个游戏,而不会相互干扰 在“主脚本”中,我管理侦听传入消息的事件,并在那里侦听命令,以开始与对手的tic-tac-toe游戏 在这里,我从tictactoe文件中的类实例化了一个游戏: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游戏的每个实例创建一个类实例,然后继续编辑一条与某个特定游戏的游戏场相同的消息。这也将允许同时玩多个游戏,而不会相互干扰 在“主脚本”中,我管理侦听传入消息的事件,并在那里
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();
Aconst
声明不会使数组变为常量,只会使变量绑定变为常量。赋值也不会复制数组引用,因此需要执行数组的浅层复制,以避免改变初始标记应该是什么。