Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【建议】建议将“如每日做满65点经验”改为“如按当前进度” #583

Closed
helianchichi opened this issue Jul 24, 2023 · 22 comments
Labels
enhancement New feature or request

Comments

@helianchichi
Copy link

正在升级的一般硬币都是每天获取一个,无法做满65点经验,所以按65经验算出的时间参考意义不大,建议把这个日志输出放下面,获取今日共得多少经验,计算按当前进度还剩多少天升六级

@RayWangQvQ RayWangQvQ added the enhancement New feature or request label Jul 26, 2023
@Polaris-cn10086
Copy link
Contributor

好主意

@Polaris-cn10086
Copy link
Contributor

试着写了一下,发现一个问题:执行每日任务时,有些任务是被自己做过的(例如投币,看视频),这样的话就不能在程序中统计出真正的一日获取经验的总数量,会导致计算出的时间出现偏差(虽然可能差不了几天)

我觉得可以根据硬币的数量,比如只能投一个硬币的时候,升级的时间根据每天25点经验计算

除了每天能获取2~4枚硬币的少数用户外,应该是能准确的

@Polaris-cn10086
Copy link
Contributor

试着写了一下,发现一个问题:执行每日任务时,有些任务是被自己做过的(例如投币,看视频),这样的话就不能在程序中统计出真正的一日获取经验的总数量,会导致计算出的时间出现偏差(虽然可能差不了几天)

我觉得可以根据硬币的数量,比如只能投一个硬币的时候,升级的时间根据每天25点经验计算

除了每天能获取2~4枚硬币的少数用户外,应该是能准确的

w(゚Д゚)w 刚发现可以获取到已投币的数量,那就基本上没有问题来计算每日实际获得的经验值了,但是我认为在硬币数量不足时,通过每日25点经验计算时长还是比较合理的,毕竟根据阿B硬币获取的规则,普通用户获取每日超过一枚硬币的可能性并不大。

@Polaris-cn10086
Copy link
Contributor

#585 (comment)

@Initial-heart-1
Copy link
Contributor

试着写了一下,发现一个问题:执行每日任务时,有些任务是被自己做过的(例如投币,看视频),这样的话就不能在程序中统计出真正的一日获取经验的总数量,会导致计算出的时间出现偏差(虽然可能差不了几天)
我觉得可以根据硬币的数量,比如只能投一个硬币的时候,升级的时间根据每天25点经验计算
除了每天能获取2~4枚硬币的少数用户外,应该是能准确的

w(゚Д゚)w 刚发现可以获取到已投币的数量,那就基本上没有问题来计算每日实际获得的经验值了,但是我认为在硬币数量不足时,通过每日25点经验计算时长还是比较合理的,毕竟根据阿B硬币获取的规则,普通用户获取每日超过一枚硬币的可能性并不大。

