找回密码
 立即注册
搜索
查看: 31|回复: 0

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

[复制链接]

2万

主题

0

回帖

6万

积分

管理员

积分
63937
发表于 2025-4-14 21:07:13 | 显示全部楼层 |阅读模式
参考文献:

前言:

大神以 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[y][i]) {
如果 com.mans[map[y][i]].my 不等于 my ,那么就将 [i,y] 推入 d 中 。
                        break
                }else{
                        d.push([i,y])       
                }
        }
        //右侧检索
        for (var i=x+1; i <= 8; i++){
                if (map[y][i]) {
                        if (com.mans[map[y][i]].my!=my) d.push([i,y]);
                        break
                }else{
                        d.push([i,y])       
                }
        }
        //上检索
        for (var i = y-1 ; i >= 0; i--){
                if (map[i][x]) {
如果 com.mans[map[i][x]].my 不等于 my ,那么 d 就会被 push 一个包含 [x, i] 的元素。
                        break
                }else{
                        d.push([x,i])       
                }
        }
        //下检索
        for (var i = y+1 ; i<= 9; i++){
                if (map[i][x]) {
                        if (com.mans[map[i][x]].my!=my) d.push([x,i]);
                        break
                }else{
                        d.push([x,i])       
                }
        }
        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[y][i]与d.push([i][y])

向左方向进行搜索,y 坐标保持不变,x 坐标依次遍历,这些体现在地图(map)当中。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|【远见汇智】 ( 京ICP备20013102号-17 )

GMT+8, 2025-5-5 23:17 , Processed in 0.076774 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表