JavaScript中国象棋程序(3) 您所在的位置:网站首页 象棋走棋步骤 JavaScript中国象棋程序(3)

JavaScript中国象棋程序(3)

2024-07-14 12:23| 来源: 网络整理| 查看: 265

“JavaScript中国象棋程序” 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序。这是教程的第3节。

程序的最终效果点击这里查看。

这一系列共有9个部分:

0、JavaScript中国象棋程序(0)- 前言 1、JavaScript中国象棋程序(1)- 界面设计 2、JavaScript中国象棋程序(2)- 校验棋子走法  3、JavaScript中国象棋程序(3)- 电脑自动走棋 4、JavaScript中国象棋程序(4)- 极大极小搜索算法 5、JavaScript中国象棋程序(5)- Alpha-Beta搜索 6、JavaScript中国象棋程序(6)- 克服水平线效应、检查重复局面 7、JavaScript中国象棋程序(7)- 置换表 8、JavaScript中国象棋程序(8)- 进一步优化

 

这一节,程序将可以自动行棋。但仅仅是走了一步符合象棋规则的棋,电脑智商为0。

3.1、帅(将)的走法生成

 

使用一个辅助数值表示这4个方向:

var KING_DELTA = [-16, -1, 1, 16];

已知帅在一维棋局数组中的起点位置sqSrc。生成帅的走法,就是获取帅全部的合法终点sqDes。使用一个数组存储所有可能的走法,伪代码如下:

for (var i = 0; i < 4; i ++) { // 将的4个方向 var sqDst = sqSrc + KING_DELTA[i]; // 得到一个可能的终点位置 if (该位置不位于九宫中) { // 该走法不合法,执行下一轮循环 continue; } var pcDst = 终点位置的棋子;     // 如果终点位置没有棋子,那么pcDst=0 if (pcDst不是本方棋子) { 走法合法,保存到步骤数组中 } } 3.2、仕的走法生成

 

同样使用辅助数组表示仕的4个方向:

var ADVISOR_DELTA = [-17, -15, 15, 17];

生成仕的走法,伪代码如下:

for (var i = 0; i < 4; i ++) {      // 仕的4个方向 var sqDst = sqSrc + ADVISOR_DELTA[i]; // 得到一个可能的终点位置 if (该位置不位于九宫中) { // 该走法不合法,执行下一轮循环 continue; } var pcDst = 终点棋子;          // 如果终点位置没有棋子,那么pcDst=0 if (pcDst不是本方棋子) { 走法合法,保存到步骤数组中 } } 3.3、象的走法生成

我们并不用设置一个类似[-34, -30, 30, 37]的数组保存象的方向。因为仕的方向,跟象眼的方向一致。仕方向的二倍,就是象的方向。

生成象的走法,伪代码如下:

for (var i = 0; i < 4; i ++) { // 象的4个方向 var sqDst = sqSrc + ADVISOR_DELTA[i]; // 获得象眼的位置 if (象眼不在棋盘上,或者象眼位置已过河,或者象眼存在棋子) { // 位置不合法,执行下一轮循环 continue; } sqDst += ADVISOR_DELTA[i];     // 得到一个可能的终点位置 var pcDst = 终点位置的棋子     // 如果终点位置没有棋子,那么pcDst=0 if (pcDst不是本方棋子) { 走法合法,保存到步骤数组中 } } 3.4、马的走法生成

用辅助数组表示马的方向:

KNIGHT_DELTA = [[-33, -31], [-18, 14], [-14, 18], [31, 33]];

对应马腿的4个方向,与帅的4个方向是一样的。

生成马的走法,伪代码如下:

for (var i = 0; i < 4; i ++) {      // 马腿的4个方向 var sqDst = sqSrc + KING_DELTA[i];  // 得到一个马腿的位置 if (马腿位置存在棋子) { continue; } for (var j = 0; j < 2; j ++) { // 1个马腿对应2个马的方向 sqDst = sqSrc + KNIGHT_DELTA[i][j]; // 得到一个马的可能的终点位置 if (该位置不在棋盘上) { continue; } var pcDst = 终点位置的棋子; // 如果终点位置没有棋子,那么pcDst=0 if (pcDst不是本方棋子) { 走法合法,保存到步骤数组中 } } } 3.5、车的走法生成

 

车的方向与帅的方向相同,只不过车可以连续走下去。

生成车的走法,伪代码如下:

for (var i = 0; i < 4; i ++) { var delta = KING_DELTA[i]; // 得到一个方向 var sqDst = sqSrc + delta; // 从起点sqSrc开始,沿着方向delta走一步 while (sqDst在棋盘上) { var pcDst = sqDst位置的棋子; if (pcDst == 0) { // sqDst位置上根本就没有棋子 走法合法,保存到步骤数组中 } else { if (pcDst是对方的棋子) { 走法合法,保存到步骤数组中 } // 已经遇到了对方棋子,终止循环 break; } sqDst += delta; // 沿着方向delta向前走一步 } } 3.6、炮的走法生成

炮的走法与车类似,但炮遇到一个棋子后,可以越过去,也就是翻山,并吃掉一个对方棋子。

生成炮的走法,伪代码如下:

for (var i = 0; i < 4; i ++) { var delta = KING_DELTA[i]; // 得到一个方向 var sqDst = sqSrc + delta; // 从起点sqSrc开始,沿着方向delta走一步 while (sqDst在棋盘上) { var pcDst = sqDst位置的棋子; if (pcDst == 0) { // sqDst位置上根本就没有棋子 走法合法,保存到步骤数组中 } else { // 终点存在棋子,炮需要翻山 break; } sqDst += delta; // 沿着方向delta向前走一步 } sqDst += delta; // 沿着方向delta向前走一步 while (IN_BOARD(sqDst)) { // 如果sqDst仍位于棋盘,那么此时炮已经翻山了 var pcDst = sqDst位置的棋子; if (pcDst > 0) { // 炮翻山后遇到了一个棋子 if (pcDst是对方棋子) { 走法合法,保存到步骤数组中 } // 炮翻山后,不管遇到的是对方棋子,还是己方棋子,都要结束对当前方向的搜索 break; } sqDst += delta; } } 七、兵的走法生成

 

红兵和黑卒向前走的方向是不一样的,分别是-16和16。在上一节,我们已经介绍了下面的函数:

// sp是棋子位置,sd是走棋方(红方0,黑方1)。返回兵(卒)向前走一步的位置。 function SQUARE_FORWARD(sq, sd) { return sq - 16 + (sd


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有