用JSP写出猜数字的游戏

来源:岁月联盟 编辑:exp 时间:2011-10-15

常能见到一款经典的益智游戏——猜数字。假定C为游戏主持者,M为玩家,过程是这样的:
C任意选取4个不重复的数字(0-9),并以任意次序组成一个串;
M开始猜测这4个数字,同样给出不重复且有次序地4个数字;
C拿M的猜测与事先选取好的4个数字相比较,并给出结果:计数字和位置都正确的个数为m;而数字出现过但位置不对的个数为n,结果以mAnB的形式给出。
如果结果是4A0B,则游戏结束,否则M继续猜,重复2。
比如某次游戏过程是这样的:
C选取5816
M猜8754,C回答 0A2B
M猜4138,C回答 0A2B
M猜7081,C回答 0A2B
M猜5410,C回答 2A0B
M猜5816,C回答 4A0B,游戏结束
上面这次游戏用了5个回合完成游戏。人在玩这个游戏的时候,都是根据逻辑推理来进行,在没有前提条件无法进行推理的时候,则随意猜测。比如第一次猜8754的结果是0A2B,则说明这四个数字中有两个在结果中出现过,但位置不对,那下一次猜测时则保留上次中的两个,调整一下位置,然后猜测4138,这样逐步逼近结果。

大一C语言课的一道大作业题,就是编成完成猜测的过程。我一开始是按照人游戏时的逻辑进行,根据回答进行分类判断,进行推理,导致程序异常复杂,是我所难以完成的。后来跟chaoslawful等讨论,他的解法则完全不是这个思路:他会根据猜测的结果把所有可能的数字过滤一遍,保留所有可能是结果的那些数字排列,并从中任选一个去猜,如果回答是4A0B或者仅剩下一个,则得到结果。当时听到这个方法时,让我非常震惊,以致现在都还记得。

虽然只是一个猜数字问题,但却反映了一个重要的事实:计算机的思维方式是跟人不一样的,不能以人的思维方式去让计算机干活。人的记忆能力和处理速度(狭义),远不如现在的计算机,但逻辑推理等方面异常强大,在处理复杂问题时表现出强大的智能。而计算机的优势在于可以高度的重复完成简单任务,通过这些简单任务的组合,可以解决很多复杂问题,实现“智能”。

比如这个猜数字游戏,计算机通过穷举和搜索完成了人必须用复杂的逻辑推理才能做到的事,可以说在这方面与人具有了同样的智能。类似的例子还有很多,比如深蓝战胜卡斯帕罗夫,搜索引擎帮我们找到所需要的资料,都是以与人的思维过程完全不同的方式,达到甚至超越了人的智能所能达到的效果。可以说在这一方面,它们通过了图灵测试,可以说具有了智能。

有人会说计算机的这种能力不能称为智能,理由是它现在还不能完成许多复杂任务,比如图像内容识别。可是回想一下,现在的人类大脑,是经过了几十亿年(从高分子有机物开始)的漫长演化,而计算机从出现到现在,才有不到两百年(包括早年的机械计算器),可见它的前途是不可限量的。二十年前,识别汽车牌号可能还只在科幻片中出现,可现在已经开始在生活中广泛应用。

也有人会说计算机不具有创新能力,只能按照它的创造者人所指定的轨迹行事。所谓创新,其实是一个相对的概念,回想一下人所做的创新,很多时候是把原先已经存在的东西做了从未有过的组合,那种从无到有的创造,估计只有上帝才能完成。计算机是可以完成这种组合的,甚至穷举所有组合。当这种组合是人从未想到过的时,就是创新。

在电影《I, Robot》中,过于复杂的中央控制系统,通过不断演化最终具有了自我意识,可以给我们一点启示:当一个系统复杂到人无法想象的程度时,它所做的一些常规的事情也会让人无法理解,就可以说它具有了智能或者独立意识。比如2003年我参加的智能体大赛,“决不贪吃”所具有的能力已经超过的大多数人类玩家,在不懂得编成的人看来,“决不贪吃”的某些举动实在无法理解,它太聪明了,甚至能够创新。可对我们这些参赛者来说,所有这些举动都是根据我们事先指定的规则来的,不存在所谓创新。但有时候,仍不免被那些事先未预料到的场面所震惊,只有通过事后的仔细分析,才发现出现这种结果是“理所当然”的。

再看看我们的大脑,不也是一些原子构成的么?再往上看,无非是一些脑皮层细胞而已。只是它太复杂了,几十亿个脑细胞以更加复杂的方式耦合在一起,其复杂程度是现在人所无法想象的。假如拿几十亿个CPU组成一个超复杂网络,那将会是什么样的一个系统?再看看现在的internet,接入的计算机数量已近达到了亿的量级,只是计算机之间的连接还相对简单。但如果从一个旁观者的角度看,互联网的行为已经是非常诡异了。随着P2P和Web 2.0 的发展,互联网将更加复杂,说不定哪天它就能够思考,有了“自我意识”。