diff --git a/logic/service/fightc.go b/logic/service/fightc.go index c163833b..d18caf27 100644 --- a/logic/service/fightc.go +++ b/logic/service/fightc.go @@ -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 // 玩家ID:1或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,持续战斗 +}