论文部分内容阅读
【摘要】本文主要工作是围绕藏棋游戏中较为流行的藏棋之一“王宫双门棋”,论述了“王宫双门棋”游戏编程中对棋盘表示、棋子落点、棋盘坐标选取等方面的技巧探索。
【关键词】王宫双门棋;棋盘表示;棋子落点
The related technique investigate in the “palace double door chess” game plait distance
Hang Ying
【Abstract】This text is main work is around hide in the chess game more popular of hide a“palace double door chess” of the chess, discuss“palace double door chess” game plait distance in mean to the chessboard, the pawn fall point, the chessboard sit a mark selection etc. of technique investigate.
【Key words】Palace double door chess;The chessboard mean;The pawn fall a point
当今,国际象棋、中国象棋、围棋号称世界三大棋种。其中,以中国象棋和围棋为主要代表的这些棋类游戏在中国可以说是源远流长。
传统藏棋是一种在藏族地区广为流行的传统游戏方式,而以黑白子在纵横交错的棋盘上应对的盘上游戏为多种。其中,“密芒”是藏族棋类游戏中历史最悠久、最具影响的游戏种类,类似围棋下法,故亦称“藏围棋”。除“密芒”之外,藏区还流行着多种藏棋,如:王宫多门棋、六子棋、手鼓棋等。其中,主要流行的藏棋是:王宫多门棋,也称为围王棋。王宫多门棋有分为:王宫独门棋、王宫双门棋和王宫四门棋三种。
图1 “王宫独门棋”棋盘 图2 “王宫双门棋”棋盘 图3 “王宫四门棋”棋盘
本文主要研究藏棋中的“王宫双门棋”,因此,归纳“王宫双门棋”的规则具体如下:
1. 棋盘和棋子
1.1 棋盘。
“王宫双门棋”棋盘由九道横线、五道纵线和六道斜线交叉组成。棋盘上共有37个交叉点,棋子就摆放和活动在这些交叉点上,棋盘两端三角形区域叫做“王宫”。
1.2 棋子。
“王宫双门棋”棋子共有二十六个,分为黑、白两种,黑子2个,白子24个。
2. 走棋和吃子
2.1 对弈。
在开局时,2个黑子和8个白子放在棋盘固定的位置上,由黑子先走,双方轮流各走一着,直至分出胜负为止。
2.2 棋子的走法。
黑子:黑子不吃子时,每次移动一步,当吃子时必须跳吃。
白子:待黑子每移动一步,白子落一子,待16个子全部落完后,所有白子开始移动,每次移动一步。
2.3 吃子。
黑子吃白子:即黑子与白子相邻时,在这两子所处的直线上白子相邻的位置无子时,黑子可跳过该白子到达无子的空位,则该白子被吃;白子不能吃黑子,只能将黑子围住。
3. 胜负
若黑子吃掉7个以上白子,并且有黑子可以移动,则判定黑方胜;若黑子吃掉白子不足7个,且两个黑子都无处可走,则判定白方胜。
3.1 “王宫双门棋”棋盘的表示技巧。
棋盘表示就是使用一种数据结构来描述棋盘及棋盘上的棋子,以方便计算机处理。一般说来,这与具体的棋类知识密切相关。通常,最典型的方式是使用一个二维字节数组来描述棋盘及棋盘上的棋子信息。例如,中国象棋的棋盘是使用一个 9×10 的二维数组来表示。棋盘的数据表示直接影响到程序的时间及空间复杂度。
从棋子的角度考虑,如果把棋盘看成是一个平面坐标系,可以知道每一个棋子的位置信息,包含一个横坐标和一个纵坐标。因为在棋盘上最多有26个棋子,所以可以用一个有26个字节的一维数组表示所有26个棋子的位置,其中每个字节的高4位表示该棋子的横坐标,低4位表示该棋子的纵坐标。而已经被吃掉的棋子用坐标范围以外的数表示。这样整个棋盘信息就被装进了这26个字节当中。
上面介绍的两种棋盘表示方法:一是做一个棋盘数组(每个元素记录棋子的类型);二是做一个棋子数组(每个元素记录棋子的位置)。如果一个程序同时使用这两个数组,那么获得棋子的类型和棋子的位置都可以在常数时间内完成。这就是“棋盘-棋子联系数组”,此数组可以定义为:
struct PositionStruct {
int Squares[90]; //数组下标表示棋盘的位置,数组元素的值记录该位置棋子的类型
int Pieces[32]; //数组下标表示棋子的类型,数组元素的值记录该位置棋子的位置
};
藏棋棋盘与其他博弈类的棋盘不同,大多数成不规则棋盘,如:“王宫双门棋”的棋图除横竖线以外,还有斜线,以及棋图周围会有表示王宫的三角图形构成。
对于“王宫双门棋”而言,在其棋盘上有9行5列,棋子分为黑白两种,黑子2个,白子24个,共26个。按照“棋盘-棋子联系数组”的技术原则,可以定义两个数组:Squares[45]和Pieces[26]。在图2“王宫双门棋”棋位编号中,红色位置为无效位置,如果该棋位位置是无效的,则存放-1表示无效的棋位位置。
“王宫双门棋”棋位位置的编号如图2所示,棋位编号是一维的,范围从0号棋位到44号棋位,从上到下,从左到右依次编号。如图2所示,总共45个棋位位置。
在计算机处理中,位运算比一般的加减乘除及取余运算快很多,如果能在寻找棋子和定位棋子上使用位运算代替加减乘除和取余,这将在很大程度上提高运算速度。基于这种想法,人们把“棋盘-棋子联系数组”进行扩展:把棋盘做成16×16的大小,这样得到行号可以用16除(右移4位),得到列号可以对16取余(和15进行与运算),这比取整取余操作要快得多。
20世纪60年代末前苏联的KAISSA项目组提出比特棋盘。它用64位数表示一个棋子的位置每个位置用一个比特位表示。使用时先利用数据库技术把棋子在某一位置可以到达的位置用一个比特棋盘保存,求合法走法时只需要先根据具体的局势计算得到不可走的比特棋盘,然后与可走的比特棋盘与运算即可得到合法的走法。
图2 “王宫双门棋”棋位编号 图3
为了借鉴比特棋盘的思想,人们在不断探索中形成了位行位列技术。它以“位”的形式记录棋盘上某一行所有的格子的状态(仅仅指是否有子),就称为“位行”(BitRank),与之对应的是“位列”(BitFile)。
对于“王宫双门棋”,在其棋盘上有9行5列,那么,棋盘结构应该包含9个位行和5个位列,即:
struct PositionStruct {
……
unsigned short wBitFiles[16];
unsigned short wBitRanks[16];
……
};
值得注意的是,它仅仅是棋盘的附加信息,“棋盘-棋子联系数组”仍旧是必不可少的。
“王宫双门棋”中的黑子着法分为吃白子和不吃白子两种,这两种着法生成器原则上是分开的,因此分为黑子不吃白子、黑子吃白子两个部分。不吃白子的着法可以沿着上下、左右和斜线八条射线逐一生成(即并列做8个循环)。我们感兴趣的是吃白子的着法。是否能吃子(暂时不管吃到的是黑子还是对方白子),只取决于它所在的行和列上的每个格子上是否有棋子,而跟棋子的颜色无关,因此这些信息完全反映在位行和位列中。
因此,移走或放入一颗棋子时,必须在位行和位列上置位:
void AddPiece(int Square, int Piece) {
……
x = Square % 16;
y = Square / 16;
wBitFiles[x]= 1 << (y - 3);
wBitRanks[y]= 1 << (x - 3);
……
}
3. 棋盘中棋子的落点问题
在“王宫双门棋”的棋盘上,有9行5列,共9×5=45个点,棋子的落点编号如图3所示,该编号是一维的,范围从0到44,从上到下,从左到右依次编号,总共45个编号。在这45个点上有8个点是不能落子的,图3中红色的点表示不能落子的8个点,因此,棋盘上有37个点可以落子。
对于黑子而言,满足下列情况的点可以成为落点:
① 与该黑子坐标距离绝对值为1的空白点(即:横、纵方向上的相邻点)——黑子在横纵方向上的落子情况;
② 与该黑子坐标距离绝对值为 的空白点(即:斜方向上的相邻点)——黑子在斜方向上的落子情况;
③ 在与该黑子坐标距离绝对值为1的点上为白子时,与该黑子坐标距离绝对值为2的空白点(即:横、纵方向上的隔点)——黑子在横纵方向上的吃子情况;
④ 在与该黑子坐标距离绝对值为 的点上为白子时,与该黑子坐标距离绝对值为2 的空白点(即:斜方向上的隔点)——黑子在斜方向上的吃子情况;
对于白子而言,满足下列情况的点可以成为落点:
①与该白子坐标距离绝对值为1的空白点(即:横、纵方向上的相邻点)——白子在横纵方向上的落子情况;
②与该白子坐标距离绝对值为 的空白点(即:斜方向上的相邻点)——白子在斜方向上的落子情况;
总之,不论是黑子还是白子,只要满足各自的落子条件,就是合理的落点。但要在这些合理的落点中找到最优落点,需要算法支持。
“王宫双门棋”中,白子不可以吃黑子,只能围住黑子,让其无路可走,从而达到取胜的目的。因此,在棋盘上,黑子所处的位置不同,将其围住所需要的白子的数目也就不同。
在图4中:
(1)如果黑子在①或②号位置,则需要16个白子才能将黑子围住;
(2)如果黑子在③号位置,则需要12个白子才能将黑子围住;
(3)如果黑子在④号位置,则需要10个白子才能将黑子围住;
(4)如果黑子在⑤号位置,则需要8个白子才能将黑子围住;
(5)如果黑子在⑥号位置,则需要7个白子才能将黑子围住;
(6)如果黑子在棋盘中间矩形区域的边界其他位置,则需要5~6个白子就能将黑子围住;
(7)如果黑子在棋盘两端的王宫中,则只需要4~5个白子就能将黑子围住。
综上所述,在棋盘上,黑子所处的位置不同,需要白子将其围住的数目也就不同。可见,在图4所示的棋盘中①、②、③号等位置是非常重要的几个棋位。因此,无论黑子还是白子,在着法过程中棋子的位置对于游戏的全局有着非常大的影响作用。
4. 棋盘坐标选取的技巧探索
公元1637年前,法国数学家笛卡尔受到了经纬度的启发,创立了直角坐标系,把相互对立着的“数”与“形”统一了起来。通过对坐标表示法的研究,我们可以考虑藏棋游戏编程中棋盘坐标选取的问题。
图4 “王宫双门棋”棋子特殊落点
国际象棋、中国象棋和围棋号称世界三大棋种。在围棋程序中,我国习惯采用古法坐标,按汉字-数字对表示,且纵先横后,如(三、4)表示棋盘底起上数三行,再自左向右数四列。这种表示法虽是承袭传统,但少有围棋程序采用。
现代围棋程序流行的坐标表示法,是按字母-数字对表示,先横后纵,而日本法则采用古法自上而下排列。
综上所述,棋类游戏中坐标一般选择棋盘左下角为坐标系原点或左上角为坐标系原点,以棋盘的行为坐标系的x轴,自左向右,以棋盘上的每个小格作为一个坐标单位,从0开始标记;以棋盘的列为坐标系的y轴,自下向上,以棋盘上的每个小格作为一个坐标单位,从0开始标记。例如,将中国象棋棋盘看作一个坐标系,以左下角为坐标系原点,棋盘的行和列分别为坐标系的x轴和y轴,以棋盘上的每个小格作为一个坐标单位,分别绘制棋盘的横线、竖线、将帅区以及河界。
对于“王宫双门棋”而言,由于棋盘是一种对称图形。而且,基于该棋的游戏特点,棋盘中心点对于黑白双方都是非常重要的一个占据点。所以,我们考虑将棋盘中心点作为坐标系原点。
在编程时,先对所有棋子进行编号,棋盘上的内容使用数组来标记,数组的下标表示棋盘上的位置(坐标),如果当前位置上有棋子则该数组元素的值为该棋子的编号,否则为0。每走完一步修改数组内容。我们从棋盘左上角出发,向右逐行搜索,当遇到一个黑子时,以它为中心向左挨个查找,如果遇到白子则记录然后继续,如果再遇到白子或边界就停止查找;如果遇到空白点则考虑落子,左边完成后再向右进行同样的操作;最后把左右两边的记录合并起来,得到的数据就是该点横向上的棋型,而其他几个方向的棋型也可用同样的方法得到,当搜索完整张棋盘后,就可以得到所有可以落白子的空白点,最后再根据算法判断落在哪个点上是最优的。
本文围绕藏棋游戏中较为流行的藏棋之一“王宫双门棋”,展开了对“王宫双门棋”游戏编程中技巧的探索,填补了藏族棋类游戏相关研究的空白。通过对有关游戏界面、棋局表示、棋子落点等方面的技巧的研究,希望能够为藏棋游戏未来的系统研究提供基础。
参考文献
[1] 游贵荣. 游戏搜索算法中估价函数的构造策略. 福建商业高等专科学校学报,2005.12.
[2] 张玉宏, 刘运通, 李涛. 智能搜索算法在棋类零和博弈中的应用. 科技咨询导报,2006,No.18.
[3] 王小春 编著. PC游戏编程(人机博弈). 重庆大学出版社, 2002.5.
[4] 雷超然, 罗勋阳等编著. Visual C++ MFC 棋牌类游戏编程实例. 人民邮电出版社,2008.7.
[5] 张颖, 李祖枢. 棋类计算机博弈系统的主要研究方法及在六子棋上的应用. 重庆工学院学报,2008年9月,第22卷第9期.
[6] 更境.“密芒”围棋棋盘的发现. 中国西藏CHINA'S TIBET,2001,第四期.
收稿日期:2010-09-02
【关键词】王宫双门棋;棋盘表示;棋子落点
The related technique investigate in the “palace double door chess” game plait distance
Hang Ying
【Abstract】This text is main work is around hide in the chess game more popular of hide a“palace double door chess” of the chess, discuss“palace double door chess” game plait distance in mean to the chessboard, the pawn fall point, the chessboard sit a mark selection etc. of technique investigate.
【Key words】Palace double door chess;The chessboard mean;The pawn fall a point
当今,国际象棋、中国象棋、围棋号称世界三大棋种。其中,以中国象棋和围棋为主要代表的这些棋类游戏在中国可以说是源远流长。
传统藏棋是一种在藏族地区广为流行的传统游戏方式,而以黑白子在纵横交错的棋盘上应对的盘上游戏为多种。其中,“密芒”是藏族棋类游戏中历史最悠久、最具影响的游戏种类,类似围棋下法,故亦称“藏围棋”。除“密芒”之外,藏区还流行着多种藏棋,如:王宫多门棋、六子棋、手鼓棋等。其中,主要流行的藏棋是:王宫多门棋,也称为围王棋。王宫多门棋有分为:王宫独门棋、王宫双门棋和王宫四门棋三种。
图1 “王宫独门棋”棋盘 图2 “王宫双门棋”棋盘 图3 “王宫四门棋”棋盘
本文主要研究藏棋中的“王宫双门棋”,因此,归纳“王宫双门棋”的规则具体如下:
1. 棋盘和棋子
1.1 棋盘。
“王宫双门棋”棋盘由九道横线、五道纵线和六道斜线交叉组成。棋盘上共有37个交叉点,棋子就摆放和活动在这些交叉点上,棋盘两端三角形区域叫做“王宫”。
1.2 棋子。
“王宫双门棋”棋子共有二十六个,分为黑、白两种,黑子2个,白子24个。
2. 走棋和吃子
2.1 对弈。
在开局时,2个黑子和8个白子放在棋盘固定的位置上,由黑子先走,双方轮流各走一着,直至分出胜负为止。
2.2 棋子的走法。
黑子:黑子不吃子时,每次移动一步,当吃子时必须跳吃。
白子:待黑子每移动一步,白子落一子,待16个子全部落完后,所有白子开始移动,每次移动一步。
2.3 吃子。
黑子吃白子:即黑子与白子相邻时,在这两子所处的直线上白子相邻的位置无子时,黑子可跳过该白子到达无子的空位,则该白子被吃;白子不能吃黑子,只能将黑子围住。
3. 胜负
若黑子吃掉7个以上白子,并且有黑子可以移动,则判定黑方胜;若黑子吃掉白子不足7个,且两个黑子都无处可走,则判定白方胜。
3.1 “王宫双门棋”棋盘的表示技巧。
棋盘表示就是使用一种数据结构来描述棋盘及棋盘上的棋子,以方便计算机处理。一般说来,这与具体的棋类知识密切相关。通常,最典型的方式是使用一个二维字节数组来描述棋盘及棋盘上的棋子信息。例如,中国象棋的棋盘是使用一个 9×10 的二维数组来表示。棋盘的数据表示直接影响到程序的时间及空间复杂度。
从棋子的角度考虑,如果把棋盘看成是一个平面坐标系,可以知道每一个棋子的位置信息,包含一个横坐标和一个纵坐标。因为在棋盘上最多有26个棋子,所以可以用一个有26个字节的一维数组表示所有26个棋子的位置,其中每个字节的高4位表示该棋子的横坐标,低4位表示该棋子的纵坐标。而已经被吃掉的棋子用坐标范围以外的数表示。这样整个棋盘信息就被装进了这26个字节当中。
上面介绍的两种棋盘表示方法:一是做一个棋盘数组(每个元素记录棋子的类型);二是做一个棋子数组(每个元素记录棋子的位置)。如果一个程序同时使用这两个数组,那么获得棋子的类型和棋子的位置都可以在常数时间内完成。这就是“棋盘-棋子联系数组”,此数组可以定义为:
struct PositionStruct {
int Squares[90]; //数组下标表示棋盘的位置,数组元素的值记录该位置棋子的类型
int Pieces[32]; //数组下标表示棋子的类型,数组元素的值记录该位置棋子的位置
};
藏棋棋盘与其他博弈类的棋盘不同,大多数成不规则棋盘,如:“王宫双门棋”的棋图除横竖线以外,还有斜线,以及棋图周围会有表示王宫的三角图形构成。
对于“王宫双门棋”而言,在其棋盘上有9行5列,棋子分为黑白两种,黑子2个,白子24个,共26个。按照“棋盘-棋子联系数组”的技术原则,可以定义两个数组:Squares[45]和Pieces[26]。在图2“王宫双门棋”棋位编号中,红色位置为无效位置,如果该棋位位置是无效的,则存放-1表示无效的棋位位置。
“王宫双门棋”棋位位置的编号如图2所示,棋位编号是一维的,范围从0号棋位到44号棋位,从上到下,从左到右依次编号。如图2所示,总共45个棋位位置。
在计算机处理中,位运算比一般的加减乘除及取余运算快很多,如果能在寻找棋子和定位棋子上使用位运算代替加减乘除和取余,这将在很大程度上提高运算速度。基于这种想法,人们把“棋盘-棋子联系数组”进行扩展:把棋盘做成16×16的大小,这样得到行号可以用16除(右移4位),得到列号可以对16取余(和15进行与运算),这比取整取余操作要快得多。
20世纪60年代末前苏联的KAISSA项目组提出比特棋盘。它用64位数表示一个棋子的位置每个位置用一个比特位表示。使用时先利用数据库技术把棋子在某一位置可以到达的位置用一个比特棋盘保存,求合法走法时只需要先根据具体的局势计算得到不可走的比特棋盘,然后与可走的比特棋盘与运算即可得到合法的走法。
图2 “王宫双门棋”棋位编号 图3
为了借鉴比特棋盘的思想,人们在不断探索中形成了位行位列技术。它以“位”的形式记录棋盘上某一行所有的格子的状态(仅仅指是否有子),就称为“位行”(BitRank),与之对应的是“位列”(BitFile)。
对于“王宫双门棋”,在其棋盘上有9行5列,那么,棋盘结构应该包含9个位行和5个位列,即:
struct PositionStruct {
……
unsigned short wBitFiles[16];
unsigned short wBitRanks[16];
……
};
值得注意的是,它仅仅是棋盘的附加信息,“棋盘-棋子联系数组”仍旧是必不可少的。
“王宫双门棋”中的黑子着法分为吃白子和不吃白子两种,这两种着法生成器原则上是分开的,因此分为黑子不吃白子、黑子吃白子两个部分。不吃白子的着法可以沿着上下、左右和斜线八条射线逐一生成(即并列做8个循环)。我们感兴趣的是吃白子的着法。是否能吃子(暂时不管吃到的是黑子还是对方白子),只取决于它所在的行和列上的每个格子上是否有棋子,而跟棋子的颜色无关,因此这些信息完全反映在位行和位列中。
因此,移走或放入一颗棋子时,必须在位行和位列上置位:
void AddPiece(int Square, int Piece) {
……
x = Square % 16;
y = Square / 16;
wBitFiles[x]= 1 << (y - 3);
wBitRanks[y]= 1 << (x - 3);
……
}
3. 棋盘中棋子的落点问题
在“王宫双门棋”的棋盘上,有9行5列,共9×5=45个点,棋子的落点编号如图3所示,该编号是一维的,范围从0到44,从上到下,从左到右依次编号,总共45个编号。在这45个点上有8个点是不能落子的,图3中红色的点表示不能落子的8个点,因此,棋盘上有37个点可以落子。
对于黑子而言,满足下列情况的点可以成为落点:
① 与该黑子坐标距离绝对值为1的空白点(即:横、纵方向上的相邻点)——黑子在横纵方向上的落子情况;
② 与该黑子坐标距离绝对值为 的空白点(即:斜方向上的相邻点)——黑子在斜方向上的落子情况;
③ 在与该黑子坐标距离绝对值为1的点上为白子时,与该黑子坐标距离绝对值为2的空白点(即:横、纵方向上的隔点)——黑子在横纵方向上的吃子情况;
④ 在与该黑子坐标距离绝对值为 的点上为白子时,与该黑子坐标距离绝对值为2 的空白点(即:斜方向上的隔点)——黑子在斜方向上的吃子情况;
对于白子而言,满足下列情况的点可以成为落点:
①与该白子坐标距离绝对值为1的空白点(即:横、纵方向上的相邻点)——白子在横纵方向上的落子情况;
②与该白子坐标距离绝对值为 的空白点(即:斜方向上的相邻点)——白子在斜方向上的落子情况;
总之,不论是黑子还是白子,只要满足各自的落子条件,就是合理的落点。但要在这些合理的落点中找到最优落点,需要算法支持。
“王宫双门棋”中,白子不可以吃黑子,只能围住黑子,让其无路可走,从而达到取胜的目的。因此,在棋盘上,黑子所处的位置不同,将其围住所需要的白子的数目也就不同。
在图4中:
(1)如果黑子在①或②号位置,则需要16个白子才能将黑子围住;
(2)如果黑子在③号位置,则需要12个白子才能将黑子围住;
(3)如果黑子在④号位置,则需要10个白子才能将黑子围住;
(4)如果黑子在⑤号位置,则需要8个白子才能将黑子围住;
(5)如果黑子在⑥号位置,则需要7个白子才能将黑子围住;
(6)如果黑子在棋盘中间矩形区域的边界其他位置,则需要5~6个白子就能将黑子围住;
(7)如果黑子在棋盘两端的王宫中,则只需要4~5个白子就能将黑子围住。
综上所述,在棋盘上,黑子所处的位置不同,需要白子将其围住的数目也就不同。可见,在图4所示的棋盘中①、②、③号等位置是非常重要的几个棋位。因此,无论黑子还是白子,在着法过程中棋子的位置对于游戏的全局有着非常大的影响作用。
4. 棋盘坐标选取的技巧探索
公元1637年前,法国数学家笛卡尔受到了经纬度的启发,创立了直角坐标系,把相互对立着的“数”与“形”统一了起来。通过对坐标表示法的研究,我们可以考虑藏棋游戏编程中棋盘坐标选取的问题。
图4 “王宫双门棋”棋子特殊落点
国际象棋、中国象棋和围棋号称世界三大棋种。在围棋程序中,我国习惯采用古法坐标,按汉字-数字对表示,且纵先横后,如(三、4)表示棋盘底起上数三行,再自左向右数四列。这种表示法虽是承袭传统,但少有围棋程序采用。
现代围棋程序流行的坐标表示法,是按字母-数字对表示,先横后纵,而日本法则采用古法自上而下排列。
综上所述,棋类游戏中坐标一般选择棋盘左下角为坐标系原点或左上角为坐标系原点,以棋盘的行为坐标系的x轴,自左向右,以棋盘上的每个小格作为一个坐标单位,从0开始标记;以棋盘的列为坐标系的y轴,自下向上,以棋盘上的每个小格作为一个坐标单位,从0开始标记。例如,将中国象棋棋盘看作一个坐标系,以左下角为坐标系原点,棋盘的行和列分别为坐标系的x轴和y轴,以棋盘上的每个小格作为一个坐标单位,分别绘制棋盘的横线、竖线、将帅区以及河界。
对于“王宫双门棋”而言,由于棋盘是一种对称图形。而且,基于该棋的游戏特点,棋盘中心点对于黑白双方都是非常重要的一个占据点。所以,我们考虑将棋盘中心点作为坐标系原点。
在编程时,先对所有棋子进行编号,棋盘上的内容使用数组来标记,数组的下标表示棋盘上的位置(坐标),如果当前位置上有棋子则该数组元素的值为该棋子的编号,否则为0。每走完一步修改数组内容。我们从棋盘左上角出发,向右逐行搜索,当遇到一个黑子时,以它为中心向左挨个查找,如果遇到白子则记录然后继续,如果再遇到白子或边界就停止查找;如果遇到空白点则考虑落子,左边完成后再向右进行同样的操作;最后把左右两边的记录合并起来,得到的数据就是该点横向上的棋型,而其他几个方向的棋型也可用同样的方法得到,当搜索完整张棋盘后,就可以得到所有可以落白子的空白点,最后再根据算法判断落在哪个点上是最优的。
本文围绕藏棋游戏中较为流行的藏棋之一“王宫双门棋”,展开了对“王宫双门棋”游戏编程中技巧的探索,填补了藏族棋类游戏相关研究的空白。通过对有关游戏界面、棋局表示、棋子落点等方面的技巧的研究,希望能够为藏棋游戏未来的系统研究提供基础。
参考文献
[1] 游贵荣. 游戏搜索算法中估价函数的构造策略. 福建商业高等专科学校学报,2005.12.
[2] 张玉宏, 刘运通, 李涛. 智能搜索算法在棋类零和博弈中的应用. 科技咨询导报,2006,No.18.
[3] 王小春 编著. PC游戏编程(人机博弈). 重庆大学出版社, 2002.5.
[4] 雷超然, 罗勋阳等编著. Visual C++ MFC 棋牌类游戏编程实例. 人民邮电出版社,2008.7.
[5] 张颖, 李祖枢. 棋类计算机博弈系统的主要研究方法及在六子棋上的应用. 重庆工学院学报,2008年9月,第22卷第9期.
[6] 更境.“密芒”围棋棋盘的发现. 中国西藏CHINA'S TIBET,2001,第四期.
收稿日期:2010-09-02