如题,自己只会写人与人,不知如何写电脑下棋.
在CSDN上搜了一些,看到有一篇大概意思是弄一个三维数组来存储棋盘某位置的重要程度.
但我还是不太明白,麻烦讲解一下好吗?如何才能得出该位置是最重要的(即应该下在该处)只要大家告诉我如何实现电脑方如何判断并下子(思路或给点简单例子)就行了,不考虑禁手什么的.
我分数不是很多,又有许多问题还要请教大家,所以给的分数不多.望见谅!!谢谢!!!

解决方案 »

  1.   

    恩,偶这次去一家公司就是写了那个程序给他们看的,你看一下人工智能方面的知识,对于问题求解分为基于知识库系统和基于评价函数系统,简单一点的五子棋可以使用基于评价函数系统,那是通过构件一棵博亦树,然后通过回溯的方法来实现,但是五子棋比较复杂,所以说想要用一个评价函数把智能写的很高不容易,好一点的办法就是通过对知识库的模式匹配方法来实现,这样如果你今后想对程序进行智能的升级,只要扩充知识库就行,非常的方便。C++代码
    int model[][9]={//-1表示任意,1表示相同颜色,0表示不是2表示(x,y)所在位置
               //。
                 {-1,-1,1,1,2,1,1,-1,-1},//11*11 出现活4 1000分     {-1,-1,-1,0,2,1,1,1,0},//_*111_ 出现活3 500分
                   }
    当你知识库进行模式匹配的时候,就要保证1比2的分值高,因为1再走一步就赢了,这个时候计算机就会选择分值最高的方案,比如上述情况,如果棋盘中两重情况都存在的话,应该选择方案1并再*的位置落子,自然就赢了。至于怎样才能将知识库做的完美,那就不是一个程序员能完成的了, 找一个五子棋高手和你配合吧,好运。
      

  2.   

    先谢谢各位!
    我不明的地方
    1:为什么要用3维数组,而不是用2维数组。例如: important[15][15]来分别存储X与Y轴坐标,分别判断横、竖、左斜、右斜的重要程序并累加就好。
    2:我明白重要程度的意思,只是不知哪个才是最重要,即哪个条件要加多值,哪个条件可少加一点,哪个条件反而要扣减值。例如:在一个值为空的(即还没有下子)的地方判断各个方向的子,这时如果隔壁有自己的子要加多少值(即自己可能先完成五子的),而如果隔壁是对方子又要加多少值(阻止对方先完成五子),而如果隔壁是边界了要扣多少值(即这个位置不太重要)。
    就是不明白哪个才是最重要的,这应该是跟下棋的功力有关。
      

  3.   

    另外请教 strangeProgramer(strangeProgramer) 好一点的办法就是通过对知识库的模式匹配方法来实现我较菜,看不太明白,能通过例子或讲通俗一点吗?谢谢!
      

  4.   

    TO:strangeProgramer(strangeProgramer)
    再硬着头皮仔细看了您的代码,比刚才明白了一点点,是不是
    {-1,-1,1,1,2,1,1,-1,-1},//11*11 出现活4 1000分{-1,-1,-1,0,2,1,1,1,0},//_*111_活3 500分
    分别是知识库的内容,即先预先设定的判断条件,而我们要做的就是扩充其知识库的判断条件。
    然后每个点再分别在这个知识库中寻找分值最高即最重要的条件来落子
      

  5.   

    棋类虽然具体实现可能不一样,但是大概的思想是差不多的,反正我是用2维数组来实现的,然后横竖斜遍历points数组,对每个points[i][j]=0既没有落子的点进行模式匹配,然后对棋盘内锝15*15个点进行评分,然后把三次的分求和,比如你再(2,2)横向点出现了活3,的500分,同时再(6,8)点横向和纵向同时出现了活三,应该的1000分,因为双3自然比单活3价值高,但是如果你再(10,9)点出现了活4,你应该给那一点打5000分,反正一定要保证别的点无论怎么相加也不能超过他。当然没必要对所有15*15个点进行匹配,一般在匹配之前还要做第一论筛选,简单一点的办法就是对有子附近的地方进行遍历,比如你第一步走(9,9)只要遍历7<=i<=11 7<=j<=11的格子就可以了,