RPG多人回合制游戏战斗框架设计《一:基本战斗流程》

服务器多人回合制RPG战斗框架设计

 

最终目标是写出一个纯服务器的回合制战斗框架,可以进行简单的战斗

战斗设计时回合制战斗最难也是最复杂的部分

语言:python2

相似RPG游戏:梦幻西游、神武等

RPG战斗框架包含以下四部分的内容:

一、基本战斗流程

二、战斗角色设计

三、战斗伤害计算

四、技能设计

五、BUFF设计

六、战斗AI、

一、基本战斗流程

战斗流程不复杂,基本就是安装以下流程走

①回合开始

②回合数 + 1

③si玩家操作:攻击\防御

④C2S客户端通知准备完成

⑤服务器开始计算伤害:S2C

⑥客户端开始表现

⑦客户端表现结束通知

⑧回合结束

⑨判断游戏结束 or 进入下一回合

流程如下:

RPG多人回合制游戏战斗框架设计《一:基本战斗流程》_第1张图片

由于RPG游戏对网络要求不高,战斗计算都是放在服务器

服务器处理比较的是OnFight里面,各种嵌套复杂的技能、效果、Buff、AI都在里面计算

伪代码如下:

warframe.py

# -*- coding: utf-8-*-

from war_def import *


class CWarFrame(object):
    def __init__(self):
        self.m_teams = [[None] * 5, [None] * 5]  # 战斗角色队伍
        self.m_ready_warriors = 0  # 准备的战斗角色数量
        self.m_bout = 0  # 当前回合数

    def start(self):
        self.turn()

    def turn(self, delay=0):
        self.callout(self.on_turn, delay, "war_fight")

    def on_turn(self):
        win = self.check_end()
        if win:
            self.end(win)
        else:
            self.m_bout += 1
            self.callout(self.on_fight, FIGHT_COMMAND_OUT_TIME, "war_wait")

    def on_fight(self):
        """
        服务器开始战斗计算
        """

        def __prefight(w):
            w.pre_Fight()
        self.warriors_call(__prefight)

        warriors = [wobj for line in self.m_teams for wobj in line]
        warriors.sort()  # 按速度排序

        delay = 0  # 每回合客户端表现事件
        while warriors:
            wobj = warriors.pop()
            d = wobj.m_command(wobj)  # 战斗角色对象执行操作
            delay += d

        self.on_bout_over()
        self.turn(delay)

    def end(self, win):
        for line in self.m_teams:
            for wobj in line:
                self.leave(wobj)

    def leave(self, wobj):
        """
        战斗角色对象离场
        """
        wobj.on_leave()

    def on_bout_over(self):
        """
        服务器回合结束,等待客户端表现
        """
        self.warriors_call(self.action, WARACT_BOUTEND)

    def check_end(self):
            if self.m_bout >= 5:
                return True
            return False

    def callout(self, func, delay, key):
        # timer = threading.Timer(delay, func, key)
        # timer.start()
        # self.m_Timer = {key} = timer
        pass

    def remove_callout(self, key):
        # timer = self.m_Timer.pop(key, None)
        # if timer:
        #    timer.cancel()
        pass

    def action(self, wobj, act):
        """
        战斗角色进行行为
        :param wobj: 战斗角色对象
        :param act: 行为
        """
        wobj.m_action = act
        if act == WARACT_READY:
            self.m_ready_warriors += 1
            if self.m_ready_warriors >= 5:
                self.remove_callout("war_wait")
                self.on_fight()
        elif act == WARACT_BOUTEND:
            wobj.on_bout()
        elif act == WARACT_WAIT:
            wobj.do_ready(self)

    def warriors_call(self, func, *args):
        for line in self.m_teams:
            for wobj in line:
                if wobj:
                    func(wobj, *args)

战斗行为类型定义:

war_def.py

# -*- coding: utf-8-*-


WARACT_FINISH = 0
WARACT_WAIT = 1
WARACT_READY = 2
WARACT_FIGHT = 3
WARACT_BOUTEND = 4

FIGHT_COMMAND_OUT_TIME = 30

你可能感兴趣的:(游戏服务器,服务器,mmorpg,多人回合制)