feat(logic): 添加战斗逻辑和玩家操作处理

- 新增 battleLoop 方法实现战斗循环逻辑
- 定义 Action 结构体表示玩家操作
- 实现玩家输入处理、战斗计算和战斗结束检查等逻辑
- 添加模拟玩家操作和战斗结果输出
This commit is contained in:
2025-09-04 03:14:43 +08:00
parent 55409f803c
commit f49464a80c

View File

@@ -3,6 +3,8 @@ package service
import (
"blazing/logic/service/fight/info"
"blazing/modules/blazing/model"
"fmt"
"time"
"github.com/jinzhu/copier"
)
@@ -80,9 +82,91 @@ func (f *FightC) NewFight(i *info.NoteReadyToFightInfo, plays PlayerI) {
//这时候应该建立一个虚拟的player
}
for { //战斗回合循环
}
f.battleLoop()
}
// 定义操作类型,存储玩家的操作信息(如技能选择、目标等)
type Action struct {
PlayerID int // 玩家ID1或2
SkillID int // 使用的技能ID
TargetID int // 目标ID
}
func (f *FightC) battleLoop() {
for { // 战斗回合循环
// 每个回合重置:创建两个通道接收双方操作
p1ActionChan := make(chan Action) // 玩家1的操作通道
p2ActionChan := make(chan Action) // 玩家2的操作通道
// 启动goroutine处理双方输入实际项目中这里会绑定用户输入逻辑
go handlePlayerInput(1, p1ActionChan)
go handlePlayerInput(2, p2ActionChan)
// 等待双方操作或超时
var p1Action, p2Action Action
var p1Done, p2Done bool
timeout := time.After(60 * time.Second) // 60秒超时
// 循环等待双方都完成操作
for !(p1Done && p2Done) {
select {
case action := <-p1ActionChan:
p1Action = action
p1Done = true
fmt.Printf("玩家%d已选择技能%d\n", action.PlayerID, action.SkillID)
case action := <-p2ActionChan:
p2Action = action
p2Done = true
fmt.Printf("玩家%d已选择技能%d\n", action.PlayerID, action.SkillID)
case <-timeout:
// 超时处理:未操作的视为放弃
fmt.Println("操作超时,未操作方视为放弃本回合")
// 根据超时情况补充未完成的操作(如空操作)
if !p1Done {
p1Action = Action{PlayerID: 1, SkillID: 0} // 0表示放弃
}
if !p2Done {
p2Action = Action{PlayerID: 2, SkillID: 0}
}
p1Done = true
p2Done = true
}
}
// 双方都已操作,执行战斗计算
fmt.Println("双方操作完成,开始计算本回合结果...")
calculateBattleResult(p1Action, p2Action)
// 检查战斗是否结束如一方血量为0
if isBattleEnd() {
fmt.Println("战斗结束")
break
}
}
}
// 模拟处理玩家输入实际中会绑定UI或网络输入
func handlePlayerInput(playerID int, actionChan chan<- Action) {
// 这里只是示例:实际中会等待用户输入(如点击技能按钮)
// 假设玩家1选择技能1目标是玩家2玩家2选择技能2目标是玩家1
time.Sleep(time.Second * 2) // 模拟思考时间
if playerID == 1 {
actionChan <- Action{PlayerID: 1, SkillID: 1, TargetID: 2}
} else {
actionChan <- Action{PlayerID: 2, SkillID: 2, TargetID: 1}
}
}
// 战斗计算逻辑(示例)
func calculateBattleResult(p1, p2 Action) {
// 实际项目中会根据技能ID计算伤害、 buff等
fmt.Printf("玩家1使用技能%d攻击玩家%d玩家2使用技能%d攻击玩家%d\n",
p1.SkillID, p1.TargetID, p2.SkillID, p2.TargetID)
}
// 检查战斗是否结束(示例)
func isBattleEnd() bool {
// 实际中会判断双方血量等条件
return false // 暂时返回false持续战斗
}