热血传奇黑铁矿武器升级概率模拟:Java简易算法与纯度次数实现

来源: 作者: 点击:
盛大热血传奇武器升级里,黑铁矿本身不直接决定成功概率,官方判定里黑铁矿只影响升级后武器持久变化,系统只取纯度最高的前6块(部分端取5块)参与持久结算,多余黑矿忽略;真正决定成功率的是基础概率 + 首饰属性公式 + 武器已升级次数衰减 + 幸运值,黑铁矿纯度总和只作为“附加微调”和“持久区间”参与模拟 。下面给一套能直接跑的 Java 简单小算法,把黑铁矿纯度、升级次数、首饰分、幸运值全部揉进去。

一、核心判定规则(按官服老机制抽象)
1. 基础成功率:10%(不放首饰也按 10% 起算)
2. 首饰贡献:取属性(攻/魔/道上下限之和)最高的两件
公式:rate += (firstJewelrySum / 5 + secondJewelrySum / 3) * 7% (小数截断)
3. 武器已升级次数衰减:每多升 1 手,基础概率扣减,常见模拟值 升级次数 × 4%~6%
4. 幸运值:武器幸运点 × 1%,角色隐藏运气波动另算
5. 黑铁矿纯度总和微调:总纯度 ≥120 给 +3%,60~119 给 +1%,<30 给 -2%(仅模拟玩家经验,官服严格说不影响成功率,只影响持久)
6. 成功率上限封顶 90%,下限保底 9%,绝不 100%
7. 持久结算区间(黑铁矿总纯度):
<30 → 掉 3 持久
30~60 → 80% 掉 1、20% 掉 3
60~90 → 80% 不掉、20% 掉 1
90~120 → 80% 升 1、20% 不变
≥120 → 升 1~3 持久

二、Java 简单实现(单类可跑)
import java.util.Random;

public class LegendWeaponUpgrade {

// 黑铁矿数组:每块纯度
// jewelrySums:每件首饰的 攻/魔/道 上下限之和
// level:当前已升级次数(0 表示第一次升)
// luck:武器幸运值
public static double calcRate(int[] ores, int[] jewelrySums, int level, int luck) {
// 1. 黑铁矿总纯度(只取最高6块)
int totalPurity = topNSum(ores, 6);

// 2. 首饰取前两高
int[] top2 = topN(jewelrySums, 2);
int first = top2[0];
int second = top2[1];

// 3. 基础 + 首饰公式(小数截断用整数除法)
double rate = 10.0;
rate += ((first / 5 + second / 3) * 7.0);
rate += luck * 1.0;

// 4. 升级次数衰减
rate -= level * 5.0;

// 5. 黑铁矿纯度模拟微调
if (totalPurity >= 120) rate += 3.0;
else if (totalPurity >= 60) rate += 1.0;
else if (totalPurity < 30) rate -= 2.0;

// 6. 上下限封顶
if (rate > 90.0) rate = 90.0;
if (rate < 9.0) rate = 9.0;
return rate;
}

// 取数组最高 n 个求和
private static int topNSum(int[] arr, int n) {
int[] copy = arr.clone();
java.util.Arrays.sort(copy);
int sum = 0, cnt = 0;
for (int i = copy.length - 1; i >= 0 && cnt < n; i--, cnt++) sum += copy[i];
return sum;
}

// 取最高 n 个值返回
private static int[] topN(int[] arr, int n) {
int[] copy = arr.clone();
java.util.Arrays.sort(copy);
int[] res = new int[n];
for (int i = 0; i < n; i++) {
int idx = copy.length - 1 - i;
res[i] = idx >= 0 ? copy[idx] : 0;
}
return res;
}

// 持久变化模拟
public static int calcDurabilityDelta(int[] ores, Random rnd) {
int purity = topNSum(ores, 6);
if (purity < 30) return -3;
if (purity < 60) return rnd.nextDouble() < 0.8 ? -1 : -3;
if (purity < 90) return rnd.nextDouble() < 0.8 ? 0 : -1;
if (purity < 120) return rnd.nextDouble() < 0.8 ? 1 : 0;
return rnd.nextInt(3) + 1; // 1~3
}

// 单次升级判定
public static boolean rollUpgrade(double rate, Random rnd) {
return rnd.nextDouble() * 100 < rate;
}

public static void main(String[] args) {
Random rnd = new Random();

// 3 块黑铁矿纯度
int[] ores = {18, 22, 25};
// 首饰攻魔道上下限之和:圣战戒指(2-7=9)、绿色项链(1-6=7)
int[] jewels = {9, 7, 4};
int level = 2; // 第3手
int luck = 3; // 幸运+3

double rate = calcRate(ores, jewels, level, luck);
boolean success = rollUpgrade(rate, rnd);
int dura = calcDurabilityDelta(ores, rnd);

System.out.println("总纯度=" + topNSum(ores, 6));
System.out.println("模拟成功率=" + rate + "%");
System.out.println("升级结果=" + (success ? "成功" : "破碎"));
System.out.println("持久变化=" + dura);
}
}


三、算法关键点说明
• first / 5 + second / 3 用 Java 整数除法天然截断小数,贴合官服“舍去余数”逻辑

• topNSum(ores,6) 还原“只取最高6块黑矿”规则,放 10 块垃圾矿也没用

• level * 5.0 是简化衰减,想更狠改成 level * 7 或按官服 7 手封顶逻辑做阶梯扣减

• 黑铁矿对成功率严格说为 0,上面 +1/+3 是玩家体感模拟,正式还原官服请把那段删掉即可

- 封顶 90% 与保底 9% 必须留,传奇没有 100% 成刀

四、批量模拟统计(顺手加个循环看期望)
int win = 0, total = 100000;
for (int i = 0; i < total; i++) {
if (rollUpgrade(calcRate(ores, jewels, level, luck), rnd)) win++;
}
System.out.println("十万次模拟实际成功率=" + (win * 100.0 / total) + "%");

跑出来会贴近 calcRate 计算值,证明随机判定没偏。黑铁矿纯度只改持久返回值,不改 rate,和官服机制一致 。