最近在学delphi,于是选择用五子棋入门,可在大家的指点下只写出了匹配模式的简单人机对战,且不能悔棋!
我是用image2.Canvas.Draw(x,y,image1.Picture.Graphic);的方法画棋的,
image1为棋子,image2为棋盘
1.请问如何实现悔棋,我想用另外一个数组先记录每次下子前的棋局情况,悔棋时可恢复,但是画下了的棋子不知如何消除?
2.请问五子棋的预测方法,我原先仅用匹配模式,觉得棋力很差,看了CSDN的一些文章,说是用预测法才不会掉进人类的陷阱.
但我对预测方法理解得不深,是否轮到电脑下时,先对棋局进行评分,然后选出最高分的一点模拟下子,形成新的棋局,再根据新的棋局进行第二次评分,然后选出新棋局(第二次评分)的最高分来真实下子.我的分数不多,还有许多问题想要请教大家,以上两个问题不敢求各位贴出源码,只求给个思路或讲解(给一点小例子就行)
不胜感激!

解决方案 »

  1.   

    TO:lencon(深秋叙)
    觉得走棋不能搞画图,应该将现有的图片进行移动,清除即移开去
    ______________________________________________
    不太可能吧,五子棋有15*15 ,不会得用200多图片吧.
    而我用画图只要黑白棋分别一个图就好呀
    TO chllhc(Ben)
    那麻烦你讲讲思路,也好让我等学习一下嘛~
    TO piantang(菠菜汤)
    我也有想过记录位置,然后重画,但觉得比较麻烦,不知有没有更好的方法.
      

  2.   

    五子棋是一个比较好的入门系统.悔棋的话有以下两种方案,1.使用队列链表,这样每下一次,就加入队列,不论正方反方.加入后如果悔棋的话,就弹出一个元素,del了它,然后刷新棋盘就行了.
    2.不用队列,用数组,因为棋盘上的点是固定的.最多能摆多少个棋子就申请多少个元素.按照队列操作这个数组.基本同上.预测的话,我不太明白你的意思.你是要人和机器下吗?
    五子棋的算法主要是带权值的搜索.
    比如说对方的棋子已经有三个连成一条线的.那么必须在它的两端下一个棋子.那么,两端落棋子的点就是10分,那么如果有四个棋子连成一条线,一端已经有了自己的棋子,那么你要在另一段落一个棋子,这样他才赢不了.这个点记50分.评价一下棋盘上所有可下棋的点的分数,找出分最高的把棋子落下就行了.如过你想写一个无敌的程序的话,那么你可以试试广度优先搜索,不过那很慢要在算法方面多做优化,在状态空间的表示上也要多下工夫,才能写出来.本人推荐你使用第一中计算方法,毕竟快很多.不过要合理打分才能百战百胜利!!!
      

  3.   

    好像2年前我在csdn上公布过我的五子棋代码,后来又升级过一次!
      

  4.   

    步骤用数组记录下来即可;其实也有更简单的办法,比如 Tab[15*15] ,15行*15列,所有落点都保存到这里,包括Draw的过程是通过这个记录来画的,那么回退一步就等于 TAB[15*15-1] ,也就是少绘制最后一位,依次类推;
    AI的算法有很简单的,比如评分算法,按15*15最大获胜组合来遍历棋盘,根据子的数目给予一个评分值,最后寻找评分点最高的落点。要支持AI的五子棋代码(delphi 7)的给我发email : mailluck at gmail dot com
      

  5.   

    TO:coolbacon(编程浪子) 
    先谢谢您了.我刚学Delphi,以前学校只教过C,也没学过数据结构之类的.
    你说的悔棋方案1的队列链表我完全不知道该如何操作.
    至于方案2用数组,是否就和上面的先用一个数组例如Tab[15][15]在下子前保存当前棋盘形式,要悔棋时重新把棋局恢复成Tab,然后重新用Draw根据棋局形式来画黑白棋.预测方面我目前就是用这个匹配方式,我是搜索每个空点(还没下子),然后以该点为中心,把左边四格和右边四格即一共九格作为字符进行匹配以此来加分.然后同样把竖,左上至右下,右上至左下也分别算分,然后得出这一空格的总分.(也就和你的方法一样)但这样感觉有点被动,好像没有AI,听说能用递归之类的方法预测?
      

  6.   

    TO: S.F.(吃青春饭的)
    也谢谢您了!
    是否你的意思也是最终必须根据棋局来重新画棋子?
    难得大哥您肯给我源码,我这就发邮件!!
      

  7.   

    TO chllhc(Ben) 
    我也想学呀,只是面对琳琅满目的书藉,不知要买哪本好呀~
    也麻烦您推荐一下!
      

  8.   

    to ufo 你的邮件我还没收到;这样吧,直接留个email;我晚上回家给你发