看板 GameDesign 關於我們 聯絡資訊
程式寫出來了 因為算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