国际象棋皇后的走法和吃法图解(皇后如何巧妙地横扫棋盘,将对手一网打尽)

国际象棋是一种在棋盘上玩的双人战略棋盘游戏,棋盘格式为 64 格,排列在 8×8 网格中。有人无聊的时候会找电脑下国际象棋,但也有人无聊了会教电脑下棋。

国际象棋皇后的走法和吃法图解

国际象棋可以说是最棒的棋盘游戏之一,它是战略战术和纯技术的完美融合。每位玩家开局时各有 16 枚棋子:一王、一后、两车、两马、两象和八兵,各具不同功能与走法。真人对弈可以凭借玩家的经验,步步为营。那么,对于一个机器——计算机,你该如何教会它下棋?近日,有人在 medium 上发表了一篇文章,详细解释了如何教计算机玩国际象棋。

本文将从 5 个方面进行介绍:

  • board 表示;
  • board 评估;
  • 移动选择;
  • 测试 ai;
  • 接口测试。

在开始之前,你只需要提前安装 python3。

board 表示

国际象棋皇后的走法和吃法图解

首先,你需要对棋子背后的逻辑进行编码,即为每个棋子分配每一次可能的合法移动。

python-chess 库为我们提供了棋子的移动生成和验证,简化了工作,安装方式如下:

!pipinstall python-chess

python-chess 库安装好后,导入 chess 模块并进行初始化:

import chessboard = chess.board()board

在 notebook 中的输出如下所示:

国际象棋皇后的走法和吃法图解

board 对象是一个完整的 board 表示,该对象为我们提供了一些重要的函数,例如,board.is_checkmate() 函数检查是否存在将杀(checkmate),board.push() 函数附加一个移动,board.pop() 函数撤销最后一次移动等。阅读完整的文档请参阅:https://python-chess.readthedocs.io/en/latest/

board 评估

为了对 board 进行初步评估,必须考虑一位大师在各自比赛中的想法。

国际象棋皇后的走法和吃法图解

我们应该想到的一些要点是:

  • 避免用一个小棋子换三个兵;
  • 象总是成对出现;
  • 避免用两个小棋子换一辆车和一个兵。

将上述要点以方程形式进行表达:

  • 象 3 个兵 马 3 个兵;
  • 象 马;
  • 象 + 马 车 + 兵。

通过化简上述方程,可以得到:象 马 3 个兵。同样,第三个方程可以改写成:象 + 马 = 车 + 1.5 个兵,因为两个小棋子相当于一个车和两个兵。

国际象棋皇后的走法和吃法图解

使用 piece square table 来评估棋子,在 8x8 的矩阵中设置值,例如在国际象棋中,在有利的位置设置较高的值,在不利的位置设置较低的值。

例如,白色国王越过中线的概率将小于 20%,因此我们将在该矩阵中将数值设置为负值。

再举一个例子,假设皇后希望自己被放在中间位置,因为这样可以控制更多的位置,因此我们将在中心设置更高的值,其他棋子也一样,因为国际象棋都是为了保卫国王和控制中心。

理论就讲这些,现在我们来初始化 piece square table:

pawntable = knightstable = bishopstable = rookstable = queenstable = kingstable = 

通过以下四种方法得到评估函数:

第一步检查游戏是否还在继续。

这个阶段的背后编码逻辑是:如果它在 checkmate 时返回 true,程序将会检查轮到哪方移动。如果当前轮到白方移动,返回值为 - 9999,即上次一定是黑方移动,黑色获胜;否则返回值为 + 9999,表示白色获胜。对于僵局或比赛材料不足,返回值为 0 以表示平局。

代码实现方式:

if board.is_checkmate(): if board.turn: return -9999 else: return 9999if board.is_stalemate(): return 0if board.is_insufficient_material(): return 0

第二步,计算总的棋子数,并把棋子总数传递给 material 函数。

wp = len(board.pieces(chess.pawn, chess.white))bp = len(board.pieces(chess.pawn, chess.black))wn = len(board.pieces(chess.knight, chess.white))bn = len(board.pieces(chess.knight, chess.black))wb = len(board.pieces(chess.bishop, chess.white))bb = len(board.pieces(chess.bishop, chess.black))wr = len(board.pieces(chess.rook, chess.white))br = len(board.pieces(chess.rook, chess.black))wq = len(board.pieces(chess.queen, chess.white))bq = len(board.pieces(chess.queen, chess.black))


