如果是人机对下则难度鄙人认为相当大,如果是人人对仪应该不是很难。通过网络人机对仪也不是很难。楼主应该先说一说自己的思路,之后大家讨论。
我觉得既可以用Applet也可以用CS模式进行设计,建议用CS模式,如联众

解决方案 »

  1.   

    应该把你的思路先讲出来。要做什么样的东西。就像楼上说的。
    设计人机对战程序,对算法要求很高,前期的设计构架也很重要。
    网络对战的大体可分c/s和b/s结构。
      

  2.   

    zlhlj2000(QA)能解决人机对仪吗,那可真是高手啊,能否将算法告知一二
      

  3.   

    My Email: [email protected]
    注:我不要源代码,将机器的算法发给我就OK,如果有,1000分送上。
      

  4.   

    昨天晚上做的决定,于是晚上睡觉前,睡觉后就都没闲着.但大多在思考,没有些多少
    实际的完整代码.总体思路如下:1.由applet实现.2.当前目标,不具备网络功能(其实就相当于一个打谱程序),类似的例子如:  http://www.flygo.net/wqjz/mingjuxj/guli_wj_gl_lch.html
      
      着重解决"围棋本身"的问题,如规则算法等.3.最终目标,添加保存/读取棋谱功能,有自己的文件格式;添加网络功能实现网上
      人人对弈(不牵涉任何人机对弈,那是个世界级难题呀:).
      

  5.   

    study_body(珍惜每一天),欢迎加入,一起努力,谢谢了
      

  6.   

    没有问题,我没有QQ
    MSN:[email protected]
    不过我可不是围棋的爱好者,对围棋的规则只知道一些,不过我觉得这个程序用不了多长时间,不过一旦考虑到网络,就不是很容易,应该有断线后自动重新建立连接功能,如何使速度更快,要尽可能的减少网络上数据的传输量。一使那些用56K猫的人也能玩。最好在开发前有一个比较全面系统的设计。
      

  7.   

    当前问题:  1.初始化(可视化界面,相关变量,对象的建立与赋初值)  2.下棋与悔棋(首先要牵涉到许多绘图技巧,其中悔棋是难点,思考后觉得应该用到链表,
        具体实现想用数组模拟链表,这需要师兄们的指点)
      
      3.吃子,个人认为这是问题的核心.昨晚一晚没睡好,可觉得实在世很难:(  现在希望能在悔棋,吃子算法上得到一些思路.一些基本变量:int stepSize;  //棋盘格步进长度;
    int boardSize; //棋盘格线数,使用者通过这个变量改变棋盘大小
    int baseX,baseY; //"画"棋盘时的顶点坐标
    int [][]boardArr; //棋盘数组. 0-此点为空 1-黑子 2-白字 3-打劫点(0,1,2很确定,3犹豫中
      //是考虑到具体游戏规则)
    int count;     //记录落子步数.init() { //初始化界面 for(int i=0;i<boardSize;i++)
       for(int j=0;j<boardSize; j++)
    boardArr[i][j] = 0;
           .........
           
           for(............)
              g.drawLine(...........);
           for(............)
              g.drawLine(...........);
    }
    我想把count和boardArr[][]联立,也就是知道一个count值得时候,也同时知道了一个和他唯一对应
    的boardArr[][]值,这在写悔棋程序的时候应该会有很大用处,这应该是个链表吧,请教具体该怎么写.
      

  8.   

    最难的是吃子算法,昨晚又看了好久的数据结构.还是没想出太好的办法,可能是这个问题太具体了.今天又想了好久,排除了些幼稚的想法.大概有了个可行的思路,如下:1.首先,建立一个"块"的概念.这需要对围棋规则具备简单了解.也就是说,被吃掉的子总是认为它是一个"块"的部分,可能一个块只包含一个子,也可能同时有好几个块被吃掉.2.何谓块:两两棋子(同色)之间,在上下左右临近的四个坐标中,x,y坐标之一相同,另一个相邻为1.如:a(x,y),b(x,y+1),则a.b两点属于同一个"块".3.每落一子,都检查该子是否该"加入"某个块,或是否把某些块连成一个块了,否则自己开辟一个新块.4.每落一子,都检查该子所属的当前"块"的"气",如遍历块中每颗子,相邻交叉点值(boardSize[x][y])无一等于 0,吃之.现在迷惑于是不是该建立一个如"块数组"的东东,是建一个块就建立一个块数组,更新一个块就更新一个块数组.还是每次落子才建立块,然后判断其各种状态.请指教,如果思路根本就不好,不对,或有更好的思路,还请指出,谢过:)
      

  9.   

    我又看了一下围棋规则,哎平时很少玩围棋,下面谈谈我的想法:
    其实我的理解是这样,当某一方下棋子的时候首先比较重要要判断下面这样几个问题:
    1-》该位置是否有其它棋子
    2-》该位置是否在棋盘上
    3-》该位置是否为死眼
    4-》将该棋子放入该位置以后是否吃掉了对方的棋子
    下面对上面的问题谈谈我的想法:
    1,2-》就不说了
    3-》判断步骤如下:
    3。1首先判断四周是否都是对方的棋子(非常简单,不说了)
    3。2其次就是判断如果将棋子放入该位置,则与该位置的棋子相联的棋子的周围是否有空格,如果与该位置相连的任何一个棋子的四方的四个位置都不为空格则该位置为死眼,反之,如果与该位置相连的棋子中,只要查找到某个棋子与该位置相连且四周至少有一个空格,则该位置不是死眼。因此算法如下:
    int i=0
    For 对于棋盘的每一行
     For 对于棋盘的每一列
       IF 该位置为自己一方的棋子 并且 该位置与当前下棋位置连接
          IF 该位置的四方至少有一个空格
             不是死眼
             i=1
          END IF
       END IF
     End for
    end ior
    IF i==1 是死眼4->是否围住对方棋子
    4.1 如果与该位置临近的四个位置中都没有对方棋子则没有围住对方棋子
    4.2 对于与该位置相临近的每个对方棋子,判断与该位置相连接的任何对方棋子的临近四个位置是否有空格,如果有则没有围住对方棋子,反之则围住了对方棋子,算法同判断是否是死眼类似。所以判断是否为死眼或者是否为对方棋子的关键问题是判断任何两个棋子之间是否存在连接的问题,算法如下:对于每个棋子来说有四个方向:上下左右
    可以利用数据结构中的树的算法,采用广度或者深度优先搜索,我的想法如下:
    从某个位置开始:
       首先判断上方是否有与该位置相连接的自己方的棋子,如果有则一直向上直到找到最上方的棋子,当然在这个过程中要将每一个已经访问过的棋子标记一下,如果,还要对有分支的旗子进行特殊标记,比如在向上找棋子的过程中发现某个棋子的左方或者右方也有自己的棋子则需要将该位置做特殊标记。
       找到最上方的棋子以后之后,判断最上方的棋子的左边是否为自己方的棋子如果是则在该位置继续向上搜索,如果不是,则判断右方是否为自己方棋子。说了这么多主要原则,如果上面有就向上,否则向左,再否则向右,再否则向下,如果都没有则回到前面作过特殊标记的棋子继续上述原则,因为每个访问过的棋子都做了标记,因此遇到访问过的棋子当作没有棋子或者为对方棋子处理都可以,可以用堆栈的方式实现,建议看看有关数据结构方面的书籍,我说的也不一定对,仅仅提供参考。
      

  10.   

    有什么问题可以一起讨论,也可以给我发邮件,地址如下:
    [email protected]
      

  11.   

    两位果然是高手。我是一位java的初学者,不过对其很感兴趣,我看了上面两位的思路,佩服。
      

  12.   

    不急写代码吧,而且和java本身也没有什么关系,先设计好!
      

  13.   

    其实我上面的算法时间复杂度太高,应该将我与楼主的算法进行综合
    步骤如下:
    1》合并色块
    2》判断死眼
    3》判断吃子
    1》合并色块
       当下一个棋子到A点是,判断A点的临近四个位置是否有同色棋子,如果没有则,单独成块,否则,将临近的同色旗子所在的色块合并成一个色块,之后将A位置的棋子加入色块。
    2》判断死眼
       如果A位置的周围都是对方棋子则为死眼
       如果A位置的周围有空格则不是死眼
       否则,判断A所在的色块的任何一个旗子的临近棋子是否为空格,如果有则不是死眼,反之则是死眼。
    3》判断吃子
       如果A的临近位置没有对方棋子则不可能吃子,否则判断临近的对方棋子所在的色块所包含的任何一个棋子的临近位置是否有空格,如果有则不能吃子,反之则可以吃子。
      

  14.   

    这几天事比较多很少来csdn,见谅呀.虽然很少来发问,但却看了很多资料,参考了一些不错的代码,还有jdk的帮助原来也是那样的好.现在除打劫外围棋功能已基本实现,还有就是吃子的代码有点问题,子落在右或下边界时会出现问题. study_body(珍惜每一天) :
    下面的网络功能似乎是你的强项了,呵呵
    有现成的思路了么?
      

  15.   

    http://member.isavvix.com/regoing/go/index.jsp上面的连接可以看到程序现在地执行情况.
      

  16.   

    http://202.118.100.116/go/index.html如需要我把代码发给你,现在我在找吃子的毛病,整理一下发给你?
      

  17.   

    好的没有问题,网络方面的问题我先在这里简单谈谈我的思想,首先要在服务器端建立一个Server,使每个Applet启动以后与该Server通信,将吃子信息发送到Server上面,再由server将该信息转发到另一个Applet上面,总之Server是两个Applet之间的桥梁。另外Applet应支持自动重新连接功能。这可以启动一个后线程来实现。
      

  18.   

    我想问一下,这个围棋程序的网络功能因该怎样定位.
    如用什么模式,如何实现等,我这方面的东西知道的太少了,该找一些什么样的资料来看呢.
    我想向games.263.net的围棋靠拢,因为至少他的前端也是applet,不知是否可行,或是难度过于大了.请指教.
      

  19.   

    你跟我说的那个bug具体在那里?我更新了一下,再看看:http://202.118.100.116/index.htm
      

  20.   

    applet的围棋最有名的国内就是263了,不知可否借鉴
      

  21.   

    http://202.118.100.116/index.htm又增加了些功能