164 lines
4.5 KiB
Go
164 lines
4.5 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
)
|
|
|
|
// 定义属性枚举
|
|
type ElementType int
|
|
|
|
const (
|
|
FIRE ElementType = iota + 1 // 火系
|
|
GRASS // 草系
|
|
WATER // 水系
|
|
ICE // 冰系
|
|
FIGHTING // 战斗系
|
|
PSYCHIC // 超能系
|
|
)
|
|
|
|
// 定义属性组合
|
|
type ElementCombination struct {
|
|
primary ElementType
|
|
secondary *ElementType
|
|
}
|
|
|
|
// 创建新的属性组合
|
|
func NewElementCombination(primary ElementType, secondary *ElementType) (ElementCombination, error) {
|
|
if secondary != nil {
|
|
if primary > *secondary {
|
|
primary, *secondary = *secondary, primary
|
|
}
|
|
if primary == *secondary {
|
|
return ElementCombination{}, fmt.Errorf("双属性不能重复")
|
|
}
|
|
}
|
|
return ElementCombination{
|
|
primary: primary,
|
|
secondary: secondary,
|
|
}, nil
|
|
}
|
|
|
|
// 判断是否为双属性
|
|
func (ec ElementCombination) IsDual() bool {
|
|
return ec.secondary != nil
|
|
}
|
|
|
|
// 获取属性列表
|
|
func (ec ElementCombination) Elements() []ElementType {
|
|
if ec.IsDual() {
|
|
return []ElementType{ec.primary, *ec.secondary}
|
|
}
|
|
return []ElementType{ec.primary}
|
|
}
|
|
|
|
// 属性计算器
|
|
type ElementCalculator struct{}
|
|
|
|
// 单属性克制关系矩阵
|
|
var singleMatrix = map[ElementType]map[ElementType]float64{
|
|
FIRE: {
|
|
PSYCHIC: 0.5,
|
|
ICE: 2.0,
|
|
},
|
|
GRASS: {
|
|
ICE: 1.0,
|
|
PSYCHIC: 1.0,
|
|
GRASS: 0.5,
|
|
WATER: 2.0,
|
|
},
|
|
FIGHTING: {
|
|
ICE: 2.0,
|
|
PSYCHIC: 0.5,
|
|
FIGHTING: 0.5,
|
|
},
|
|
WATER: {
|
|
ICE: 2.0,
|
|
PSYCHIC: 0.5,
|
|
FIGHTING: 0.5,
|
|
},
|
|
}
|
|
|
|
// 获取单属性克制系数
|
|
func (ec ElementCalculator) getSingleEffectiveness(attacker ElementType, defender ElementType) float64 {
|
|
if attackerMatrix, exists := singleMatrix[attacker]; exists {
|
|
if value, ok := attackerMatrix[defender]; ok {
|
|
return value
|
|
}
|
|
}
|
|
return 1.0
|
|
}
|
|
|
|
// 计算克制系数
|
|
func (ec ElementCalculator) CalculateEffectiveness(attacker, defender ElementCombination) float64 {
|
|
if !attacker.IsDual() {
|
|
return ec.handleSingleAttacker(attacker.primary, defender)
|
|
}
|
|
return ec.handleDualAttacker(attacker, defender)
|
|
}
|
|
|
|
// 处理单属性攻击
|
|
func (ec ElementCalculator) handleSingleAttacker(attacker ElementType, defender ElementCombination) float64 {
|
|
if !defender.IsDual() {
|
|
return ec.getSingleEffectiveness(attacker, defender.primary)
|
|
}
|
|
m1 := ec.getSingleEffectiveness(attacker, defender.primary)
|
|
m2 := ec.getSingleEffectiveness(attacker, *defender.secondary)
|
|
return (m1 + m2) / 2.0
|
|
}
|
|
|
|
// 处理双属性攻击
|
|
func (ec ElementCalculator) handleDualAttacker(attacker, defender ElementCombination) float64 {
|
|
aElements := attacker.Elements()
|
|
a1, a2 := aElements[0], aElements[1]
|
|
|
|
if !defender.IsDual() {
|
|
m1 := ec.getSingleEffectiveness(a1, defender.primary)
|
|
m2 := ec.getSingleEffectiveness(a2, defender.primary)
|
|
return (m1 + m2) / 2.0
|
|
}
|
|
|
|
dElements := defender.Elements()
|
|
d1, d2 := dElements[0], dElements[1]
|
|
|
|
m11 := ec.getSingleEffectiveness(a1, d1)
|
|
m12 := ec.getSingleEffectiveness(a1, d2)
|
|
m21 := ec.getSingleEffectiveness(a2, d1)
|
|
m22 := ec.getSingleEffectiveness(a2, d2)
|
|
|
|
return (m11 + m12 + m21 + m22) / 4.0
|
|
}
|
|
|
|
func main() {
|
|
calculator := ElementCalculator{}
|
|
|
|
// 测试用例1
|
|
attacker1, _ := NewElementCombination(FIGHTING, nil)
|
|
defender1, _ := NewElementCombination(ICE, nil)
|
|
result1 := calculator.CalculateEffectiveness(attacker1, defender1)
|
|
fmt.Printf("战斗->冰:%v → %v → 倍数:%.1f\n", attacker1, defender1, result1)
|
|
|
|
// 测试用例2
|
|
attacker2, _ := NewElementCombination(GRASS, &FIGHTING)
|
|
defender2, _ := NewElementCombination(FIGHTING, nil)
|
|
result2 := calculator.CalculateEffectiveness(attacker2, defender2)
|
|
fmt.Printf("草战斗->战斗:%v → %v → 倍数:%.1f\n", attacker2, defender2, result2)
|
|
|
|
// 测试用例3
|
|
attacker3, _ := NewElementCombination(GRASS, &FIGHTING)
|
|
defender3, _ := NewElementCombination(GRASS, &FIGHTING)
|
|
result3 := calculator.CalculateEffectiveness(attacker3, defender3)
|
|
fmt.Printf("草战斗->草战斗:%v → %v → 倍数:%.1f\n", attacker3, defender3, result3)
|
|
|
|
// 测试用例4
|
|
attacker4, _ := NewElementCombination(GRASS, nil)
|
|
defender4, _ := NewElementCombination(GRASS, &FIGHTING)
|
|
result4 := calculator.CalculateEffectiveness(attacker4, defender4)
|
|
fmt.Printf("草->草战斗:%v → %v → 倍数:%.1f\n", attacker4, defender4, result4)
|
|
|
|
// 测试用例5
|
|
attacker5, _ := NewElementCombination(GRASS, &FIGHTING)
|
|
defender5, _ := NewElementCombination(WATER, &FIGHTING)
|
|
result5 := calculator.CalculateEffectiveness(attacker5, defender5)
|
|
fmt.Printf("草战斗->水战斗:%v → %v → 倍数:%.1f\n", attacker5, defender5, result5)
|
|
}
|