如果是人机对下则难度鄙人认为相当大,如果是人人对仪应该不是很难。通过网络人机对仪也不是很难。楼主应该先说一说自己的思路,之后大家讨论。
我觉得既可以用Applet也可以用CS模式进行设计,建议用CS模式,如联众
我觉得既可以用Applet也可以用CS模式进行设计,建议用CS模式,如联众
解决方案 »
- a和b 交换 不用第三变量的方法 进来看
- 奇怪的数组对象输出。
- 关于一道JAVA作业,麻烦各位帮忙看看,很急!!!谢谢
- 怎么修改下面代码,重绘小三角形,是小三角形能水平移动和垂直移动,呵呵!
- 关于时间格式转换的问题
- 四字节的数组转化为float的问题
- 急求jspsmartupload.zip 能否给发一个 谢谢!
- 高手请进,分值可观!ResultSet 问题,在线等待,及时结贴!
- 线程问题:小的ResultSet可以并发运行,大的就不行了,可能是什么原因?
- 哥们我要跳槽了,离开深圳这个榨取人脂人膏的公司
- 怎么做这个GUI呢?哥哥们帮帮忙。
- JAVA 应用程序\小程序中能不能运行其它程序(.EXE)的 如果能请问应该怎样调用?
设计人机对战程序,对算法要求很高,前期的设计构架也很重要。
网络对战的大体可分c/s和b/s结构。
注:我不要源代码,将机器的算法发给我就OK,如果有,1000分送上。
实际的完整代码.总体思路如下:1.由applet实现.2.当前目标,不具备网络功能(其实就相当于一个打谱程序),类似的例子如: http://www.flygo.net/wqjz/mingjuxj/guli_wj_gl_lch.html
着重解决"围棋本身"的问题,如规则算法等.3.最终目标,添加保存/读取棋谱功能,有自己的文件格式;添加网络功能实现网上
人人对弈(不牵涉任何人机对弈,那是个世界级难题呀:).
MSN:[email protected]
不过我可不是围棋的爱好者,对围棋的规则只知道一些,不过我觉得这个程序用不了多长时间,不过一旦考虑到网络,就不是很容易,应该有断线后自动重新建立连接功能,如何使速度更快,要尽可能的减少网络上数据的传输量。一使那些用56K猫的人也能玩。最好在开发前有一个比较全面系统的设计。
具体实现想用数组模拟链表,这需要师兄们的指点)
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[][]值,这在写悔棋程序的时候应该会有很大用处,这应该是个链表吧,请教具体该怎么写.
其实我的理解是这样,当某一方下棋子的时候首先比较重要要判断下面这样几个问题:
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 对于与该位置相临近的每个对方棋子,判断与该位置相连接的任何对方棋子的临近四个位置是否有空格,如果有则没有围住对方棋子,反之则围住了对方棋子,算法同判断是否是死眼类似。所以判断是否为死眼或者是否为对方棋子的关键问题是判断任何两个棋子之间是否存在连接的问题,算法如下:对于每个棋子来说有四个方向:上下左右
可以利用数据结构中的树的算法,采用广度或者深度优先搜索,我的想法如下:
从某个位置开始:
首先判断上方是否有与该位置相连接的自己方的棋子,如果有则一直向上直到找到最上方的棋子,当然在这个过程中要将每一个已经访问过的棋子标记一下,如果,还要对有分支的旗子进行特殊标记,比如在向上找棋子的过程中发现某个棋子的左方或者右方也有自己的棋子则需要将该位置做特殊标记。
找到最上方的棋子以后之后,判断最上方的棋子的左边是否为自己方的棋子如果是则在该位置继续向上搜索,如果不是,则判断右方是否为自己方棋子。说了这么多主要原则,如果上面有就向上,否则向左,再否则向右,再否则向下,如果都没有则回到前面作过特殊标记的棋子继续上述原则,因为每个访问过的棋子都做了标记,因此遇到访问过的棋子当作没有棋子或者为对方棋子处理都可以,可以用堆栈的方式实现,建议看看有关数据结构方面的书籍,我说的也不一定对,仅仅提供参考。
[email protected]
步骤如下:
1》合并色块
2》判断死眼
3》判断吃子
1》合并色块
当下一个棋子到A点是,判断A点的临近四个位置是否有同色棋子,如果没有则,单独成块,否则,将临近的同色旗子所在的色块合并成一个色块,之后将A位置的棋子加入色块。
2》判断死眼
如果A位置的周围都是对方棋子则为死眼
如果A位置的周围有空格则不是死眼
否则,判断A所在的色块的任何一个旗子的临近棋子是否为空格,如果有则不是死眼,反之则是死眼。
3》判断吃子
如果A的临近位置没有对方棋子则不可能吃子,否则判断临近的对方棋子所在的色块所包含的任何一个棋子的临近位置是否有空格,如果有则不能吃子,反之则可以吃子。
下面的网络功能似乎是你的强项了,呵呵
有现成的思路了么?
如用什么模式,如何实现等,我这方面的东西知道的太少了,该找一些什么样的资料来看呢.
我想向games.263.net的围棋靠拢,因为至少他的前端也是applet,不知是否可行,或是难度过于大了.请指教.