实现小概率函数?
Implement small % chance function?
我已经为我的 discord 机器人 (v13) 创建了一个命令,它的工作方式如下:
user 1 pings user 2
bot checks db to see if user 1's reputation is higher than user 2
if higher or equal to, user 1 wins and user 2 receives health decrease
if lower, user 1 loses and receives health decrease.
但是,我想补充一点,即使用户 1 的最大值少了 50 分,他们仍然有(小,25%)获胜的机会。因此,如果用户 1 有 70,用户 2 有 100,用户 2 仍然可能被击败。我不确定具体该怎么做,如有任何帮助,我们将不胜感激。
const profileModel = require("../models/profileSchema");
module.exports = {
name: "challenge",
description: "challenge a user",
async execute(client, message, args, cmd, discord, profileData) {
if (!args.length) return message.channel.send("You need to mention the user you are trying to challenge.");
const randomNumber1 = Math.floor(Math.random() * 15) + 1;
const randomNumber2 = Math.floor(Math.random() * 15) + 1;
const target = message.mentions.users.first();
const user = message.author || message.author;
if (!target) return message.channel.send("This user does not exist.");
try {
const targetData = await profileModel.findOne({ userID: target.id });
const userData = await profileModel.findOne({ userID: user.id });
if (userData.reputation >= targetData.reputation){
await profileModel.findOneAndUpdate(
{
userID: target.id,
},
{
$inc: {
health: -randomNumber1,
},
}
);
return message.channel.send(`You were victorious! ${target} took ${randomNumber2} damage!`);
} else {
await profileModel.findOneAndUpdate(
{
userID: user.id,
},
{
$inc: {
health: -randomNumber1,
},
}
);
return message.channel.send(`You were defeated! ${user} took ${randomNumber2} damage!`);
}
} catch (err) {
console.log(err);
}
}
};
let profileData;
try {
profileData = await profileModel.findOne({ userID: message.author.id });
if(!profileData){
let profile = await profileModel.create({
name: message.author.id,
userID: message.author.id,
serverID: message.guild.id,
reputation: 0,
health: 100,
});
profile.save();
}
} catch (err) {
console.log(err);
}
使用Math.random()
是一种方法。你可以这样做:
// User 1 has challenged user 2
if(user1.reputation < user2.reputation) {
// user1 presumably loses, but...
if(Math.floor(Math.random() * 4) === 0) {
// Here, we generate a random number, either 0, 1, 2, or 3. If 0 is picked (25% chance)...
// User 1 is lucky!
// User 1 still wins because of chance
} else {
// Oops, bad choice user1, you just lost. Luck didn't like you either
}
} else {
// User 1's reputation is higher
}
关于 Math.random()
的更多文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random
我已经为我的 discord 机器人 (v13) 创建了一个命令,它的工作方式如下:
user 1 pings user 2
bot checks db to see if user 1's reputation is higher than user 2
if higher or equal to, user 1 wins and user 2 receives health decrease
if lower, user 1 loses and receives health decrease.
但是,我想补充一点,即使用户 1 的最大值少了 50 分,他们仍然有(小,25%)获胜的机会。因此,如果用户 1 有 70,用户 2 有 100,用户 2 仍然可能被击败。我不确定具体该怎么做,如有任何帮助,我们将不胜感激。
const profileModel = require("../models/profileSchema");
module.exports = {
name: "challenge",
description: "challenge a user",
async execute(client, message, args, cmd, discord, profileData) {
if (!args.length) return message.channel.send("You need to mention the user you are trying to challenge.");
const randomNumber1 = Math.floor(Math.random() * 15) + 1;
const randomNumber2 = Math.floor(Math.random() * 15) + 1;
const target = message.mentions.users.first();
const user = message.author || message.author;
if (!target) return message.channel.send("This user does not exist.");
try {
const targetData = await profileModel.findOne({ userID: target.id });
const userData = await profileModel.findOne({ userID: user.id });
if (userData.reputation >= targetData.reputation){
await profileModel.findOneAndUpdate(
{
userID: target.id,
},
{
$inc: {
health: -randomNumber1,
},
}
);
return message.channel.send(`You were victorious! ${target} took ${randomNumber2} damage!`);
} else {
await profileModel.findOneAndUpdate(
{
userID: user.id,
},
{
$inc: {
health: -randomNumber1,
},
}
);
return message.channel.send(`You were defeated! ${user} took ${randomNumber2} damage!`);
}
} catch (err) {
console.log(err);
}
}
};
let profileData;
try {
profileData = await profileModel.findOne({ userID: message.author.id });
if(!profileData){
let profile = await profileModel.create({
name: message.author.id,
userID: message.author.id,
serverID: message.guild.id,
reputation: 0,
health: 100,
});
profile.save();
}
} catch (err) {
console.log(err);
}
使用Math.random()
是一种方法。你可以这样做:
// User 1 has challenged user 2
if(user1.reputation < user2.reputation) {
// user1 presumably loses, but...
if(Math.floor(Math.random() * 4) === 0) {
// Here, we generate a random number, either 0, 1, 2, or 3. If 0 is picked (25% chance)...
// User 1 is lucky!
// User 1 still wins because of chance
} else {
// Oops, bad choice user1, you just lost. Luck didn't like you either
}
} else {
// User 1's reputation is higher
}
关于 Math.random()
的更多文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random