feat(logic): 添加战斗逻辑和玩家操作处理
- 新增 battleLoop 方法实现战斗循环逻辑 - 定义 Action 结构体表示玩家操作 - 实现玩家输入处理、战斗计算和战斗结束检查等逻辑 - 添加模拟玩家操作和战斗结果输出
This commit is contained in:
@@ -3,6 +3,8 @@ package service
|
|||||||
import (
|
import (
|
||||||
"blazing/logic/service/fight/info"
|
"blazing/logic/service/fight/info"
|
||||||
"blazing/modules/blazing/model"
|
"blazing/modules/blazing/model"
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/jinzhu/copier"
|
"github.com/jinzhu/copier"
|
||||||
)
|
)
|
||||||
@@ -80,9 +82,91 @@ func (f *FightC) NewFight(i *info.NoteReadyToFightInfo, plays PlayerI) {
|
|||||||
//这时候应该建立一个虚拟的player
|
//这时候应该建立一个虚拟的player
|
||||||
|
|
||||||
}
|
}
|
||||||
|
f.battleLoop()
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// 定义操作类型,存储玩家的操作信息(如技能选择、目标等)
|
||||||
|
type Action struct {
|
||||||
|
PlayerID int // 玩家ID:1或2
|
||||||
|
SkillID int // 使用的技能ID
|
||||||
|
TargetID int // 目标ID
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *FightC) battleLoop() {
|
||||||
for { // 战斗回合循环
|
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,持续战斗
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user