Re: [程式] 怎麼判斷五子棋的棋型?
程式寫出來了
因為算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
→
10/19 00:16, , 1F
10/19 00:16, 1F
貼一下運算結果:
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)
推
10/19 02:04, , 2F
10/19 02:04, 2F
→
10/19 12:28, , 3F
10/19 12:28, 3F
推
10/20 02:02, , 4F
10/20 02:02, 4F
→
10/20 03:56, , 5F
10/20 03:56, 5F
推
10/20 05:26, , 6F
10/20 05:26, 6F
→
10/20 05:27, , 7F
10/20 05:27, 7F
推
10/20 05:30, , 8F
10/20 05:30, 8F
→
10/20 12:02, , 9F
10/20 12:02, 9F
推
10/20 16:23, , 10F
10/20 16:23, 10F
→
10/20 16:24, , 11F
10/20 16:24, 11F
→
10/20 18:59, , 12F
10/20 18:59, 12F
討論串 (同標題文章)
完整討論串 (本文為第 3 之 3 篇):
程式
3
30