生成并发送大量文本-如何对其进行优化?

问题描述 投票:0回答:1

这可能是最奇怪的问题之一...对不起。

我正在尝试使用战斗系统创建基于文本的网络游戏。让我们想象一下这样的战斗的输出看起来像这样:

ROUND 1:
AAA hit BBB for X ammount of damage.
BBB hit AAA for Y ammount of damage.
ROUND 2:
AAA missed BBB.
BBB hit AAA for Z ammount of damage.

而且它确实像这样连续进行了几十次,比如说最多1000行。这是简化的示例,但是您明白了。显然,它还附带了许多HTML代码-我将跳过它以澄清输出。

现在,为了生成此战斗报告,我正在以这种方式生成它(也进行了简化,请仅将其视为伪代码,以显示其思想,而不是真实的代码:]

$char1 = 'AAA';
$char2 = 'BBB';
$char1_hp = $char2_hp = 1000;
$msg = '';
$fight_continue = true;
$round = 1;
while ($fight_continue)
{
    $msg .= 'ROUND '.$round;
    if (mt_rand(0, 100) <= 50)
    {
        $dmg = mt_rand(1, 10);
        $char2_hp -= $dmg;
        $msg .= $char1.' hit '.$char2.' for '.$dmg.' ammount of damage.';
    }
    else
        $msg .= $char1.' missed '.$char2.'.';

    if (mt_rand(0, 100) <= 50)
    {
        $dmg = mt_rand(1, 10);
        $char1_hp -= $dmg;
        $msg .= $char2.' hit '.$char1.' for '.$dmg.' ammount of damage.';
    }
    else
        $msg .= $char2.' missed '.$char1.'.';

    if ($char1_hp<=0 || $char2_hp<=0)
        $fight_continue = false;
    else
        $round++;
}

现在存在一些优化问题。首先,我不确定在服务器端创建这么大的$msg字符串是否合适。其次,大量文本可能会导致传输问题-我想保存它。

我想出了一种解决方案来“编码”报告,并在客户端强制JS对其进行解码。它看起来像这样:

$char1 = 'AAA';
$char2 = 'BBB';
$char1_hp = $char2_hp = 1000;
$msg = '';
$fight_continue = true;
$round = 1;

$msg[0][1] = $char1;//input data to decode names
$msg[0][2] = $char2;//input data to decode names
while ($fight_continue)
{
    if (mt_rand(0, 100) <= 50)
    {
        $dmg = mt_rand(1, 10);
        $char2_hp -= $dmg;
        $msg[$round][1] = array(1, 1, 2, $dmg);//1, 1, 2 decodes for char1, hit, char2
    }
    else
        $msg[$round][1] = array(1, 0, 2, 0);//1, 0, 2 decodes for char1, missed, char2

    (...)
}

客户端浏览器将获得的战斗报告如下:

(0 => (1=>'AAA', 2=>'BBB')), //initialization data
(1 => (0=>(1, 1, 2, 5), 1=>(2, 0, 1, 0))) //whole data for round 1
(2 => etc...) //whole data for round 2

现在,我可以打印数组并为JS中的“可视化”部分编写代码(由于问题无关紧要,因此我将不提供任何代码显示方式,因为这无关紧要),只需解码数字即可。主要的缺点是,编写“战斗”代码极不直观-容易犯错误和形象化错误。而且事实是,如果我想更改任何内容,则需要同时更改PHP和JS脚本中的争用。

这是真正的问题的一部分:

  1. 这个主意有多好?也许用$msg .= 'XXXXXXXX';粘合巨大的字符串很好,甚至比为服务器端PHP创建巨大的数组更好?

  2. 如何进行其他操作?

  3. 也许有一种方法可以像第一个示例中那样创建“自然”文本,然后压缩文本,将其发送到客户端浏览器,然后在客户端用JS解压缩?

javascript php optimization client-server
1个回答
0
投票

最佳实践表明,第二种方法应该是将服务器呈现的信息发送到前端或从前端发送出去的更好的方法。 AJAX接口将是实现此目标的正确方法。

如果您仍然希望在后端使用“更高级别”的界面,我建议您将框架构建为面向对象的东西。有一个person的对象,其功能随后可以读取这些对象及其命中信息。为了将此作为项目有效地扩展,最好将其设计为damage作为attack的属性。然后,要发送您的信息,您只需转到$personA->hits($personB, $attack);,其中function hits(Person $p, Attack $a){}包含要输入的人员和攻击信息,并返回命中信息的字符串。

在您的示例中,它看起来像:

class Attack {
    public int $damage;
    public function getDamage(): int
    {
        return $this->damage;
    }
}

class Person {
    public string $name;
    function getName(): string
    {
        return $this->name;
    }

    function hits(Person $p, Attack $a){
       $p->hp -= $attack->getDamage();
       //...other battle logic here
       return $this->getName . ' hit ' . $p->getName() . ' for ' $a->getDamage();
   }
}

然后,您的攻击工作流程将只命中一个AJAX端点,该端点处理后端并返回您想要的内容。这样,当您需要将击中信息发送到前端时,您可以读回字符串或发送玩家状态的json_encoded数组并让前端进行渲染,从而使关注点更加整洁分开。希望这能使您走上正确的道路!

© www.soinside.com 2019 - 2024. All rights reserved.