【发布时间】:2020-09-10 19:40:56
【问题描述】:
我对 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
}
})
通过tic tac toe Game 类的invite() 方法,通过从类的其他方法内部来回调用方法来“管理”游戏。
这个游戏的玩法是玩家可以通过按下这些标记的反应按钮来对消息做出反应(这些标记每个代表棋盘上的 9 个点之一),这些标记在数组中初始化,如下所示井字游戏模块:
const markers = ['↖️', '⬆️', '↗️', '⬅️', '⏺️', '➡️', '↙️', '⬇️', '↘️']
这个列表是由 discord 机器人作为对帖子的反应添加的,也被添加到构造函数中的类中:
this.markers = markers
这样我就可以在游戏过程中从这个数组中删除标记,以表明棋盘上的这个位置已经被玩家的一个移动占据了。 (这是通过在类的方法中执行 this.markers[i] = 'used' 来完成的)
第一次开始游戏时一切正常,但第二次似乎以某种方式改变了这个恒定的标记数组,就像我在第一场比赛中说 3 回合,然后结束那场比赛并开始第二个游戏,控制台记录这个数组,它显示数组,用“使用”字符串替换第一个游戏中用过的相同标记,尽管这个数组是一个常量变量,我只改变了数组与班级有关。这让我很困惑。
如果有人能够阐明我在这里做错了什么,那就太好了。
提前致谢!
【问题讨论】:
-
这太多了,无法解压。尽可能狭隘地找出问题所在并简要说明问题所在
-
我已经编辑了我的帖子,删除了很多示例并使其更加紧凑,希望这会让它更清晰。
-
在你的构造函数中,使用
this.markers = markers.slice();const声明不会使数组成为常量,只是变量绑定。赋值也不会复制数组引用,因此您需要执行数组的浅拷贝以避免改变初始标记应该是什么。
标签: javascript node.js class discord.js tic-tac-toe