unity随机生成怪物(抽奖)代码

本文介绍了一种基于C#的十连抽代码实现方法,利用SortedDictionary存储怪物名称及其出现概率,通过计算概率区间和随机数对比,实现了类似游戏十连抽的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我在网上发现居然找不到,都是转盘滚轮什么的抽奖,没有这种随机生成类似十连抽性质的代码

使用方法

SortedDictionary<string, int> monsterProb = new SortedDictionary<string, int>
        {
            {"king", 5 },
            {"archer",15 },
            {"mage",10 },
            {"warrior",20 },
            {"base",50 },
        };
//返回怪物名字
string mosterName = Lottery.GetLottery(monsterProb);
//通过怪物名字获取资源,characterFactory.LoadPlayer这是我自己写的
monster=characterFactory.LoadPlayer(mosterName);
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

public class Lottery
{
    //奖品总数
    private static int prizeNum;
    //键数组
    private static List<string> keyList = new List<string>();
    //奖品概率区间的最大值
    private static List<int> betweenMax = new List<int>();
    /// <summary>
    /// 依照概率随机返回一个字符串
    /// 使用SortedDictionary是因为后面两个List需要对应上,通过SortedDictionary给List赋值时要有顺序
    /// 总体思路
    /// 遍历SortedDictionary的值,算出奖品总数(也就是概率的分母)
    /// 累加时顺便记录每次相加的值(也就是边界值)
    /// 随机产生一个范围在零到奖品总数的数,和边界值比较,边界值对应上要输出的值
    /// </summary>
    /// <param name="sortedDictionary">存储了名字和概率的SortedDictionary</param>
    /// <returns></returns>
    public static string GetLottery(SortedDictionary<string, int> sortedDictionary)
    {
        //由于设置了静态,所以每次执行都需要清零
        prizeNum = 0;
        keyList.Clear();
        betweenMax.Clear();
        //加0是为了后面好对范围进行判断,像五个范围有六个点这种意思
        betweenMax.Add(0);
        //存储键值键值,方便返回抽中的名字
        keyList = sortedDictionary.Keys.ToList();
        //插入任意值都行,主要为了使keyList和num能够对应,通过相同下标可以调用对应值
        keyList.Insert(0, "0");
        foreach (int value in sortedDictionary.Values)
        {
            //计算奖品总数
            prizeNum += value;
            //存储奖品概率区间的最大值,方便比较
            betweenMax.Add(prizeNum);
        }
        //C#中的随机数
        //Random rnd = new Random(Guid.NewGuid().GetHashCode());
        //int i = rnd.Next(0, max);
        int i = Random.Range(0, prizeNum);
        for (int j = 0; j < sortedDictionary.Count; j++)
        {
            //判断是否在范围内,要看产生的数包不包括上限,包括的话上限减一,值为上限时返回空,并且概率也不准了
            if (betweenMax[j] <= i && i < betweenMax[j + 1])
            {
                //由于keyList和num是对应的,通过下标可以直接返回对应字符串
                return keyList[j + 1];
            }
        }
        return "";
    }
}

总觉得还有什么更好的方法,但我一时半会又想不出,就结果来看还行.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值