游戏脚本代码Bug与逻辑问题分析
游戏脚本代码Bug与逻辑问题分析
代码:
if (clonep(obj))
{
write(obj->query('name')+'化作一道流光消失了!!\n');
destruct(obj);
return 1;
}
if (wiz_level(me) < 3 && obj->query('no_drop'))
return notify_fail( obj->query('name') + '不能被丢弃。\n');
no_drop = environment(me)->query('no_drop');
if (no_drop)
return notify_fail(stringp(no_drop) ? no_drop : '这里东西丢弃下去也看不见。\n');
if(!wizardp(me)){
switch ((string)obj->query('equipped'))
{
case 'worn':
tell_object(me, obj->query('name') + '必须脱下来才能丢掉。\n');
return 0;
break;
case 'wielded':
tell_object(me, obj->query('name') + '必须解除装备才能丢掉。\n');
return 0;
break;
}
}
可能的Bug:
-
在if语句中,没有检查
obj是否为NULL,如果是NULL可能会导致程序崩溃。需要加上判断条件。 -
在switch语句中,没有检查
obj->query('equipped')返回的字符串是否为空,如果为空可能会导致程序崩溃。需要加上判断条件。 -
在switch语句中,如果
obj->query('equipped')返回的字符串不是'worn'或'wielded',没有处理这种情况。需要加上default分支来处理这种情况。
逻辑问题:
-
在if语句中,如果
obj是克隆出来的对象,直接销毁可能会导致问题。如果其他地方还有引用这个对象的指针,那么这些指针将变成野指针,可能会导致程序崩溃。应该先判断这个对象是否还有引用,如果有,应该先解除引用,再销毁对象。 -
在if语句中,如果
obj是克隆出来的对象,直接销毁可能会导致内存泄漏。应该在销毁对象之前,先调用obj->remove()方法来清理对象。 -
在if语句中,如果
obj是克隆出来的对象,直接销毁可能会导致游戏中出现重复的对象。应该先调用obj->is_character()方法来判断这个对象是否是一个角色对象,如果是,应该先将其从游戏中删除,再销毁对象。 -
在if语句中,如果
obj是克隆出来的对象,直接销毁可能会导致脚本中出现未预料的结果。应该先调用obj->is_item()方法来判断这个对象是否是一个物品对象,如果是,应该先将其从游戏中删除,再销毁对象。 -
在if语句中,如果
obj是克隆出来的对象,直接销毁可能会导致游戏中出现未预料的结果。应该先调用obj->is_furniture()方法来判断这个对象是否是一个家具对象,如果是,应该先将其从游戏中删除,再销毁对象。
原文地址: https://www.cveoy.top/t/topic/m30X 著作权归作者所有。请勿转载和采集!