香山院 - 奇幻小说 - 暗影法师在线阅读 - 答支苍志乃的问题

答支苍志乃的问题

    话说,大大的你问题,问得我好心动呀~所以单独发个贴来回答你^-^

    其实是我因为自己想说啦~

    在我刚出来工作的时候,嗯,不是第1份工作,算是我第1份程序员工作吧。当时我意外地找到了生命中的第1份程序员工作,好开心啊。话说,我从高中开始就梦想成为程序员,现在很多人会说当程序员不好,但当时的确是我的梦想,同时也是我的理想。我整个高中时期为之奋斗的目标,也是我整个大学时期研究和学习的中心。

    那时候的工作是写C语言,这个公司是做电子产品的,我进去后学了2个月的C语言。我在读书的时候,已经学了几年的C语言,进公司是学他们的C语言,而不是学校的C语言。然后,由于开发部主管是汇编出身,他要求所有C程序员都要会写汇编,于是,我跟了一位前辈,同时也是当时的项目负责人,加入日英对译机的开发。当然,我不会日语,英语没强到可以当翻译,所以这方面的算法,跟我没什么关系。他们的机子是出口日本的,想为机子增加些小游戏,算是给我这种新人练手。于是,给了我一些小游戏机,叫我试玩下,看中哪个,就在我们自己的机子里编一个出来。然后,读者们就明白,东西是怎么山寨出来的了>_<

    其实中国程序员真心不缺好的思路和算法,就是没别人的创意而已。游戏是别人发明的,但我们能设计出更好的算法。

    我玩了下黑白棋,那是生命中第1次玩,从来没玩过那么奇怪的游戏,觉得很有趣。然后,当我玩了一个下午,总算有些心德了,我觉得我能做一个更好的,也更有难度的。于是,我花了一个下午来构思我的算法。由于C51的芯片运算实在太慢了,跟电脑是没法比的,所以那些太复杂,运算量太大的算法都不适用。我就想出一种策略矩阵。嗯,我赋予AI的一方拥有跟我自己相等的策略思维,那么他的对手,必须智慧在我之上,并且运算能力在C51芯片之上才能赢。虽然C51是很慢,8x8=64格的棋盘,用我的策略组,要差不多1秒才能下一格。但人脑,如果不用心去算的话,还是比不过C51的。

    然后我用了3天的时间来写我的程序。因为用的是工业板,半成品电路上编程,自然少不了找电工的麻烦。当时公司里程序员大概有130人左右,整个公司就2名电工,轮着应付我们,所以调试的进度很慢,要不然估计2天能搞完。

    嗯,这游戏没有程序平台是完全没办法玩的,因为每走一步都要计算同化问题。

    游戏完成后,终于可以人机对玩了,我不断修正,并在修正的过程中,领悟出了这个游戏的真正规则,于是完成了属于我自己的‘先手必胜’的理论。当然,前提是你明白先手为什么能必胜,否则还是要输的。

    其实这个东东嘛,说它很复杂也不是,说简单嘛,用文字也表达不清楚。基本思路其实是这样的。如果是1维棋盘的话,在格子上面标个数字,就是123456789这样,如果你下了1,AI只能下2,然后你3,AI就是4了,也就是说,当你下了1后,可以推出第N格是谁的,或者这样说吧,你一开始下的是奇数,那你只能一辈子下奇数,如果你一开始不下,等对方下奇数,那么接下来,你就一辈子下偶数。所以即便是扩展成二维棋盘,从你下的第一只子就已经可以推出,第1个角位是谁的,然后第2个角位是谁的。先手每一步都无误的话,可以抢到所有角位,而后手即便每一步都无误,也总是差一步才能抢到角位。没角位嘛,就是被清出局的命运了。

    我刚把软件开发好的时候,这个小游戏机,嗯,正确来说是翻译机,不过翻译功能我又不用,所以对我来说,还是游戏机。只有作为设计者的我自己能先手胜利,我同事,上司,以及几十个测试员都无人能胜。后来嘛,投诉了,说太难了,就加了个难度选择功能,说白了,就是我在心目中完美的基础上砍了一部分运算量,把这部分,本来算出来的改成随机数了,但即便是这样,除了我上司还是无人能赢。

    然后这个东西出厂了,去了日本,连贴哪个公司的牌叫什么名堂都不知道。因此,会不会遇到我意想不到的高手破解了我的套路,也不知道。但我心里还是对我当初的设计思路很有信心的。我觉得,我当时的设计,应该是完美的。

    好了,说了那么多。为什么小说中的格雷斯要玩黑白棋呢?

    那是因为黑白棋是一种棋盘大小跟运算量成正比的游戏。

    为什么不是看起来很像的五子棋和围棋呢?

    首先说五子棋。因为五子棋是棋盘大小与运算量基本无关的游戏。五子棋的目的就是自己下5子或43,以及强迫对方下禁棋。不管你的棋盘多大,它就是围绕刚开始那个中心进行发展而已,总共也就是几十子这么个规模的运算量。你棋盘再大,也不过另开战场,这个运算量不会以前面的棋子为依据扩大下去的。所以,虽然五子棋的程序很好编,但也就欺负下人类的新手而已。因为运算规模不大,所以实际上AI相对人脑而言是没有优势的。如果进行扩展,变成6子棋或7子棋,只会让游戏变得更容易和棋,无助于增加运算规模。也就无法反应出格雷斯的运算能力来,所以不用它。

    然后说围棋。围棋是目前我所知道的,人类最考验智慧的游戏。目前为止没见过什么靠谱的程序和算法可以拼得过人脑的。我所玩过最优秀的围棋程序,能够分析出势力的,就编程难度来说,都已经不简单了,但还是随随便便就能赢AI。由于我本人没想明白围棋是靠什么来赢的。是跟运算量关系大些,还是跟思维深度关系大些,还是记忆和关联能力关系大些,都不确定,所以也就不敢写了。

    最后说说象棋。

    国际象棋,国际象棋程序是最简单的。因为棋盘小,棋子之间互相挡住了大部分可以移动的空间,导致即便是最笨的程序,想要遍历所有棋子的移动方式,以目前的计算机硬件运算能力,都还是办得到的。所以由超级计算机所运行的国际象棋程序能下赢国际棋王。慢棋不知道行不行,但就算现在不行,以后还是行的。由于运算规模太小,体现不出格雷斯的能力来,所以格雷斯表示对国际象棋什么的,不感兴趣。

    中国象棋,中国象棋相对来说,困难得多。因为棋盘更大,组合规则也更多,导致程序稍微差点,普通的计算机都跑不动。你可能会说,红白机时代就有很靠谱的中国象棋游戏了。嗯,因为有棋谱这个东西。所以中国象棋程序好不好,跟棋谱是分不开的。因为我爸中国象棋很厉害,害我每次都输,导致我从小就直接放弃不玩,所以我的中国象棋很差,也就编不出什么像样的程序了,所以格雷斯不会下中国象棋。

    军仪,这个是hunterxhunter里面的东西。hunterxhunter是我很喜欢的故事。但跟军仪相似的游戏,是不是真的有,我不知道。叠棋倒是很早就有人想到了,但好像也不是流行了很久。个人认为也不过棋盘规模扩大了一个维度,而且这个维度如果真的只有3的话,认为不会比围棋复杂的,估计是因为作者日本象棋下多了,以为很难。因此这么恶搞的东西,我还是不让格雷斯玩了。

    最后,关于黑白棋在球面上,是不是真的能玩的问题,我没证实过,也不确定。拼出这么个棋盘,我认为是合理的,但上面双方是不是真的能博弈出个结果来,还是不确定。反正是小说,那么多格,人类也不可能下得完的。大大们就随便看看算了,不用较真啦~

    为什么会突然想起那么久前写过的程序呢?

    因为在我生命中写过,真正让我感到快乐的程序不多。工作中的程序大多数是别人要求的,只有少数是为了达成特定目的而自由发挥。绝大多数跟算法和数据结构无关。写得最多的是接口和业务逻辑。干过最多的工作其实是移植和修改别人的代码。如果算上写文档的话,其实敲中文的时间比什么都多。所以每件让我产生满足感的工作,每个让我感动的程序,都会被我一直记住。刚好写小说的过程中,想想有什么东西是可以写的,就联想到了~