“以子之矛攻子之盾”可以用计算机模拟么?会出现什么情况?

关于那个古老的成语故事,一个楚人卖兵器,介绍自己的矛时说:“老子的矛特别好,不管么样的盾都能击穿”;介绍自己的盾时又说:“随么样的矛都搞不穿老子的盾”。有人就问:“用你的矛来击你的盾呢?” 那个楚人于是伸出长矛,把问问题的人刺死了。


我设想有一款网络游戏,里面存在矛和盾两种装备,在写某种矛装备时,程序写成“当在使用时,判断是否击打到盾上,如果是,则盾开裂”;在写某种盾装备时,程序写成“当有矛来攻击时,判断攻击无效”,那这两种装备在相遇时,程序会怎么判断?

推荐  (0) | 15人关注关注
18个答案
11 3

分两个部分来回答LZ吧。
在计算机的范畴内,有个很重要的主题,就是计算机的解决问题的能力。它是否能解决所有问题呢?答案是否定的。首先,计算机是基于某种数学模型建构的,它本身只能解决该模型内的问题集合。该数学模型能处理的问题以外的模型是不能够处理的。除此以外,也有问题复杂度的问题。哪怕是在该模型内的问题,如果复杂度过高就无法处理了。TSP问题,它是一个NP问题(缩写的解释在文章后面附上)。在计算机是无法有效的解决这样的问题的(它可以解决,但需要消耗相当大的时间)。除此以外还有一些情况会让我们的计算机没法解决。所以,计算机不是任何问题都能解决的。

回到LZ的问题上。我们讲计算机应用在生活当中,并不是将生活中遇到的问题直接交由计算机来解决。而是将这些问题转换成它能解决的问题。LZ所提的问题,本身是个矛盾的,它无法用任何数学模型,语言准确描述而又不产生矛盾。这样的问题本身不具备正确的答案,它本身的逻辑是不合理的,所以恐怕是无法交由计算机处理。事实上,在游戏中,我们不会将这样的问题作为规则让电脑来处理,而是会象其他大大所说的那样,化成攻击力/防御力的数值,加上随机数和此外的一些可以处理的规则来处理游戏中伤害和防御的问题。往往的在于电脑来说,这只是些简单的加减乘除而已。


TSP,Travel Saleman Problem。旅行商人问题。一个旅行商人,在若干个城市之间旅行销售。给出各个城市之间的距离。求一个路径,使得它访问且仅访问每个城市一次,而行走的距离又是最短的。这是一个计算机比较难处理的问题。这是个复杂度为N!的问题(使用暴力算法)。简单的说,要求得最优答案,至少进行n!次运算,n为城市的数目。当城市的数目有20个,问题就几乎无法解决。而且这是一个NP问题。

NP问题是指,一个问题的求解问题的过程与验证答案的过程的复杂度一致的问题。架设我给出某个TSP问题的答案,那么验证这个答案的复杂度和求解的复杂度是一样的。求大质数也是NP问题(找某个质数你需要让它除以比自己小的(质)数,验证一个数是否是质数也是一样的过程)。

7 0

首先,最强之矛,有好几种设计方法。

最简单的就是——设置最强之矛攻击力9999999999999, 而其它装备的防御都小于100。
如果最强之盾也这样设置,那么能否攻破就看程序员当初随手输入的数值了。

另外如果绝对破防作为属性的一种,绝对防御作为属性的一种,就只看程序员写攻击判定程序的写法,到底是破防还是不破,还是交给了程序员手中。(这是一个逻辑问题,人的逻辑能解决电脑就能,人解决不了电脑也不能。)

2 0

指针指向你处理器内部构架学学徒

2013-12-17 00:53

作为程序员,我告诉你,对于一个程序,程序员就是上帝,让哪个强一些,那个就强一些

0 0

电脑里还是会有一个破坏力的值或者防御的值得。 矛的伤害可能被定的无限高,同样盾的防御也会是非常高,具体结果就看谁设定的更牛了。

0 0

水下漂不学无术懒人党 代码民工 近代史

2013-03-26 17:41

请参考DND规则~

0 0

渚熏软件工程师,网路安全从业者

2013-03-26 22:34

看两边的数值
攻击大于防御盾坏掉。
攻击小于防御的话矛坏掉。

相等的话,一般弄个随机函数roll一下,看人品。

1 1
支持者: ufo5260987423

没有你那么设计的,武器有攻击值,防具有防御值,要计算是否能破防,但实际上计算起来非常复杂,比如wow中,攻击时还要计算暴击的几率,武器是否带破防的属性,防具带的躲避几率,防具的磨损度等。

8 3

我来抛砖引玉

一般来说,对战斗结果的判定算法不会跟装备捆绑在一起,而是有一个总的算法,在战斗时通过装备的ID调用其数值来计算,当装备要进行数值计算以外的特殊判定,就用条件语句调用其他函数

根据楼主的描述,游戏中至少有四大类装备:最强之矛,我们称之为Lust,最强之盾,我们称之为Greed,普通的矛,我们称之为幸运E,普通的盾,我们称之为游氏双雄

那么战斗的配对就至少有四种:
(1)Lust干Greed
(2)Lust干游氏双雄
(3)幸运E干Greed
(4)幸运E干游氏双雄