不理解为何会出现偏差,自己完成了本来可以由程序完成的任务的话经验值也累加在账户上,直接根据配置测算理论值就行吧,只需要去再判断一下硬币数量是否可以完成当天任务。也就是无论程序实际是否成功完成了配置的任务都按成功完成计算即可。
但是写都写了这样也没啥问题就是了(
其实前段时间我也是想做这样一个计算器来着=-=

@Polaris-cn10086
Copy link
Contributor

是这样的,主要是当时我想的是在每个任务完成后来累和当日的经验值,这样计算的话就会和实际获取的经验值有偏差

最后我写的时候想到,就是正常情况下每天获得的硬币应该只有1个 。所以,我是按照25点来算了。(主要是好改) ( ̄ε(# ̄)

@Polaris-cn10086
Copy link
Contributor

是这样的,主要是当时我想的是在每个任务完成后来累和当日的经验值,这样计算的话就会和实际获取的经验值有偏差

最后我写的时候想到,就是正常情况下每天获得的硬币应该只有1个 。所以,我是按照25点来算了。(主要是好改) ( ̄ε(# ̄)

开银瓜子换硬币可能每天要多一点?如果是这样的话可以改成35?

@Initial-heart-1
Copy link
Contributor

是这样的,主要是当时我想的是在每个任务完成后来累和当日的经验值,这样计算的话就会和实际获取的经验值有偏差

最后我写的时候想到,就是正常情况下每天获得的硬币应该只有1个 。所以,我是按照25点来算了。(主要是好改) ( ̄ε(# ̄)

这玩意儿虽然就是加减乘除,但是越加限制条件越写越乱,本来准备写个网页计算器的,写着写着就摆烂了( ̄﹏ ̄;)
我再找人讨论下吧,感觉我是钻牛角尖了

@Initial-heart-1
Copy link
Contributor

是这样的,主要是当时我想的是在每个任务完成后来累和当日的经验值,这样计算的话就会和实际获取的经验值有偏差
最后我写的时候想到,就是正常情况下每天获得的硬币应该只有1个 。所以,我是按照25点来算了。(主要是好改) ( ̄ε(# ̄)

开银瓜子换硬币可能每天要多一点?如果是这样的话可以改成35?

别急,大多数用户银瓜子不够每天去换的,先忽略除了登录外的获得好了

@Polaris-cn10086
Copy link
Contributor

是这样的,主要是当时我想的是在每个任务完成后来累和当日的经验值,这样计算的话就会和实际获取的经验值有偏差
最后我写的时候想到,就是正常情况下每天获得的硬币应该只有1个 。所以,我是按照25点来算了。(主要是好改) ( ̄ε(# ̄)

这玩意儿虽然就是加减乘除,但是越加限制条件越写越乱,本来准备写个网页计算器的,写着写着就摆烂了( ̄﹏ ̄;) 我再找人讨论下吧,感觉我是钻牛角尖了

确实,当时改的时候我就被自己绕进去了,各种逻辑越写越复杂,主要还是每天获取的硬币除了登录送的那个以外来源不确定,我索性就按最小值来算了。

@Initial-heart-1
Copy link
Contributor

Initial-heart-1 commented Aug 9, 2023 via email

@Polaris-cn10086
Copy link
Contributor

哈哈哈,不如给个设置,让用户自己输入预计日期用的每日经验量,然后通过这个输入量来算升级时间。没有个性化要求的就用默认值来算

@Initial-heart-1
Copy link
Contributor

Initial-heart-1 commented Aug 9, 2023 via email

@Polaris-cn10086
Copy link
Contributor

就是让有需求的自己算,没这个需求的就用默认值。做为一个可选项,而不是一个必须项。

艹,突然不想改了,感觉好麻烦 (╬▔皿▔)╯

@Initial-heart-1
Copy link
Contributor

终于还是折腾明白了,感谢 @XiaoYue-Kun 的一些帮助
整段所需经验x=(升级需要的经验-当前已有的经验)
前段每天获得经验n=15+配置的投币数*10
前段所需天数d=(可投的硬币/配置的投币数-1)
前段所需经验y=nd
计算方式:d+(x-y)/25
上面式子适用于可投数>=0且(x/n)>d且配投数不小于2
(x/n)=d→输出d或x/n
(x/n)<d→输出x/n
配投数=1时直接按每天25计算,即x/25
如果可投的币<0,按每天25计算并给天数加上 保护惩罚天数z= 保护币数-|可投币数|,即 x/25+z
如果配置不投币则按15计算即可,即x/15
不计算风纪委 银瓜子等硬币来源
大概是没问题,大晚上的看这玩意儿有点不太清醒,回头再检查

@Polaris-cn10086
Copy link
Contributor

public int CalculateUpgradeTime(UserInfo useInfo)
        {
              // TODO 修改计算逻辑

              double availableCoins = decimal.ToDouble(useInfo.Money ?? 0) - _dailyTaskOptions.NumberOfProtectedCoins;


                long needExp = useInfo.Level_info.GetNext_expLong() -
                               useInfo.Level_info.Current_exp;

                int needDay = 0;

                if (availableCoins < 0)
                {
                    needDay = (int)((double)needExp / 25 + _dailyTaskOptions.NumberOfProtectedCoins - Math.Abs(availableCoins));
                }

                switch (_dailyTaskOptions.NumberOfCoins)
                {
                    case 0:
                        needDay = (int)(needExp / 15);
                        break;
                    case 1:
                        needDay = (int)(needExp / 25);
                        break;
                    default:
                        double needFrontDay = (availableCoins / _dailyTaskOptions.NumberOfCoins) - 1;
                        double temp = (double)needExp / (15
                            + _dailyTaskOptions.NumberOfCoins * 10);

                        if (temp > needFrontDay )
                        {
                            needDay = (int)(needFrontDay + (needExp - (15
                                    + _dailyTaskOptions.NumberOfCoins * 10) *
                                needFrontDay) / 25);
                        }
                        else
                        {
                            needDay= (int)(needExp / temp);
                        }
                        break;

                }

                return needDay;
        }

@Polaris-cn10086
Copy link
Contributor

写了一下,我目前看来应该没问题。可能结果要减一?跟我手算好像有一天的差距。

不清楚,等我清醒一下再看一下,但算法的实现应该没多大问题吧? *(  ̄皿 ̄)/#_

@Polaris-cn10086
Copy link
Contributor

艹,我傻了,刚才从头算了一遍

前段所需天数d=(可投的硬币/配置的投币数-1)

应该是:前段所需天数d=可投的硬币/(配置的投币数-1)

 public int CalculateUpgradeTime(UserInfo useInfo)
        {
            double availableCoins = decimal.ToDouble(useInfo.Money ?? 0) - _dailyTaskOptions.NumberOfProtectedCoins;
            long needExp = useInfo.Level_info.GetNext_expLong() - useInfo.Level_info.Current_exp;
            int needDay;

            if (availableCoins < 0)
                needDay = (int)((double)needExp / 25 + _dailyTaskOptions.NumberOfProtectedCoins - Math.Abs(availableCoins));

            switch (_dailyTaskOptions.NumberOfCoins)
            {
                case 0:
                    needDay = (int)(needExp / 15);
                    break;
                case 1:
                    needDay = (int)(needExp / 25);
                    break;
                default:
                    int dailyExpAvailable = 15 + _dailyTaskOptions.NumberOfCoins * 10;
                    double needFrontDay = availableCoins / (_dailyTaskOptions.NumberOfCoins - 1);

                    if ((double)needExp / dailyExpAvailable > needFrontDay)
                        needDay = (int)(needFrontDay + (needExp - dailyExpAvailable * needFrontDay) / 25);
                    else
                        needDay= (int)(needExp / dailyExpAvailable );
                    break;
            }

            return needDay;
        }

@Polaris-cn10086
Copy link
Contributor

https://github.com/Polaris-cn10086/BiliBiliToolPro
我把代码推到我fork的库里了,还加了个单元测试。 @Initial-heart-1 有时间的话可以看一下 ヾ(≧▽≦*)o

睡了😪

@Initial-heart-1
Copy link
Contributor

https://github.com/Polaris-cn10086/BiliBiliToolPro 我把代码推到我fork的库里了,还加了个单元测试。 @Initial-heart-1 有时间的话可以看一下 ヾ(≧▽≦*)o

睡了😪

您的作息......挺牛的
我大晚上整理的,我觉着有哪里不对劲但是看不出来哪里不对,因为大晚上的挺迷糊的,所以说回头检查
按道理是没问题的,码看着 OK
@RayWangQvQ

@Polaris-cn10086
Copy link
Contributor

Polaris-cn10086 commented Aug 10, 2023

我先开个PR吧,有问题到时候再改 (^∀^●)ノシ
#590

@Initial-heart-1
Copy link
Contributor

@RayWangQvQ 应该可以 close
@helianchichi 更改已合入 develop,注意版本更新

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

4 participants