定式
下一步當將定式保存到數據庫中,如布局中的代碼所示,但其初始的代碼更有利於理解。以小飛掛為例:
// 0 // + 0 0 // + // // + List<Pos> P_LuStar_UpFlyOne { get { var temp = new List<Pos>(); temp.Add(new Pos(3, 3)); // 第一步:左上星 temp.Add(new Pos(2, 5)); // 第二步:小飛掛 temp.Add(new Pos(5, 2)); // 第三步:小飛守 temp.Add(new Pos(1, 3)); // 第四步:小飛進角 temp.Add(new Pos(2, 2)); // 第五步:三三守 temp.Add(new Pos(2, 8)); // 第六步:拆二 return temp; } }
具體使用,可參照 Board.Pattern.cs 的完整代碼,其關鍵點,一個是四角八變換,一個是棋子顏色的控制。
布局
嚴格說,應稱作全局,但保留布局這個說法,因為它的作用並沒改變,其著眼點仍然是布局。這是顯而易見的,你不可能整局棋都按著保存的棋譜進行。Board.Layout.cs 開頭的注釋說的比較清楚,復制如下:
/** * Board.Layout.cs (c) 2015 by x01 * ------------------------------- * 1.有了定式打基礎,布局也就順理成章了。基本上是一個路數, * 只是第一步需調整到(3,3)位,方便變換而已。 * 2.暫只考慮二連星。任他多路來,我只一路去,這相當合理。 * 3.將數據庫中保存的棋譜導出添加到 Layouts 中,對局足夠多足夠好時, * 棋力大進是可以預期的。 * 4.本只准備保存布局的幾步棋,但忽然發現保存整盤棋是有意義的,尤其對付 * gnu-go 時,因為 gnu-go 對相同棋形的反應也相同,這就為戰勝它提供了 * 可能。以二連星對二連星為例,保存 200 到 2000 黑先勝 gnu-go 的棋譜 * 到數據庫中,然後以此來對付 gnu-go,當有取勝的可能。此猜想並沒驗證, * 因為即使 200 到 2000 局棋,也需約 200 到 2000 小時方可完成。很顯然, * 沒有那麼多時間去驗證其可行性。 * 5.棋形處理較弱,而不按定式布局走棋時,又不得不倚靠棋形處理, * 看來,棋形處理才是真正的關鍵。而要處理好棋形,不僅僅是棋形的問題, * 還有大小,死活,全局相關等諸多問題需要解決。 */
代碼下載鏈:https://github.com/chinax01/x01.Weiqi