aizixun8 发表于 2025-4-14 21:07:13

AI象棋-象棋ai网站-象棋ai网站

参考文献:

前言:

大神以 html5+js 撰写了关于象棋 AI 的博客,此博客重点阐述了棋子的着法,以及自己设计的评估函数和简单的理论,并未具体讲解搜索算法,本文是对该原文的学习与分析补充。

一,棋子的着法

创建一个数组,用于存储该棋子处于某一点时所能走到的着点,即 com.bylaw ={}

(1)车:

<p><pre>    <code class="language-javascript">com.bylaw.c 是一个函数,它接受 x、y、map 和 my 作为参数。
        var d=[];
左侧检索时,如果存在棋子并且颜色不同,就将其 push 过去并结束循环;如果不存在棋子或者颜色相同,就一步步 push 。<span style="color:#ff0000;"> </span>
        for (var i=x-1; i>= 0; i--){
                if (map) {
如果 com.mans].my 不等于 my ,那么就将 推入 d 中 。
                        break
                }else{
                        d.push()       
                }
        }
        //右侧检索
        for (var i=x+1; i <= 8; i++){
                if (map) {
                        if (com.mans].my!=my) d.push();
                        break
                }else{
                        d.push()       
                }
        }
        //上检索
        for (var i = y-1 ; i >= 0; i--){
                if (map) {
如果 com.mans].my 不等于 my ,那么 d 就会被 push 一个包含 的元素。
                        break
                }else{
                        d.push()       
                }
        }
        //下检索
        for (var i = y+1 ; i<= 9; i++){
                if (map) {
                        if (com.mans].my!=my) d.push();
                        break
                }else{
                        d.push()       
                }
        }
        return d;
}</code></pre></p>
算法分析:

向上、向下、向左、向右四个方向分别进行搜索。若找到一个点,且该点颜色与车这个棋子不同(即敌对棋子),那么就把该点的坐标记录在 d 数组中。若某一方向上没有其他棋子,就把这一方向上的所有坐标都记录在 d 数组中。简单来说,就是把以车这个棋子为中心的十字上的坐标都记录在 d 数组中。

前提补充:

1,代码中的map:

<p><pre>    <code class="language-javascript">com.initMap = [
["C0", "M0", "X0", "S0", "J0", "S1", "X1", "M1", "C1"] 包含了多个不同的元素,分别有 C0、M0、X0、S0、J0、S1、X1、M1 和 C1 。
[具体内容 1, 具体内容 2, 具体内容 3, 具体内容 4, 具体内容 5, 具体内容 6, 具体内容 7, 具体内容 8, 具体内容 9]
[某个内容, 'P0', 某个内容, 某个内容, 某个内容, 某个内容, 某个内容, 'P1', 某个内容]
        [    ,    ,    ,    ,    ,    ,    ,    ,    ],
        [    ,    ,    ,    ,    ,    ,    ,    ,    ],
[某个内容, 'p0', 某个内容, 某个内容, 某个内容, 某个内容, 某个内容, 'p1', 某个内容]
        [    ,    ,    ,    ,    ,    ,    ,    ,    ],
['c0', 'm0', 'x0', 's0', 'j0', 's1', 'x1', 'm1', 'c1'] 分别是一些不同的元素或标识,它们各自具有特定的含义和用途。其中 'c0' 有其独特性,'m0' 也有其自身的特点,'x0' 同样有其特定的意义,'s0' 、'j0' 也不例外,'s1' 、'x1' 、'm1' 、'c1' 也都在相应的情境中发挥着作用。
];</code></pre></p>
这里的字符串代表每个棋子的key值:

<p><pre>    <code class="language-javascript">设定每类棋子的 key 值。
        "c0":"c","c1":"c",
        "m0":"m","m1":"m",
        "x0":"x","x1":"x",
        "s0":"s","s1":"s",
        "j0":"j",
        "p0":"p","p1":"p",
"z0"为"z","z1"为"z","z2"为"z","z3"为"z","z4"为"z","z5"为"z"
       
        "C0":"C","C1":"C",
        "M0":"M","M1":"M",
        "X0":"X","X1":"X",
        "S0":"S","S1":"S",
        "J0":"J",
        "P0":"P","P1":"P",
Z0 为 Z,Z1 为 Z,Z2 为 Z,Z3 为 Z,Z4 为 Z,Z5 为 Z。
}</code></pre></p>
2,my:

标记值:红色方由人操纵,标记值为 1 ;AI 的标记值为 -1 。

3,map与d.push()

向左方向进行搜索,y 坐标保持不变,x 坐标依次遍历,这些体现在地图(map)当中。
页: [1]
查看完整版本: AI象棋-象棋ai网站-象棋ai网站