你玩三国志战略版吗?我用nodejs写了一个模拟抽卡!

2,683 阅读2分钟

今年5月迷上了一款游戏【三国志战略版】,已经到第三个赛季了,前前后后冲了1千多块,也有几个核心队伍,今天看到群里一个大佬说,他为了满红刘备冲了4w多(6个刘备),身为程序员的我突然想尝试一下官方提供概率的真实性,废话不说上图;

我们可以看到官方提供的概率如上图所示,其中值得注意的是每5次必获得4星或5星,最多30次必获得5星,这个还是比较友好的不然5.6%的概率真的很低,接下来看代码~

编码阶段

首先,这款游戏是区分赛季的所以在执行脚本写需要进行赛季的选择,所以我们在执行脚本时需要像使用脚手架初始化项一样,对赛季进行选择;

选择赛季

我使用了 inquirer 来进行命令行交互

let inquirer = require('inquirer')
inquirer.prompt([{
   name: 'season',
   type: 'list',
   message: '当前的赛季为',
   choices: [
       {
           name: '第一赛季',
           value: 'S1',
       },
       {
           name: '第二赛季',
           value: "S2",
       },
       {
           name: "第三赛季",
           value: "S3",
       },
       {
           name: "第四赛季",
           value: "S4",
       },
       {
           name: "第五赛季",
           value: "S5",
       },
       {
           name: "第六赛季",
           value: "S6",
       },                        
   ],
}]).then((answers) => {
   // {season: choices['value']} season是上面写的name,choices['value'] 为 choices 中的value
   console.log(answers) 
})

抽卡次数

输入抽卡次数也是一样的插件

    inquirer.prompt([{
       name: 'number',
       message: '你想抽卡多少次'
   }]).then((answers) => {
       console.log('answers',answers)
   })

抽卡概率

既然概率已经给到,5次,30次的特殊规则也已经给到,我们直接按照官方给定的逻辑进行编码

  • 设置随机变量 X,抽卡次数:count,倒霉次数:unluckyNums
  • X为随机数 (0 <= X <=100)
  • 当 0 <= X <= 58.4(58.4 - 0 = 58.4)抽中3星
  • 当 58.4 < X <= 94.4 (94.4 - 58.4 = 36) 抽中4星
  • 当 94.4 < X <= 100 (100 - 94.4 = 5.6) 抽中5星
  • count 为5的倍数时 58.4 < X <=100 抽中4星或5星
  • 直到第30次时 都没有抽中5星(unluckyNums 为 30),进行保底 94.4 < X <= 100 必中五星

抽卡

let fiveStarsBox = [], // 武将池
    count = 0, // 当前次数
    unluckyNums = 0, // 倒霉次数
    fiveNums = 0, // 5星个数
    heros = [], // 抽到的武将
    
function GO() {
    let X = 0 // 随机值
    if (unluckyNums === 30) { // 保底
        X = random(94.4, 100)
        unluckyNums = 0 // 保底过后清空倒霉记录
    } else if (count % 5 === 0) {
        X = random(58.4, 100)
    } else {
        X = random(0, 100)
    }

    if (X >= 0 && X <= 58.4) {
        unluckyNums++ // 3星武将,倒霉记录+1
    } else if (X > 58.4 && X <= 94.4) {
        unluckyNums++ // 4星武将,倒霉记录+1
    } else if (X > 94.4 && X <= 100) {
        let name = fiveStarsBox[Math.floor((Math.random() * fiveStarsBox.length))] // 从5星武将池,随机获取5星武将
        console.log(
        	`第${count}次,随机值:${X}
            恭喜,你抽到了5星武将 【${name}】`
           )
        unluckyNums = 0 // 倒霉记录清空
        fiveNums++
    }
}
// number为执行时输入
function ouHuang(number) {
    while (count < number) {
        count++
        GO(season, number)
    }
    console.log(fiveNums, '个五星')
    console.log(`共${[...new Set(heros)].length}/${fiveStarsBox.length}`)
}

抽满红刘备要花多少钱

先抽1000次

最好的情况下1000次就可以抽完 满红刘备。不好的话可能一个刘备也没有,但是概率还是比较低

2000次试一下

2000次抽到刘备的概率变大了,但是还是不能满红

一口气5000次

3000次、4000次 概率依旧很低,直到5000次的时候才可以保证大概率抽到满红刘备,按照98金猪一次,每个金猪9.8块,5000*9.8 = 4.9w ,看来大佬花了4万多是真的

github地址