第三步,计算得分。material 函数得分的计算方法是:用各种棋子的权重乘以该棋子黑白两方个数之差,然后求这些结果之和。而每种棋子的得分计算方法是:该棋子在该游戏实例中所处位置的 piece-square 值的总和。

material = 100 * (wp - bp) + 320 * (wn - bn) + 330 * (wb - bb) + 500 * (wr - br) + 900 * (wq - bq)pawnsq = sum( for i in board.pieces(chess.pawn, chess.white)])pawnsq = pawnsq + sum( for i in board.pieces(chess.pawn, chess.black)])knightsq = sum( for i in board.pieces(chess.knight, chess.white)])knightsq = knightsq + sum( for i in board.pieces(chess.knight, chess.black)])bishopsq = sum( for i in board.pieces(chess.bishop, chess.white)])bishopsq = bishopsq + sum( for i in board.pieces(chess.bishop, chess.black)])rooksq = sum( for i in board.pieces(chess.rook, chess.white)])rooksq = rooksq + sum( for i in board.pieces(chess.rook, chess.black)])queensq = sum( for i in board.pieces(chess.queen, chess.white)])queensq = queensq + sum( for i in board.pieces(chess.queen, chess.black)])kingsq = sum( for i in board.pieces(chess.king, chess.white)])kingsq = kingsq + sum( for i in board.pieces(chess.king, chess.black)])


第四步,计算评价函数,此时将会返回白棋的 material 得分和各棋子单独得分之和。

eval = material + pawnsq + knightsq + bishopsq + rooksq + queensq + kingsqif board.turn: return evalelse: return -eval
国际象棋皇后的走法和吃法图解

评价函数流程图

移动选择

算法的最后一步是用 minimax 算法中的 negamax 实现进行移动选择,minimax 算法是双人游戏(如跳棋等)中的常用算法。之后使用 alpha-beta 剪枝进行优化,这样可以减少执行的时间。

现在让我们深入研究一下 minimax 算法。该算法被广泛应用在棋类游戏中,用来找出失败的最大可能性中的最小值。该算法广泛应用于人工智能、决策论、博弈论、统计和哲学,力图在最坏的情况下将损失降到最低。简单来说,在游戏的每一步,假设玩家 a 试图最大化获胜几率,而在下一步中,玩家 b 试图最小化玩家 a 获胜的几率。

为了更好地理解 minimax 算法,

国际象棋皇后的走法和吃法图解

维基百科中 minimax 树举例

为了得到更好的结果,使用 minimax 变体 negamax,因为我们只需要一个最大化两位玩家效用的函数。不同点在于,一个玩家的损失等于另一个玩家的收获,反之亦然。

就游戏而言,给第一个玩家的位置值和给第二个玩家的位置值符号是相反的。

国际象棋皇后的走法和吃法图解

negamax 示例

首先,我们将 alpha 设为负无穷大,beta 设为正无穷大,这样两位玩家都能以尽可能差的分数开始比赛,代码如下:

except: bestmove = chess.move.null() bestvalue = -99999 alpha = -100000 beta = 100000 for move in board.legal_moves: board.push(move) boardvalue = -alphabeta(-beta, -alpha, depth - 1) if boardvalue bestvalue: bestvalue = boardvalue bestmove = move if (boardvalue alpha): alpha = boardvalue board.pop() return bestmove

下面让我们以流程图的方式来解释:

国际象棋皇后的走法和吃法图解

search 函数的流程图

下一步是进行 alpha-beta 的剪枝来优化执行速度。

国际象棋皇后的走法和吃法图解

来自维基百科的 alpha-beta 剪枝说明

代码如下:

def alphabeta(alpha, beta, depthleft): bestscore = -9999 if (depthleft == 0): return quiesce(alpha, beta) for move in board.legal_moves: board.push(move) score = -alphabeta(-beta, -alpha, depthleft - 1) board.pop() if (score = beta): return score if (score bestscore): bestscore = score if (score alpha): alpha = score return bestscore

现在,让我们用下面给出的流程图来调整 alphabeta 函数:

国际象棋皇后的走法和吃法图解

现在是静态搜索,这种搜索旨在仅评估静态位置,即不存在致胜战术移动的位置。该搜索需要避免由搜索算法的深度限制所引起的水平线效应(horizon effect)。

代码如下:

