Discord.js while 循环不执行其中发送的消息
Discord.js While loop not executing the messsage sending in it
如果最近开始研究 rpg 机器人。
我正在尝试实现一个回合制战斗系统。
但是在这个过程中我发现我的 while 循环应该让战斗 运行 直到有人获胜,不会发送任何消息让玩家能够玩 (console.log 评论有效,但通过 discord api).
发送的消息无效
我认为它由于某种原因无法自行解决。
这是我正在使用的代码。
let winner = false;
let filter = m => m.author.id === message.author.id;
message.channel.send("A battle is about to begin !");
do {
message.channel.send(`What attack do you wanna use ?`).then(() => {
message.channel.awaitMessages(filter, {
max: 1,
time: 30000,
errors: ['time']
}).then(message => {
message = message.first()
if (message.content.toUpperCase() == 'Fireball' || message.content.toUpperCase() == 'fireball') {
message.channel.send(`Fireball has been used !`)
} else {
message.channel.send(`Terminated: Invalid Response`)
}
}).catch(collected => {
message.channel.send('Timeout');
});
})
} while (battleStats[0]["CurrentHp"] != 0);
注:battleStats[0]["CurrentHp"]
的值为100,包含一个Int值
String.prototype.toUpperCase()
使整个字符串大写,而不仅仅是第一个字母。除此之外,如果已经有同名的变量,则无法分配一个变量,就像您对 message
所做的那样。要解决此问题,请将 .then()
设置成这样。如果有任何您未指定的错误,也可能是其他地方的问题。
.then(messages => {
let response = messages.first()
if (response.content.toLowerCase() === "fireball") {
message.channel.send(`Fireball has been used!`);
/* change hp here */
} else {
message.channel.send(`Terminated: Invalid Response`);
break // to leave the while loop
}
}).catch(error => {
message.channel.send('Timeout');
break // also to leave the while loop
});
好吧,经过一番思考,我决定去掉 while 循环,它是问题的根源。我从这个 post 中获得了灵感。这让我意识到完全没有必要使用 while 循环来创建回合制战斗。
所以为了解决这个问题,我使用 module.exports
模块导出了一个包含我所有玩家和对手数据的对象。
通过在其他命令中请求它,我们将能够存储数据并针对回合制战斗系统进行修改。
万一你在徘徊我在这里使用的代码。
开始战斗命令,开始收集玩家和敌人的数据。 (请注意,我现在正在使用一个对象来存储数据并注意一个数组。
database.execute(
'SELECT * FROM `tstats`, `tMstats` WHERE playerId = ? and monsterStatsId = ?',
[`${message.author.id}`, utility.randomIntFromInterval(1, 2)]
//the randomIntFromInterval function is just here to select a random ennemy from id
, function (err, result, fields) {
if (err) throw err;
Stats.MaxHp = parseInt(result[0]['playerMaxHp']);
Stats.CurrentHp = parseInt(result[0]['playerCurrentHp']);
Stats.MaxMana = parseInt(result[0]['playerMaxMana']);
Stats.CurrentMana = parseInt(result[0]['playerCurrentMana']);
Stats.PhysicalDefence = parseInt(result[0]['playerPhysicalDefence']);
Stats.MagicalDefence = parseInt(result[0]['playerMagicalDefence']);
Stats.Speed = parseInt(result[0]['playerSpeed']);
Stats.Level = parseInt(result[0]['playerLevel']);
Stats.Xp = parseInt(result[0]['playerXp']);
Stats.Evasion = parseInt(result[0]['playerEvasion']);
MStats.name = result[0]['monsterName']
MStats.MaxHp = parseInt(result[0]['monsterMaxHp']);
MStats.CurrentHp = parseInt(result[0]['monsterCurrentHp']);
MStats.MaxMana = parseInt(result[0]['monsterMaxMana']);
MStats.CurrentMana = parseInt(result[0]['monsterCurrentMana']);
MStats.PhysicalDefence = parseInt(result[0]['monsterPhysicalDefence']);
MStats.MagicalDefence = parseInt(result[0]['monsterMagicalDefence']);
MStats.Speed = parseInt(result[0]['monsterSpeed']);
MStats.Level = parseInt(result[0]['monsterLevel']);
MStats.Evasion = parseInt(result[0]['monsterEvasion']);
let battle = combat.initiateBattle(message.author.id, MStats.name);
utility.addBattle(battle);
message.channel.send("A battle is about to begin !");
module.exports = { Stats, MStats };
});
这是我的实用程序文件,其中包含 JSON 中的战斗记录系统所需的一组功能。
const fs = require("fs");
const logs = require('../database/battleLog.json')
let data = JSON.parse(fs.readFileSync('/home/username/Desktop/Dev perso/Nazarick/database/battleLog.json'));
function setIndex(nombre) {
data["index"] = nombre
fs.writeFile('/home/username/Desktop/Dev perso/Nazarick/database/battleLog.json', JSON.stringify(data), (err) => {
if (err) console.log(err);
});
}
function addBattle(battle) {
data["battle"].push({
id: battle["battle"]["id"],
current_turn: {
owner: battle["battle"]["current_turn"]["owner"],
number: battle["battle"]["current_turn"]["number"]
}
});
fs.writeFile('/home/username/Desktop/Dev perso/Nazarick/database/battleLog.json', JSON.stringify(data), (err) => {
if (err) console.log(err);
});
}
function randomIntFromInterval(min, max) { // min and max included
return Math.floor(Math.random() * (max - min + 1) + min)
}
function generateId(prefix, start) {
start = data["index"];
var i = start+1 || 1;
return function () {
setIndex(i)
return prefix + i++;
}
}
var id = generateId("battle_", 1);
module.exports = {
randomIntFromInterval,
id,
addBattle
};
终于战斗函数文件开始战斗了
const utility = require('./utility.js');
class Battle {
constructor(attacker, target) {
this.attacker = attacker;
this.target = target;
}
};
globalBattlesList = new Set();
// Starts a Battle -- could throw an exception if either combatant is already in combat.
function initiateBattle(attacker, target) {
var battle = new Battle(attacker, target);
return {
battle: {
id: utility.id(),
current_turn: {
owner: attacker,
number: 1,
}
}
};
}
// Send an attack in a battle
function attack(battle, attacker, target) {
if (battle.current_turn.owner != attack) {
return { result: "error", message: "It's not your turn!" };
}
target.HP -= attacker.ATK;
if (target.HP <= 0) {
game.end_battle(battle);
return {
status: "OK",
winner: attacker,
message: "${attacker.name} wins in ${battle.current_turn.number} turns!"
};
}
// change turn
battle.current_turn = { owner: target, number: battle.current_turn.number + 1 };
// does the AI have a delay?
setTimeout(function () {
// do_enemy_turn will choose an action for the AI
// and set battle.current_turn back to
do_enemy_turn(battle, target, attacker);
}, target.attack_delay);
return {
result: "continue",
message: `target is at ${target.HP} HP`
};
}
module.exports = { initiateBattle, attack };
注意:攻击函数未针对此设置进行调整。
如果最近开始研究 rpg 机器人。
我正在尝试实现一个回合制战斗系统。
但是在这个过程中我发现我的 while 循环应该让战斗 运行 直到有人获胜,不会发送任何消息让玩家能够玩 (console.log 评论有效,但通过 discord api).
发送的消息无效我认为它由于某种原因无法自行解决。
这是我正在使用的代码。
let winner = false;
let filter = m => m.author.id === message.author.id;
message.channel.send("A battle is about to begin !");
do {
message.channel.send(`What attack do you wanna use ?`).then(() => {
message.channel.awaitMessages(filter, {
max: 1,
time: 30000,
errors: ['time']
}).then(message => {
message = message.first()
if (message.content.toUpperCase() == 'Fireball' || message.content.toUpperCase() == 'fireball') {
message.channel.send(`Fireball has been used !`)
} else {
message.channel.send(`Terminated: Invalid Response`)
}
}).catch(collected => {
message.channel.send('Timeout');
});
})
} while (battleStats[0]["CurrentHp"] != 0);
注:battleStats[0]["CurrentHp"]
的值为100,包含一个Int值
String.prototype.toUpperCase()
使整个字符串大写,而不仅仅是第一个字母。除此之外,如果已经有同名的变量,则无法分配一个变量,就像您对 message
所做的那样。要解决此问题,请将 .then()
设置成这样。如果有任何您未指定的错误,也可能是其他地方的问题。
.then(messages => {
let response = messages.first()
if (response.content.toLowerCase() === "fireball") {
message.channel.send(`Fireball has been used!`);
/* change hp here */
} else {
message.channel.send(`Terminated: Invalid Response`);
break // to leave the while loop
}
}).catch(error => {
message.channel.send('Timeout');
break // also to leave the while loop
});
好吧,经过一番思考,我决定去掉 while 循环,它是问题的根源。我从这个 post 中获得了灵感。这让我意识到完全没有必要使用 while 循环来创建回合制战斗。
所以为了解决这个问题,我使用 module.exports
模块导出了一个包含我所有玩家和对手数据的对象。
通过在其他命令中请求它,我们将能够存储数据并针对回合制战斗系统进行修改。
万一你在徘徊我在这里使用的代码。
开始战斗命令,开始收集玩家和敌人的数据。 (请注意,我现在正在使用一个对象来存储数据并注意一个数组。
database.execute(
'SELECT * FROM `tstats`, `tMstats` WHERE playerId = ? and monsterStatsId = ?',
[`${message.author.id}`, utility.randomIntFromInterval(1, 2)]
//the randomIntFromInterval function is just here to select a random ennemy from id
, function (err, result, fields) {
if (err) throw err;
Stats.MaxHp = parseInt(result[0]['playerMaxHp']);
Stats.CurrentHp = parseInt(result[0]['playerCurrentHp']);
Stats.MaxMana = parseInt(result[0]['playerMaxMana']);
Stats.CurrentMana = parseInt(result[0]['playerCurrentMana']);
Stats.PhysicalDefence = parseInt(result[0]['playerPhysicalDefence']);
Stats.MagicalDefence = parseInt(result[0]['playerMagicalDefence']);
Stats.Speed = parseInt(result[0]['playerSpeed']);
Stats.Level = parseInt(result[0]['playerLevel']);
Stats.Xp = parseInt(result[0]['playerXp']);
Stats.Evasion = parseInt(result[0]['playerEvasion']);
MStats.name = result[0]['monsterName']
MStats.MaxHp = parseInt(result[0]['monsterMaxHp']);
MStats.CurrentHp = parseInt(result[0]['monsterCurrentHp']);
MStats.MaxMana = parseInt(result[0]['monsterMaxMana']);
MStats.CurrentMana = parseInt(result[0]['monsterCurrentMana']);
MStats.PhysicalDefence = parseInt(result[0]['monsterPhysicalDefence']);
MStats.MagicalDefence = parseInt(result[0]['monsterMagicalDefence']);
MStats.Speed = parseInt(result[0]['monsterSpeed']);
MStats.Level = parseInt(result[0]['monsterLevel']);
MStats.Evasion = parseInt(result[0]['monsterEvasion']);
let battle = combat.initiateBattle(message.author.id, MStats.name);
utility.addBattle(battle);
message.channel.send("A battle is about to begin !");
module.exports = { Stats, MStats };
});
这是我的实用程序文件,其中包含 JSON 中的战斗记录系统所需的一组功能。
const fs = require("fs");
const logs = require('../database/battleLog.json')
let data = JSON.parse(fs.readFileSync('/home/username/Desktop/Dev perso/Nazarick/database/battleLog.json'));
function setIndex(nombre) {
data["index"] = nombre
fs.writeFile('/home/username/Desktop/Dev perso/Nazarick/database/battleLog.json', JSON.stringify(data), (err) => {
if (err) console.log(err);
});
}
function addBattle(battle) {
data["battle"].push({
id: battle["battle"]["id"],
current_turn: {
owner: battle["battle"]["current_turn"]["owner"],
number: battle["battle"]["current_turn"]["number"]
}
});
fs.writeFile('/home/username/Desktop/Dev perso/Nazarick/database/battleLog.json', JSON.stringify(data), (err) => {
if (err) console.log(err);
});
}
function randomIntFromInterval(min, max) { // min and max included
return Math.floor(Math.random() * (max - min + 1) + min)
}
function generateId(prefix, start) {
start = data["index"];
var i = start+1 || 1;
return function () {
setIndex(i)
return prefix + i++;
}
}
var id = generateId("battle_", 1);
module.exports = {
randomIntFromInterval,
id,
addBattle
};
终于战斗函数文件开始战斗了
const utility = require('./utility.js');
class Battle {
constructor(attacker, target) {
this.attacker = attacker;
this.target = target;
}
};
globalBattlesList = new Set();
// Starts a Battle -- could throw an exception if either combatant is already in combat.
function initiateBattle(attacker, target) {
var battle = new Battle(attacker, target);
return {
battle: {
id: utility.id(),
current_turn: {
owner: attacker,
number: 1,
}
}
};
}
// Send an attack in a battle
function attack(battle, attacker, target) {
if (battle.current_turn.owner != attack) {
return { result: "error", message: "It's not your turn!" };
}
target.HP -= attacker.ATK;
if (target.HP <= 0) {
game.end_battle(battle);
return {
status: "OK",
winner: attacker,
message: "${attacker.name} wins in ${battle.current_turn.number} turns!"
};
}
// change turn
battle.current_turn = { owner: target, number: battle.current_turn.number + 1 };
// does the AI have a delay?
setTimeout(function () {
// do_enemy_turn will choose an action for the AI
// and set battle.current_turn back to
do_enemy_turn(battle, target, attacker);
}, target.attack_delay);
return {
result: "continue",
message: `target is at ${target.HP} HP`
};
}
module.exports = { initiateBattle, attack };
注意:攻击函数未针对此设置进行调整。