全站通知:
Widget:装备
刷
历
编
跳到导航
跳到搜索
<!DOCTYPE html> <html lang="zh-CN"> <head>
<meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>单件装备练度计算器</title> <style> body { font-family: 'Microsoft YaHei', sans-serif; max-width: 600px; margin: 0 auto; padding: 20px; background-color: #f5f5f5; } h1 { color: #333; text-align: center; margin-bottom: 30px; } .calculator { background-color: #fff; padding: 20px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); } .section { margin-bottom: 20px; padding: 15px; background-color: #f9f9f9; border-radius: 5px; } .section-title { font-weight: bold; margin-bottom: 10px; color: #444; font-size: 1.1em; } .attr-row { display: flex; margin-bottom: 10px; align-items: center; } .attr-name { width: 150px; font-weight: bold; } .attr-value { flex: 1; } input[type="number"], input[type="text"], select { width: 100%; padding: 8px; border: 1px solid #ddd; border-radius: 4px; box-sizing: border-box; } button { background-color: #4285f4; color: white; border: none; padding: 12px 15px; border-radius: 4px; cursor: pointer; font-size: 1em; width: 100%; margin-top: 15px; transition: background-color 0.3s; } button:hover { background-color: #3367d6; } .result { background-color: #e8f5e9; padding: 15px; border-radius: 5px; margin-top: 20px; display: none; } .quality-极品 { color: #d500f9; font-weight: bold; font-size: 1.2em; } .quality-优 { color: #00c853; font-weight: bold; font-size: 1.2em; } .quality-良 { color: #0091ea; font-size: 1.1em; } .quality-合格 { color: #ff6d00; } .quality-不合格 { color: #d50000; } .score-bar { height: 20px; background-color: #e0e0e0; border-radius: 10px; margin: 10px 0; overflow: hidden; } .score-progress { height: 100%; background: linear-gradient(90deg, #d50000, #ff6d00, #0091ea, #00c853); } .criteria { margin-top: 20px; font-size: 0.9em; color: #666; } .criteria h3 { margin-bottom: 5px; color: #444; } .criteria ul { margin-top: 5px; padding-left: 20px; } .special-only { display: none; } .show-special { display: block; } .detail-row { margin-bottom: 5px; } .detail-name { font-weight: bold; display: inline-block; width: 100px; } .detail-value { display: inline-block; } .attack-attr { color: #0d47a1; } .defense-attr { color: #bf360c; } .error { color: #d32f2f; font-size: 0.9em; margin-top: 5px; } .attr-selector { margin-bottom: 10px; } .attr-input { display: none; } .show-input { display: block; } .percent-attr { color: #6a1b9a; font-weight: bold; } .locked { opacity: 0.6; pointer-events: none; } .enhance-control { display: flex; align-items: center; } .enhance-value { margin-left: 10px; font-weight: bold; } </style>
</head> <body>
单件装备练度计算器
装备基本信息
装备名称:
<input type="text" id="equip-name" placeholder="输入装备名称">
装备类型:
<select id="equip-type" onchange="toggleSpecialSection()"> <option value="normal">普通装备</option> <option value="special">特殊装备</option> </select>
属性选择(共4个词条)
百分比词条强化设置
<button onclick="calculate()">计算练度</button>
装备评分结果
装备名称:
装备类型:
攻击练度:
防御练度:
综合评分:
品质评级:
攻击词条数:
详细评分:
评级标准:
- 极品: 任一攻击词条≥0.9且攻击词条≥2个
- 优: 任一攻击词条≥0.9
- 良: 攻击练度≥0.7或攻击词条≥3个
- 合格: 攻击练度≥0.6
- 不合格: 攻击练度<0.6
攻击词条包括: 全攻、主属性攻击、暴击、属性攻击百分比、暴击率百分比
<script> // 装备属性配置 const attrConfig = { '全攻': { max: 1800, type: 'base', category: 'attack', input: true }, '主属性攻击': { max: 2200, type: 'base', category: 'attack', input: true }, '主属性抗性': { max: 8000, type: 'base', category: 'defense', input: true }, '全抗': { max: 1800, type: 'base', category: 'defense', input: true }, '暴击': { max: 8000, type: 'base', category: 'attack', input: true }, '属性攻击百分比': { max: 1, type: 'special', category: 'attack', input: false }, '属性伤害百分比': { max: 1, type: 'special', category: 'attack', input: false }, '属性抗性百分比': { max: 1, type: 'special', category: 'defense', input: false }, '暴击率百分比': { max: 1, type: 'special', category: 'attack', input: false } };
// 攻击词条列表 const attackAttrs = ['全攻', '主属性攻击', '暴击', '属性攻击百分比', '暴击率百分比'];
// 百分比词条列表 const percentAttrs = ['属性攻击百分比', '属性伤害百分比', '属性抗性百分比', '暴击率百分比'];
// 全局状态 let selectedAttrs = []; let isSpecial = false; let critCount = 0; let totalEnhance = 0;
// 初始化属性选择器 function initAttrSelectors() { const container = document.getElementById('attrs-container'); container.innerHTML = ; // 创建4个属性选择器 for (let i = 0; i < 4; i++) { const selector = document.createElement('div'); selector.className = 'attr-selector'; // 普通装备可选所有基础属性 // 特殊装备可选所有基础属性(除暴击)和特殊属性 const options = Object.entries(attrConfig) .filter(([name, config]) => !isSpecial || (config.type === 'base' && name !== '暴击') || config.type === 'special' ) .map(([name]) => `<option value="${name}">${name}</option>`) .join(); selector.innerHTML = ` <select class="attr-select" onchange="updateAttrSelect(${i}, this.value)"> <option value="">选择第${i+1}个词条</option> ${options} </select> `; container.appendChild(selector); } }
// 初始化属性输入框 function initAttrInputs() { const container = document.getElementById('attr-inputs-container'); container.innerHTML = ; // 为所有需要输入的属性创建输入框(初始隐藏) for (const [name, config] of Object.entries(attrConfig)) { if (config.input) { const inputDiv = document.createElement('div'); inputDiv.className = 'attr-input'; inputDiv.id = `input-${name}`; inputDiv.innerHTML = `
${name}:
<input type="number" min="0" max="${config.max}" step="1" id="value-${name}" class="attr-value-input">
`; container.appendChild(inputDiv); } } }
// 初始化百分比词条强化设置 function initPercentEnhanceControls() { const container = document.getElementById('percent-enhance-container'); container.innerHTML = ; for (const attrName of percentAttrs) { const control = document.createElement('div'); control.className = 'attr-row'; control.id = `enhance-${attrName}`; control.innerHTML = `
${attrName}:
<input type="number" min="0" max="5" value="0"
class="enhance-input" data-attr="${attrName}"
onchange="updateEnhanceTotal('${attrName}')">
= 0.0
`; container.appendChild(control); } }
// 更新属性选择 function updateAttrSelect(index, attrName) { const errorMsg = document.getElementById('error-message'); errorMsg.textContent = ; // 检查是否已选择过该属性 if (attrName && selectedAttrs.includes(attrName)) { errorMsg.textContent = '不能选择重复的属性!'; document.querySelectorAll('.attr-select')[index].value = ; return; } // 如果是暴击词条,检查数量 if (attrName === '暴击') { if (critCount >= 2) { errorMsg.textContent = '暴击词条总数不能超过2个!'; document.querySelectorAll('.attr-select')[index].value = ; return; } critCount++; } // 更新已选属性列表 if (selectedAttrs[index]) { // 移除之前选择的属性 const prevAttr = selectedAttrs[index]; if (attrConfig[prevAttr].input) { document.getElementById(`input-${prevAttr}`).classList.remove('show-input'); } // 如果是暴击词条,减少计数 if (prevAttr === '暴击') { critCount--; } } if (attrName) { // 添加新选择的属性 selectedAttrs[index] = attrName; if (attrConfig[attrName].input) { document.getElementById(`input-${attrName}`).classList.add('show-input'); } } else { // 清空选择 selectedAttrs[index] = null; } }
// 更新强化总数 function updateEnhanceTotal(attrName) { const input = document.querySelector(`.enhance-input[data-attr="${attrName}"]`); const valueDisplay = input.parentElement.querySelector('.enhance-value'); const enhanceTimes = parseInt(input.value) || 0; // 更新显示值 valueDisplay.textContent = `= ${(enhanceTimes * 0.2).toFixed(1)}`; // 计算新的强化总数 let newTotal = 0; document.querySelectorAll('.enhance-input').forEach(input => { newTotal += parseInt(input.value) || 0; }); // 更新全局状态 totalEnhance = newTotal; // 如果总数达到5,锁定其他强化输入 if (totalEnhance >= 5) { document.querySelectorAll('.enhance-input').forEach(otherInput => { if (otherInput !== input && otherInput.value === '0') { otherInput.disabled = true; otherInput.parentElement.parentElement.classList.add('locked'); } }); } else { // 解锁所有强化输入 document.querySelectorAll('.enhance-input').forEach(otherInput => { otherInput.disabled = false; otherInput.parentElement.parentElement.classList.remove('locked'); }); } }
// 切换特殊装备部分显示 function toggleSpecialSection() { isSpecial = document.getElementById('equip-type').value === 'special'; document.getElementById('special-section').classList.toggle('show-special', isSpecial); // 重新初始化属性选择器 selectedAttrs = []; critCount = 0; totalEnhance = 0; initAttrSelectors(); initAttrInputs(); if (isSpecial) { initPercentEnhanceControls(); } }
// 获取装备品质评级 function getQualityRating(scoreDetails, attackAttrCount) { // 检查是否有任一攻击词条≥0.9 const hasHighValueAttr = scoreDetails.some(detail => detail.category === 'attack' && detail.normalized >= 0.9 ); // 计算攻击练度总和 const attackScoreSum = scoreDetails.reduce((sum, detail) => sum + (detail.category === 'attack' ? detail.normalized : 0), 0); // 新评级标准 if (hasHighValueAttr && attackAttrCount >= 2) { return { rating: '极品', class: 'quality-极品' }; } else if (hasHighValueAttr) { return { rating: '优', class: 'quality-优' }; } else if (attackScoreSum >= 0.7 || attackAttrCount >= 3) { return { rating: '良', class: 'quality-良' }; } else if (attackScoreSum >= 0.6) { return { rating: '合格', class: 'quality-合格' }; } else { return { rating: '不合格', class: 'quality-不合格' }; } }
// 计算练度
function calculate() {
const errorMsg = document.getElementById('error-message');
errorMsg.textContent = ;
// 检查是否选择了4个词条
if (selectedAttrs.filter(Boolean).length < 4) {
errorMsg.textContent = '请选择4个词条!';
return;
}
// 如果是特殊装备,检查强化总数
if (isSpecial && totalEnhance > 5) {
errorMsg.textContent = '强化总数不能超过5!';
return;
}
// 收集装备基本信息
const equipName = document.getElementById('equip-name').value || '未命名装备';
const equipType = isSpecial ? '特殊装备' : '普通装备';
// 收集属性值
let scoreDetails = [];
let attackScore = 0;
let defenseScore = 0;
let attackAttrCount = 0;
for (const attrName of selectedAttrs) {
if (!attrName) continue;
const config = attrConfig[attrName];
let value, normalizedValue;
if (config.input) {
// 需要输入数值的属性
value = parseFloat(document.getElementById(`value-${attrName}`).value) || 0;
normalizedValue = value / config.max;
} else {
// 百分比属性,根据强化次数计算
const enhanceInput = document.querySelector(`.enhance-input[data-attr="${attrName}"]`);
const enhanceTimes = enhanceInput ? parseInt(enhanceInput.value) || 0 : 0;
value = enhanceTimes * 0.2;
normalizedValue = value; // 百分比属性max=1,所以value=normalizedValue
}
if (config.category === 'attack') {
attackScore += normalizedValue;
if (attackAttrs.includes(attrName)) {
attackAttrCount++;
}
} else {
defenseScore += normalizedValue;
}
scoreDetails.push({
name: attrName,
value: value,
normalized: normalizedValue,
category: config.category,
isPercent: !config.input
});
}
// 计算综合评分
const totalScore = scoreDetails.length > 0 ? (attackScore + defenseScore) / scoreDetails.length : 0;
// 获取品质评级
const quality = getQualityRating(scoreDetails, attackAttrCount);
// 显示结果
document.getElementById('result').style.display = 'block';
document.getElementById('result-name').textContent = equipName;
document.getElementById('result-type').textContent = equipType;
document.getElementById('result-attack-score').textContent = attackScore.toFixed(4);
document.getElementById('result-defense-score').textContent = defenseScore.toFixed(4);
document.getElementById('result-score').textContent = totalScore.toFixed(4);
document.getElementById('score-progress').style.width = `${totalScore * 100}%`;
document.getElementById('result-quality').innerHTML =
`${quality.rating}`;
document.getElementById('result-attack-count').textContent = attackAttrCount;
// 显示详细评分
const detailsHtml = scoreDetails.map(detail => `
${detail.name}:
${detail.isPercent ? `${detail.value.toFixed(1)} (强化${detail.value/0.2}次)` : detail.value.toFixed(0)} → ${detail.normalized.toFixed(4)}
`).join(); document.getElementById('result-details').innerHTML = detailsHtml; }
// 初始化页面 window.onload = function() { initAttrSelectors(); initAttrInputs(); }; </script>
</body> </html>