def quiesce(alpha, beta): stand_pat = evaluate_board() if (stand_pat = beta): return beta if (alpha stand_pat): alpha = stand_patfor move in board.legal_moves: if board.is_capture(move): board.push(move) score = -quiesce(-beta, -alpha) board.pop()if (score = beta): return beta if (score alpha): alpha = score return alpha

简单总结一下 quiesce 函数:

国际象棋皇后的走法和吃法图解

quiesce 函数流程图。

测试 ai

开始测试前,需要导入一些库:

测试有 3 项:

  • ai 对弈人类;
  • ai 对弈 ai;
  • ai 对弈 stockfish。

1. ai 对弈人类:

国际象棋皇后的走法和吃法图解

ai 选择从 g1 到 f3,这是一个很明智的选择。

2. ai 对弈 ai:

国际象棋皇后的走法和吃法图解

3. ai 对弈 stockfish:

国际象棋皇后的走法和吃法图解

可以得出:ai 还不够智能,不足以打败 stockfish 12,但仍然坚持走了 20 步。

接口测试

上述测试方式看起来代码很多,你也可以写一个接口测试 ai。

然后执行:

国际象棋皇后的走法和吃法图解

最终输出

【温馨提示】如果文章内容有帮助到您,别忘动动小手指分享给好友哦!

