Система уровней Discord.js

Моя «проблема» - это скорее функция, которую я хочу добавить, я использовал это руководство: https://anidiots.guide/coding-guides/sqlite-based-points-system Я немного изменил код, чтобы в основном дать вам случайное количество XP, я хочу отредактировать, сколько XP необходимо для повышения уровня.

На данный момент это статическая сумма, для повышения уровня необходимо 5000. Я пытаюсь увеличить количество, необходимое для повышения уровня, на дополнительные 5000 каждый раз, когда вы повышаете уровень.

В настоящее время это работает так:

Level 1 to 2 = 5000 total XP needed

Level 2 to 3 = 10000 total xp needed

В настоящее время сумма, необходимая для повышения уровня, всегда составляет 5000 между каждым уровнем.

Вот как я хочу, чтобы это работало:

Level 1 to 2 = 5000 total XP needed

Level 2 to 3 = 15000 total XP needed

Это будет 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.

Это будет работать, но это очень Жесткий код способ сделать это...

Dan 27.05.2019 15:17
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
13 994
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вот небольшая формула, которая должна помочь (если я правильно понимаю вашу проблему):

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

Это дает следующие требования к опыту для повышения уровня:

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

@Дан как так? Если вы хотите перейти от 2 к 3, формула становится 5000 * (Math.pow(2, 2) -1), что составляет 15000, а если вы хотите перейти от 3 к 4, она становится 5000 * (Math.pow(2, 3) -1), что составляет 35000. Это отлично работает для меня.

T. Dirks 27.05.2019 15:33

Из того, что я понял, когда ```score.level = 3``` вы хотите``` nxtLvl = 30000```, потому что каждый раз, когда вы хотите увеличить 5000, поэтому:``` socre.level = 1; nxtLvl = 5000;. оценка.уровень = 2; nxtLvl = 15000; оценка.уровень = 3; nxtLvl = 30000; И так далее.... ```

Dan 27.05.2019 15:40

Это сработало, мечта! Хотя потом я понял, насколько высок был необходимый XP, поэтому немного изменил его. Спасибо

Ragnar Lothbrok 27.05.2019 17:46

Попробуйте что-то вроде этого:

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

Редактировать

@ Дэн, ты имеешь в виду вот что:

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

Это будет работать, но все еще довольно жестко запрограммировано, вам нужно найти математическое выражение для уровней. Похоже на математическую последовательность, точнее, геометрическая прогрессия

Dan 27.05.2019 16:22

Я имею в виду примерно так: const nxtLvl = 10000 * (Math.pow(score.level - 1, 2) + 5000; Но оба выражения довольно хороши

Dan 27.05.2019 17:57

Вот код, который я использую Но проблема в том, что я не могу добавить или удалить 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;

Другие вопросы по теме