Tic-tac-toe游戏在Discord(javascript)中使用类,第一次工作,然后以一种奇怪的方式中断



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

由于我对javascript如何工作以及这个游戏应该如何在Discord内部工作的了解有限,我决定使用类作为每个游戏的模板。为了防止每次移动后文本频道都会收到新消息,我决定为井字游戏的每个实例创建一个类实例,然后继续编辑一个与特定游戏的游戏环境相同的消息。这也将允许在不相互干扰的情况下同时玩多个游戏。

在"主脚本"中,我管理侦听传入消息的事件,在那里它侦听与对手开始井字游戏的命令。

在这里,我从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
}
})

从井字游戏类上的invite((方法中,通过来回调用该类上其他方法中的方法来"管理"游戏。

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

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

这样我就可以在游戏中从这个阵列中移除标记,以表明棋盘上的这个位置已经被玩家的一个动作占据。(这是通过在类的方法中执行this.markers[i] = 'used'来完成的(

第一次游戏开始时一切都很好,但第二次似乎以某种方式改变了标记的恒定阵列,就像我说的第一场游戏中转3圈,然后结束游戏并开始第二场游戏,控制台记录这个阵列时,它显示的阵列中有"已使用"的字符串,取代了第一场比赛中使用过的相同标记,尽管这个数组是一个常量变量,而且我只更改了与类绑定的数组。这让我很困惑。

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

提前感谢!

在构造函数中,使用this.markers=marks.slice((;const声明不会使数组变为常量,只会使变量绑定变为常量。赋值也不会复制数组引用,因此您需要执行数组的浅层复制,以避免初始标记发生突变。–Patrick Roberts 25分钟前

非常感谢!现在效果很好!:(

相关内容

最新更新