相关文章

  • 中国象棋 新手先手布局图解.

    中国象棋 新手先手布局图解

    关键词:短时间快速提高、2个公式+3个顿悟、判断先手、扩大先手销魂飞刀慢性咽炎又犯了,嗓子不行,先休息几天再录《全国象棋冠军系列》王天一2盘棋。这是中国象棋理论框架之深度剖析“先—优—胜—赢”四部曲的第一篇文章,从中国象棋理论框架上帮助大家快速提高象棋水平。本来打算弄付费阅读,反复纠结过后,算了,已经搞了7年的免费视频+文章,在2021年退出之前剩下的时间里继续坚持情怀高质量更新。

    2023-09-17 阅读 (743)
  • 象棋开局布局套路图解(揭秘象棋开局布局套路,掌握胜利先机).

    象棋开局布局套路图解(揭秘象棋开局布局套路,掌握胜利先机)

    象棋开局一般指前十步,很少会有十几步就走完一盘棋的,前几天刚做的一期视频中,20步左右结束,也是因为对手投降的缘故。一盘棋大多在25步以后可能会出现较为明朗的优劣势,但棋局万变,绝地反杀真的很正常。象棋一般分为开局、中局、残局这三部分。开局是一盘象棋的基础,一个好的开端是下好一盘棋的关键,如果开局没开好,中局和残局会受很大的影响,很有可能被对手抓住漏洞,一举击破。

    2023-09-15 阅读 (555)
  • 大神象棋讲解图解ppt课件(揭秘象棋大师的制胜秘诀,你敢来挑战吗).

    大神象棋讲解图解ppt课件(揭秘象棋大师的制胜秘诀,你敢来挑战吗)

    天天象棋职业大神独家讲解棋力测评系统,象棋是中国流传十分广泛的游戏。腾讯出品的《天天象棋》致力于打造一款风格清新休闲,质朴耐玩,而不失时尚的游戏。象棋的基本规则在这里就不啰嗦了,《天天象棋》当然也是遵循传统的象棋规则。今天小编主要给大家介绍一下《天天象棋》中的新式系统——“棋力测评”。所谓的棋力测评,说的直白一点就是相当于其他游戏中的升级系统,玩家进入游戏的“棋力测评”模式,与其他玩家进行游戏,胜利失败都可获得相应棋力战绩,继而获得相应的称号。

    2023-09-09 阅读 (106)
  • 下象棋的绝招走法图解(掌握这些象棋绝招,让你轻松赢棋).

    下象棋的绝招走法图解(掌握这些象棋绝招,让你轻松赢棋)

    2023年四川省百城千乡万村·社区象棋网络赛打的可真是火热喃,对象棋感兴趣的朋友们可以快快加入进来!百城千乡万村·社区象棋网络赛将持续到10月7日,共举办网络赛162期,还会派发30000元的现金红包和话费奖励。四川省第二届智力运动会也即将开赛,如果你也喜欢象棋那就加入进来吧!下象棋好处多多!如何提升下象棋的水平?

    2023-09-15 阅读 (87)
  • 博雅象棋残局30关图解(博雅象棋残局30关,如何攻克所有难关).

    博雅象棋残局30关图解(博雅象棋残局30关,如何攻克所有难关)

    淮阴遇汉:淮阴,县名。“楚汉三杰”之一韩信,被封为“淮阴候”,即指此地。图1如图1,着法红先胜:1.车三进一,将6进1。2.马四进二……(图2中的第1种变化)图2如图2的第2种变化,如红方改走炮五平四?则马4退6(如误走马4进6去炮则劣,以下马四进二,将6进1;车三退二,抽将红可速胜);马四退六,马6退5;马六退四,马5进6;马四进六,马6退5;红无连杀,反为黑胜。

    2023-09-10 阅读 (83)
  • 中国橘子之谜解密图解(揭开神秘的中国橘子之谜,竟然如此诱人!).

    中国橘子之谜解密图解(揭开神秘的中国橘子之谜,竟然如此诱人!)

    自古以来,木乃伊一直是一个引人注目的话题。这些保存着几千年历史的尸体虽然看起来恐怖,但同时也令我们着迷。在过去的200年中,考古学家们一直在努力研究这些古老的遗物,试图揭开它们背后的谜团。本文将围绕木乃伊之谜展开讨论,并探索这些尸体如何影响了我们的文化和想象力。木乃伊的历史可以追溯到古埃及时期,当时人们相信死亡并不是一个结束的点,而是通向另一个世界的门户。

    2023-09-17 阅读 (72)
  • 仙人指路经典k线组合图解(如何在股市中洞察先机,抓住仙人指路经典 K 线组合).

    仙人指路经典k线组合图解(如何在股市中洞察先机,抓住仙人指路经典 K 线组合)

    (本文由公众号越声情报(ystz927)整理,仅供参考,不构成具体投资建议。如需要操作,请注意仓位控制,风险自负。)什么是仙人指路:实战中的仙人指路一般在拉升中运用,安全性和可操作性较强。仙人指路k线形状的呈现,一般是多头主力在空中的换档,以进步短期本钱。因而其运用的条件是特定的,并不是一切的带上影线的小阳或小阴线都是仙人指路。

    2023-09-09 阅读 (70)
  • 象棋术语大全图解 专业术语(象棋术语大全图解 专业术语。).

    象棋术语大全图解 专业术语(象棋术语大全图解 专业术语。)

    象棋初始摆放象棋棋子象棋棋子一、常见术语(一)将军对局中,一方的棋子要在下一着棋把对方的将(帅)吃掉,称为“将军”,或简称“将”、“照”。(二)应将被“将军”的一方所采取的反击、躲避或防卫的着法。应将的方法有:1.吃掉对方进行“将军”的棋子。2.帅(将)从被攻击的位置上避开。3.用自己的棋子置于对方“将军”的棋子和自己帅(将)之间,俗称“垫将”。

    2023-09-13 阅读 (64)
  • 象棋残局39关怎么过图解法(破解象棋残局39关,你准备好了吗).

    象棋残局39关怎么过图解法(破解象棋残局39关,你准备好了吗)

    王琳娜与东道主陈青婷交锋。陈青婷执先中炮直横车进三兵对屏风马进3卒。使出快出右马阵,要用流行阵法出奇制胜。王琳娜稳扎稳打,不与红棋过多打照。黑方稳固后防,静候红方来犯。陈青婷发动进攻,车双马双炮五子,都屯于左翼一处。王琳娜毫不惧怕,先行化解红方攻势。再车马炮携过河卒四子反击,斩掉红棋双相。末了车炮卒,车定红棋老帅原位,92手拿下。

    2023-09-13 阅读 (64)
  • 象棋双车杀法大全图解(双车联手,能否横扫棋盘).

    象棋双车杀法大全图解(双车联手,能否横扫棋盘)

    象棋以捉死对方的将、帅为最终目的。捉死将、帅的过程,就是棋手调动各种兵力联合作战的过程。因此,为了争取赢棋,对局双方都要掌握各种典型的基本杀法。这样,在对局中出现杀着入局的机会时,才不致贻误战机。下面介绍一些基本杀法,使初学的朋友们了解予以掌握,以便在实战对局和比赛中灵活运用。(一)白脸将杀“白脸将杀”亦称“对面笑杀”,自己的帅(将)占据中路,利用规则中“帅和将不准在同一直线上直接对面”的规则造成的杀法(图1、图2)。

    2023-09-09 阅读 (59)