然后就是根据配对结果,用条件语句调用合适的算法。很容易看出,上述除了(4)以外,都是特殊的、不从装备数值考虑结果的,合格的程序应当将各种情况考虑在内给出特定的结果,但是假如楼主问道的情况(1)恰好被忽视了呢?

一,用的是IF分支
用这个分支语句来做游戏我是觉得很奇葩的=。=

假定程序猿除了(1)以外都考虑到了,IF语句最后以一个不描述条件的ELSE结尾的,有四种可能:
圈1:(2)、(3)得到描述,(4)用ELSE表示,那么判定情况(1)既不是(2),又不是(3),那么程序就会认为同情况(4),就会试图调用矛和盾的具体数据,那么视乎该装备有没有一个(理论上用不上)的攻防数据,可能输出结果,也可能因为得不到要求的数据而报错

圈2:(2)、(4)得到描述,(3)用ELSE表示,那么同上,只不过情况(1)被程序认为是(3),则盾无伤,矛损坏

圈3:(3)、(4)得到描述,类似圈2,盾损坏

圈4:(2)、(3)、(4)都得到描述,ELSE是一个”啥也不干“,那么(1)就被归到”啥也不干“的类别,矛盾难分高下

二、用的是switch分支

这种情况就比较简单了,(2)、(3)、(4)都得到考虑并给出特定的结果,(1)不满足语句中的任何一种条件,结果就是……退出还是报错来着,其实我从来没用过switch(对手指)

所以请楼主自行查阅switch语句的语法规则(抱头跑)

0 0

这个问题让我想到了以前WOW里的两个技能:1、盗贼的“冷血”,使下一个技能必定暴击;2、牧师曾经有个天赋,受到暴击后的几秒内任何对其造成的伤害都无法造成暴击。。。不知道WOW里当时是怎么处理的。

0 0

没那么复杂
try
{
...
if (weapon.attack == shield.defend)throw"01";
...
}catch(string ex) {
return;
}

0 0

盾是遇到攻击则攻击无效化,矛是攻击到盾则使盾开裂。那么盾在矛判定触发前否定了其触发的条件,盾不会破裂。
楼主的意思应该是那寓言中的原意,即摧毁一切的矛与抵挡一切的盾相碰。但是这两者是不能同时存在的,如果同时存在则违反基本逻辑,而违背逻辑的事情人类无法理解。

0 0

从算法设计来讲,一般地,设计一个攻击模型时,大致会设计以下这一个时序:
1.发起攻击》2.判断是否命中(有时候爆击、躲闪、招架、格挡等也会在这个阶段计算)》3.若能成功造成伤害则计算伤害数值》4.判断是否死亡或决出胜负》loop
然后,装备特效和技能效果等会改变基础游戏规则的,则会按需要在上面的时步中插入一些额外的阶段来判断和产生效果。例如 a.我们设计一个物理免疫护盾(保护之手),则可能在阶段2和3之间插入一个阶段判断攻击属性和伤害免疫。 b.我们设计一个反击效果(惩罚光环),则可能在阶段3和4之间插入一个阶段结算反击伤害。
那么以这个规则再来看提问,如果严格按照原题文字描述,上述这两件“具有逆天特效的神装”,盾的特效“当有矛来攻击时”会设计在1和2之间插入判断,矛的特效需要先“判断是否击打在盾上”,会设计在2和3之间插入,在优先级上会落后于盾的特效。所以盾的特效会先触发并取消掉矛的特效。
但实际游戏设计中设计师会避免这种因时序而导致效果不被玩家明确的做法,例如某个有个很著名的论坛的MMORPG中,臭名昭著的(圣盾术)和(寒冰屏障)会让你免疫一切效果,但群体驱散的说明会通过“可以驱散一些强力魔法”来暗示玩家尝试使用它来对抗像以上两个技能这样的强力魔法。
回到矛盾这里,则神装特效一般会说明对其他神装无效,以规避这种尴尬的局面。这在需要人为判断效果是否成功的纸牌游戏中会更为严谨。

PS 我不是圣骑士,至少最近不是 乛-乛

0 0

“当在 使用时,判断是否击打到盾 上,如果是,则盾开裂”;盾“当有矛来攻击时,判断攻击无效”
所以矛打破盾,这玩家会看到打破盾的提示,但是对方的盾还在。
而对方看到矛没有打破盾。

0 0

攻击无效或伤害减免;盾掉耐久。 这样的设定游戏里不是挺常见的吗?
有的游戏(比如火焰纹章)还有武器攻击一次也掉一点耐久的情况。

0 0

如果是在网络游戏中,那么谁后推出谁强,因为网络游戏是要赚钱的……

查看更多

添加回答

登录 后回答问题,你也可以用以下帐号直接登录

相关问答

关于我们 加入果壳 媒体报道 帮助中心 果壳活动 家长监控 免责声明 联系我们 移动版 移动应用

©果壳网    京ICP证100430号    京网文[2018] 6282-492号    新出发京零字第朝200003号     京公网安备11010502007133号

违法和不良信息举报邮箱:jubao@guokr.com    举报电话:18612934101    网上有害信息举报专区    儿童色情信息举报专区