【cocos creator】抽卡游戏随机数生成,权重随机

在这里插入图片描述
先按星级权重随机,再按该星级内卡片权重随机

//Search.ts
import Util from "./Util";

const { ccclass, property } = cc._decorator;


@ccclass
export default class NewClass extends cc.Component {

    @property(cc.Node)
    label: cc.Node = null;

    @property
    text: string = 'hello';
    private table: any = null;
    private Indexes: Array<any> = [];//索引数组,记录每个等级开始数组下标

    // LIFE-CYCLE CALLBACKS:

    onLoad() {
        //table.json放在resources文件夹下
        Util.lodeJson("table", (table) => {
            cc.log("加载json文件成功", table)
            this.table = table;
            Util.sortArr(this.table.things);
            var arr = this.table.things;
            for (var i = 0; i < arr.length; i++) {
                if (arr[i].id % 1000 == 1) {
                    var temp: any = {};
                    temp.id = arr[i].id;
                    temp.index = i;
                    this.Indexes.push(temp);
                }
            }
        })
    }

    findByIndex(id) {
        if (!this.table) return;
        if (id < 1000) return false;
        var index1 = Util.fix(id / 1000) * 1000;
        var arr = this.table.things;

        var index = this.Indexes.findIndex(value => { return value.id > index1 })
        var StartIndex = this.Indexes[index].index;
        return arr[StartIndex + id % 1000 - 1];
    }

    getLevelArr(indexesArr: Array<any>, arr: Array<any>, level) {
        var indexStart = indexesArr.findIndex(value => { return value.id > level * 1000 });
        var indexEnd = indexesArr.findIndex(value => { return value.id > (level + 1) * 1000 });
        if (indexEnd == -1) {
            indexEnd = undefined;
            var levelArr = arr.slice(indexesArr[indexStart].index);
            return levelArr;
        }
        var levelArr = arr.slice(indexesArr[indexStart].index, indexesArr[indexEnd].index);
        return levelArr;
    }

    /**获取权重随机对象 */
    getRandByWeight() {
        if (!this.table) return;
        var level = Util.getRandomByWeight(this.table.level_weight).level;
        var levelArr = this.getLevelArr(this.Indexes, this.table.things, level);
        return Util.getRandomByWeight(levelArr);
    }

    start() {

    }

    onBtnClick() {
        if (!this.table) return;
        var arr = {};
        for (var i = 0; i < 100; i++) {
            var id = this.getRandByWeight().id;
            if (!arr[id]) {
                arr[id] = 1;
            }
            else {
                arr[id] += 1;
            }
        }
        var str = "";
        for (var value in arr) {
            if (parseInt(value) % 1000 == 1) str += "\n\n⭐ " + Util.fix(parseInt(value) / 1000) + "   ";
            str += value + ":" + arr[value] + "   ";
        }
        Util.setLabelString(this.label, str);
        cc.log(arr);
    }

    // update (dt) {}
}

//util.ts
const { ccclass, property } = cc._decorator;

@ccclass
export default class Util {

    public static isValidNode(node) {
        return node && node.isValid;
    }
    /**
     * 随机一个范围 min~max 的整数 
     * @param {*} min min为一个整数或者为一个2元素的数组
     * @param {*} max max为整数或者没有
     */
    public static randomInt(min, max) {
        if (max === undefined) {
            max = min[1];
            min = min[0];
        }
        return Math.floor(Math.random() * (max - min + 1)) + min;
    }

    public static lodeJson(name: string, callBsck: any) {
        cc.loader.loadRes("json/" + name, cc.Asset, (err, asset) => {
            if (err) {
                cc.log("加载json文件出错", err);
            }
            if (callBsck) callBsck(asset.json);
        })
    }

    public static setLabelString(node: cc.Node, str: string) {
        if (!this.isValidNode(node)) return;
        var label = node.getComponent(cc.Label);
        if (!label) return;
        label.string = str;
    }
    //data为属性,list为数组名
    public static sortData(a, b, desc?,) {
        if (desc == false) {
            // 降序排列
            return b["id"] - a["id"]
        } else {
            // 升序排列
            return a["id"] - b["id"]
        }
    }
    /**数组排序 */
    public static sortArr(list: []) {
        list.sort(this.sortData);
    }
    /**
     * 保留指定位数的小数(不强制)0会自动省去
     * @param {*} num 数字
     * @param {*} fixTo 要保留的小数位数
     * @param {*} isRounding 四舍五入/向下取整(默认为向下取整)
     */
    public static fix(num, fixTo?, isRounding?) {
        if (typeof (String)) num = parseInt(num);
        num *= 1;
        var exp = Math.pow(10, fixTo || 0);
        if (isRounding) {
            num = Math.floor(num.toFixed(fixTo) * exp) / exp;
        } else {
            num = Math.floor(num * exp) / exp;
        }
        return num;
    }
    /**按权重随产生机值,返回随机到的对象
     * weights_arr{
     * weight:10,
     * }
    */
    public static getRandomByWeight(weights_arr) {
        var total_weight = weights_arr.reduce((total, w) => { return total + w.weight }, 0);
        var rand = Math.random() * total_weight;
        for (var i = 0; i < weights_arr.length; i++) {
            rand = rand - Number(weights_arr[i].weight);
            if (rand <= 0) {
                return weights_arr[i];
            }
        }
    }
}

//table.json

{
    "vsion": 1,
    "level_weight": [
        {
            "level": 1,
            "weight": 80
        },
        {
            "level": 2,
            "weight": 19
        },
        {
            "level": 3,
            "weight": 1
        }
    ],
    "things": [
        {
            "id": 1001,
            "weight": 20
        },
        {
            "id": 1002,
            "weight": 20
        },
        {
            "id": 1003,
            "weight": 20
        },
        {
            "id": 1004,
            "weight": 20
        },
        {
            "id": 1005,
            "weight": 20
        },
        {
            "id": 2001,
            "weight": 20
        },
        {
            "id": 2002,
            "weight": 20
        },
        {
            "id": 2003,
            "weight": 20
        },
        {
            "id": 3001,
            "weight": 20
        },
        {
            "id": 3002,
            "weight": 20
        }
    ]
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烧仙草奶茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值