【发布时间】:2020-06-09 13:27:26
【问题描述】:
这可能是最奇怪的问题之一......抱歉。
我正在尝试创建一个带有战斗系统的基于文本的网页游戏。让我们想象一下这样的战斗的输出是这样的:
ROUND 1:
AAA hit BBB for X amount of damage.
BBB hit AAA for Y amount of damage.
ROUND 2:
AAA missed BBB.
BBB hit AAA for Z amount 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.' amount 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.' amount 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
现在我可以 printf 数组并在 JS 中编写“可视化”部分的代码(我不会提供任何代码说明如何执行此操作,因为这与问题无关),只需对数字进行解码即可。主要的缺点是,编写“战斗”代码将非常不直观——很容易出错并将其可视化错误。事实上,如果我想更改任何内容,我需要同时更改 PHP 和 JS 脚本中的战斗。
这是真正问题的一部分:
-
这个想法是好是坏?也许用
$msg .= 'XXXXXXXX';粘合大字符串很好,甚至比为服务器端PHP 创建一个巨大的数组更好? -
如何做到不一样?
-
也许有一种方法可以像第一个示例一样创建“自然”文本,然后将文本压缩,发送到客户端浏览器,然后在客户端用 JS 解压缩?
【问题讨论】:
-
我不确定,也许我问的太广泛了,而我只是想问“如何打包文本”?无论如何 - 感谢您的提示!
-
1500 次重复“AAA 命中 BBB 造成 X 点伤害”。刚刚超过 50kB,未压缩(如果客户端支持,您的网络服务器应该自动压缩)。那是没什么。不要过早优化。
-
这只是一个例子,通常文本本身会长 2 到 3 倍,而对于 HTML,每个用户很容易达到 500kB 甚至更多,每天几百次。这确实让我担心,我想早点做出反应。
-
@Run_Script 代码审查需要来自项目的实际代码,代码尚未编写,所以这绝对是题外话。
-
@Run_Script Code Review 即将结束。请仅将优质问题提交给您确定会被接受的网站。
标签: javascript php optimization client-server