背景说明
假设游戏技能介绍中,我们需要描述技能伤害、技能冷却时间等数值。如果需要改变一个数值,除了修改存储的数值以外,我们还需要修改技能介绍对于这个数值的描述。有时候经常会修改了数值而忘记修改描述,造成技能的使用效果并不像其描述的那样。
所以我们可以使用占位符,再使用正则表达式做替换,并进行处理,简化以后每一次的数值修改。只需要关心数值修改,不需要再每一次都修改描述。另外,由于我们在技能描述中的数值单位与数值在存储单位不一定相同,所以必须要支持基本的数值运算。比如1000ms换成1秒。
假设技能描述是这样的"冷却时间:{#cd}毫秒,{#cd/1000}秒",cd的值为1000。那么这个描述经过处理后是这样的"冷却时间:1000毫秒,1秒"。
代码
php
class Skill
{
/**
* 技能介绍
*/
public $introduction="";
/**
* 冷却时间 单位ms
*/
public $cd=0;
public function handleIntroduction()
{
$content=$this->introduction;
//找出所有被{}及其包裹的内容集合
//$matchs[0]为带{}的集合 $matchs[1]为不带{}的集合
preg_match_all("/\{([^\{\}]+)\}/",$content,$matchs);
for ($i = 0; $i < count($matchs[1]); $i++)
{
$math=$matchs[1][$i];
//从包裹内容中匹配出变量名
//$valueNames[0]为带#的变量名 $valueNames[1]为不带#的变量名
preg_match_all("/\#([^\+\-\*\/0-9]+)/",$math,$valueNames);
for ($j= 0; $j < count($valueNames[1]); $j++)
{
$valueName=$valueNames[1][$j];
//getValue方法获取相应变量名的变量值
$value=$this->getValue($valueName);
//替换掉{}及其包裹的内容
$math=str_replace($valueNames[0][$j],$value,$math);
}
//所有变量名换成了变量值,进行运算
$math=eval("return $math;");
$content=str_replace($matchs[0][$i],$math,$content);
}
$this->introduction =$content;
}
private function getValue($valueName)
{
$value = $this->$valueName;
if ($value != null)
{
return $value;
}else{
return 0;
}
}
}
调用
$skill=newSkill;
$skill->cd=1000;
$skill->introduction="冷却时间:{#cd}毫秒,{#cd/1000}秒";
$skill->handleIntroduction();
print_r($skill->introduction);
//冷却时间:1000毫秒,1秒
扫描二维码关注公众号,回复:
4235756 查看本文章