作者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
→ 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)
推 ddavid:0 1 2就是沒棋、死(活一邊)、活對吧 10/19 02:04
→ LaPass:沒錯~ 10/19 12:28
推 bleed1979:把例子對棋盤跑K&R會比recurive快嗎?似乎可試試 10/20 02:02
→ LaPass:請問K&R是什麼? 10/20 03:56
推 bleed1979:抱歉我寫錯了。字串比對KMR Algorithm。 10/20 05:26
→ bleed1979:意思是如果把每個例子當成pattern去跑棋盤的字串比對 10/20 05:27
推 bleed1979:不過五子棋可以斜角延伸,比對上可能會較麻煩。 10/20 05:30
→ LaPass:也還好,因為迴圈可以這樣跑 for(int i=0,j=0;略;i++,j++) 10/20 12:02
推 ddavid:不不,連j都不用啊,你有i就好,因為你斜角加或減的值一樣 10/20 16:23
→ ddavid:所以座標用(x+i, y+i), (x+i, y-i)等等的去套就好XD 10/20 16:24
→ LaPass:寫好了,正在做WEB的UI~ 10/20 18:59