From 723d7b8ce4c844f4f468b96284242d19282546d4 Mon Sep 17 00:00:00 2001 From: 1 <1@72wo.cn> Date: Wed, 6 Aug 2025 00:02:14 +0000 Subject: [PATCH] =?UTF-8?q?feat(element):=20=E6=96=B0=E5=A2=9E=E5=85=83?= =?UTF-8?q?=E7=B4=A0=E5=B1=9E=E6=80=A7=E5=85=8B=E5=88=B6=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=E5=99=A8=E5=AE=9E=E7=8E=B0=EF=BC=8C=E6=94=AF=E6=8C=81=E5=8D=95?= =?UTF-8?q?=E5=8F=8C=E5=B1=9E=E6=80=A7=E7=BB=84=E5=90=88=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/data/Element/main.go | 163 ++++++++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 common/data/Element/main.go diff --git a/common/data/Element/main.go b/common/data/Element/main.go new file mode 100644 index 00000000..40f9429d --- /dev/null +++ b/common/data/Element/main.go @@ -0,0 +1,163 @@ +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) +}