作者LaPass (LaPass)
看板GameDesign
标题Re: [程式] 怎麽判断五子棋的棋型?
时间Fri Oct 18 23:54:05 2013
程式写出来了
因为算block算到头昏,就动用暴力去解决了
使用的方式是..... 递回求解
function
{
int[] m=取得中岛的大小();
/*
像下面红色这种,在中央的我方棋子,我叫她中岛
XXOOO OO
*/
if(中岛大小>5) //大於五颗
{
if(允许长连) return new Ans(5, 2);
//传回连成五子的CODE
else return new Ans(0, 0);
//传回被挡住
}
else if(中岛大小==5)
//刚好五颗
{
return new Ans(5, 2);
//传回连成五子
}
else
//四子三子二子一子通通在这边判断
{
Ans[] a=new Ans[2];
//两边分边检查
for(左边/右边)
{
int 中岛边界=取得中岛该边的边界;
//如果该边是空白,很好,没被阻挡,尝试落子。
if(中岛边界往外推一格 == 空白)
{
//在该空白点落子,建立下一节点
Counter next=new Counter(落子後新的节点);
//递回并记录答案
a[左边/右边]=next.递回呼叫同一方法;
}
else
//被阻挡,传回block
{
a[左边/右边]=new Ans(0, 0);
}
}
//排序,a[0] 要比 a[1] 大,如果一样大就比气的数目
if(a[1].land>a[0].land||(a[0].land==a[1].land&&a[1].lift>a[0].lift))
{
Ans tp=a[0];
a[0]=a[1];
a[1]=tp;
}
//两边都被挡,没棋
if(a[0].land==0) return new Ans(0, 0);
//两边下下去都形成五子的局面,就是活四
if(a[0].land==5&&a[1].land==5)return new Ans(4, 2);
//只有一边下下去五子,就是死四
if(a[0].land==5&&a[1].land!=5)return new Ans(4, 1);
//其他状况,把棋型-1後传回
return new Ans(a[0].land-1,a[0].lift);
}
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.41.98.199
1F:→ ddavid:XD 10/19 00:16
贴一下运算结果:
o 我方
x 敌方或是墙壁
这是落子点
↓
:o:oo [3:2] [3:2]
o o :o: o o [3:2] [3:2]
oo o :o: o oo [3:2] [3:1]
oo :o: oo [3:1] [3:1]
ooo :o: ooo [3:1] [0:0]
oo :o: oo [3:2] [3:1]
x o:o:o x [3:1] [3:1]
x o:o:o [3:2] [3:2]
oo o:o:o [4:1] [3:1]
ooo :o: oooo [4:2] [4:1]
ooo :o: oooo [4:2] [4:1]
ooo o:o:o ooo [4:2] [0:0]
※ 编辑: LaPass 来自: 114.41.98.199 (10/19 00:42)
2F:推 ddavid:0 1 2就是没棋、死(活一边)、活对吧 10/19 02:04
3F:→ LaPass:没错~ 10/19 12:28
4F:推 bleed1979:把例子对棋盘跑K&R会比recurive快吗?似乎可试试 10/20 02:02
5F:→ LaPass:请问K&R是什麽? 10/20 03:56
6F:推 bleed1979:抱歉我写错了。字串比对KMR Algorithm。 10/20 05:26
7F:→ bleed1979:意思是如果把每个例子当成pattern去跑棋盘的字串比对 10/20 05:27
8F:推 bleed1979:不过五子棋可以斜角延伸,比对上可能会较麻烦。 10/20 05:30
9F:→ LaPass:也还好,因为回圈可以这样跑 for(int i=0,j=0;略;i++,j++) 10/20 12:02
10F:推 ddavid:不不,连j都不用啊,你有i就好,因为你斜角加或减的值一样 10/20 16:23
11F:→ ddavid:所以座标用(x+i, y+i), (x+i, y-i)等等的去套就好XD 10/20 16:24
12F:→ LaPass:写好了,正在做WEB的UI~ 10/20 18:59