【问题标题】:Discord.js Level SystemDiscord.js 关卡系统
【发布时间】:2019-10-13 01:42:20
【问题描述】:

我的“问题”更多是我希望添加的功能,我使用了本指南: https://anidiots.guide/coding-guides/sqlite-based-points-system 我稍微修改了代码,主要是给你随机数量的 XP,我正在寻找编辑需要多少 XP 才能升级。

现在它是一个静态数量,升级需要 5000。我正在尝试让它在每次升级时将升级所需的数量增加 5000。

目前,它的工作方式如下:

1 到 2 级 = 总共需要 5000 经验

2 到 3 级 = 总共需要 10000 经验

目前,每级之间升级所需的数量总是5000。

这就是我希望它的工作方式:

1 到 2 级 = 总共需要 5000 经验

2 到 3 级 = 总共需要 15000 经验

5000 到 2 级,10000 到 3 级,依此类推(每次升级所需的数量增加 5000)

我花了 2 个小时的大部分时间尝试不同的东西,主要是查看完全超出我的深度的代码。 我相信做这样的事情会奏效,但我不知道它是否正确

if (score.level == '1') {
    nextLevel = 5000
}
if (score.level == '2' {
    nextLevel = 10000
}

我非常怀疑这是否正确,否则我的消息事件会很长,因为我计划有 100 个级别

代码全文:

    let score;
    if (message.guild) {
        score = bot.getScore.get(message.author.id, message.guild.id);
        if (!score) {
            score = {
                id: `${message.guild.id}-${message.author.id}`,
                user: message.author.id,
                guild: message.guild.id,
                points: 0,
                level: 1,
            };
        }
        const xpAdd = Math.floor(Math.random() * 10) + 50;
        const curxp = score.points;
        const curlvl = score.level;
        const nxtLvl = score.level * 5000;
        score.points = curxp + xpAdd;
        if (nxtLvl <= score.points) {
            score.level = curlvl + 1;
            const lvlup = new MessageEmbed()
                .setAuthor(
                    `Congrats ${message.author.username}`,
                    message.author.displayAvatarURL()
                )
                .setTitle('You have leveled up!')
                .setThumbnail('https://i.imgur.com/lXeBiMs.png')
                .setColor(color)
                .addField('New Level', curlvl + 1);
            message.channel.send(lvlup).then(msg => {
                msg.delete({
                    timeout: 10000,
                });
            });
        }
        bot.setScore.run(score);
    }

代码按原样运行良好且符合预期,但原样不是很好,因为从 30-31 级升级没有任何奖励,因为从 1-2 级获得所需的 XP 数量相同

【问题讨论】:

  • 这会起作用,但这是一种非常硬编码的方法......

标签: javascript node.js npm discord.js


【解决方案1】:

这里有一个小公式应该可以解决问题(如果我正确理解您的问题):

const nxtLvl = 5000 * (Math.pow(2, score.level) - 1);

这给出了以下升级所需的经验值:

1->2:  5000
2->3:  15000
3->4:  35000
4->5:  75000
5->6: 155000

【讨论】:

  • @Dan 怎么样?如果您想从 2 变为 3,则公式变为 5000 * (Math.pow(2, 2) -1),即 15000;如果您想从 3 变为 4,则变为 5000 * (Math.pow(2, 3) -1),即 35000。它对我来说很好
  • 根据我的理解,当 ``` score.level = 3 ``` 你想要 ``` nxtLvl = 30000 ``` 因为每次你想要增加 5000 所以:``` socre.level = 1; nxtLvl = 5000;. score.level = 2; nxtLvl = 15000;. score.level = 3; nxtLvl = 30000;等等……```
  • 这是一个梦想!虽然后来我意识到需要多少 XP,所以我稍微改变了它。谢谢
【解决方案2】:

试试这样的:

const levels = [0, 5000, 15000, 30000, 50000, 75000];
....
nextLevel = levels[score.level];

编辑

@Dan 你的意思是这样的:

nextLevel = 5000 * Math.round( score.level * (score.level + 1) / 2 );

【讨论】:

  • 这可以工作,但仍然非常硬编码,您需要找到级别的数学表达式。它似乎是一个数学序列,更具体地说,是一个几何级数
  • 我的意思更像是这样的:const nxtLvl = 10000 * (Math.pow(score.level - 1, 2) + 5000; 但是这两个表达都很好
【解决方案3】:

这是我正在使用的代码 但问题是我无法添加或删除 XP 我也是从头开始做的,所以我很生气

let Discord;
let Database;
if (typeof window !== "undefined") {
    Discord = DiscordJS;
    Database = EasyDatabase;
} else {
    Discord = require("discord.js");
    Database = require("easy-json-database");
}
const delay = (ms) => new Promise((resolve) => setTimeout(() => resolve(), ms));
const s4d = {
    Discord,
    client: null,
    tokenInvalid: false,
    reply: null,
    joiningMember: null,
    database: new Database("./db.json"),
    checkMessageExists() {
        if (!s4d.client) throw new Error('You cannot perform message operations without a Discord.js client')
        if (!s4d.client.readyTimestamp) throw new Error('You cannot perform message operations while the bot is not connected to the Discord API')
    }
};
s4d.client = new s4d.Discord.Client({
    fetchAllMembers: true
});
s4d.client.on('raw', async (packet) => {
    if (['MESSAGE_REACTION_ADD', 'MESSAGE_REACTION_REMOVE'].includes(packet.t)) {
        const guild = s4d.client.guilds.cache.get(packet.d.guild_id);
        if (!guild) return;
        const member = guild.members.cache.get(packet.d.user_id) || guild.members.fetch(d.user_id).catch(() => {});
        if (!member) return;
        const channel = s4d.client.channels.cache.get(packet.d.channel_id);
        if (!channel) return;
        const message = channel.messages.cache.get(packet.d.message_id) || await channel.messages.fetch(packet.d.message_id).catch(() => {});
        if (!message) return;
        s4d.client.emit(packet.t, guild, channel, message, member, packet.d.emoji.name);
    }
});
var member_xp, member_level;


s4d.client.login('My Dumb Token').catch((e) => {
    s4d.tokenInvalid = true;
    s4d.tokenError = e;
});

s4d.client.on('message', async (s4dmessage) => {
    if (!((s4dmessage.member).user.bot)) {
        member_xp = s4d.database.get(String(('xp-' + String(s4dmessage.author.id))));
        member_level = s4d.database.get(String(('level-' + String(s4dmessage.author.id))));
        if (!member_xp) {
            member_xp = 0;
        } else if (!member_level) {
            member_level = 0;
        }
        s4d.database.set(String(('xp-' + String(s4dmessage.author.id))), (member_xp + 1));
        member_xp = member_xp + 1;
        if (member_xp > 100) {
            s4d.database.set(String(('level-' + String(s4dmessage.author.id))), (member_level + 1));
            member_level = member_level + 1;
            s4dmessage.channel.send(String((['Congratulations, ', s4dmessage.member, 'you jumped to level ', member_level, '!!'].join(''))));
        }
        if ((s4dmessage.content) == '-level') {
            s4dmessage.channel.send(String(([s4dmessage.member, ', you are currently level: ', member_level].join(''))));
        } else if ((s4dmessage.content) == '-xp') {
            s4dmessage.channel.send(String(([s4dmessage.member, ', you need ', 100 - member_xp, ' to jump to level ', member_level + 1].join(''))));
        }
    }

});

s4d;

【讨论】:

    猜你喜欢
    • 2021-06-02
    • 2011-11-10
    • 1970-01-01
    • 2019-04-30
    • 2020-12-17
    • 2021-05-24
    • 2020-11-06
    • 2021-06-18
    • 2020-10-10
    相关资源
    最近更新 更多