草庐IT

c++ - 一个简单的国际象棋 Minimax

我自己的国际象棋引擎使用minimax算法搜索国际象棋走法有问题我使用5层深度搜索并且只有Material/奖励/移动性评估,但即使我给出它也会做出愚蠢的移动并牺牲有值(value)的棋子对他们无穷大(这肯定是一个搜索问题),我没有使用任何类型的修剪,并在几秒钟内给出了5深度搜索结果。我在这个问题上被困了一个星期,我确信问题出在回溯而不是国际象棋逻辑(所以没有国际象棋背景的人都会解决这个问题:))我搜索了很多这是我的第一个问题在StackOverflow中,我希望你们不会让我失望:)这是简单的搜索代码intGameControl::Evaluate(ChessBoard_B){intm

C++ - 国际象棋主教 MoveCode 错误?

所以我正在制作国际象棋游戏,但是我无法让象棋正确移动。这是我的棋盘:stringboard[8][8]={{"_","_","_","_","_","_","_","_"},{"_","_","_","_","_","_","_","_"},{"_","_","_","_","_","B","_","_"},{"_","_","_","_","_","_","_","_"},{"_","_","_","_","_","_","_","_"},{"_","_","_","_","_","_","_","_"},{"_","_","_","_","_","_","_","_"},{"_",

FireMonkey3D之中国象棋程序(一)界面设计

声明:本程序设计参考象棋巫师源码(开发工具dephi11,建议用delphi10.3以上版本)。  本章目标:制作一个可操作的图形界面  第一步我们设计图形界面,显示初始化棋局。效果如下图: 我们先做个3D象棋子控件(请看我的博客关于FireMonkey3D的文章:万能控件Mesh详解),源码如下:unitChessPiece;interfaceusesSystem.SysUtils,System.Types,System.UITypes,System.Classes,FMX.Types,FMX.Controls3D,FMX.Objects3D,FMX.Types3D,FMX.Material

FireMonkey3D之中国象棋程序(二)制定规则

声明:本程序设计参考象棋巫师源码(开发工具dephi11,建议用delphi10.3以上版本)。  本章目标:实现中国象棋规则  上一章我们设计了图形界面,可以开始轮流走棋了。但是,由于没有按中国象棋的规则进行限制,所有的棋子都可以在棋盘上随意走动,这章我们开始制定行棋规则。  2.1 记录局面  在制定规则之前,我们要先考虑把当前局面记录下来,这样棋子移动后才能知道移动后的局面。棋盘是10×9的格子组成,我们就用二维数组来记录局面变化情况,同时用一个一维数组记录每个棋子的位置:varchessbd:array[0..9,0..8]ofByte;//记录当前棋局,添加到csPieceMove单

FireMonkey3D之中国象棋程序(三)初步搜索算法

  声明:本程序设计参考象棋巫师源码(开发工具dephi11,建议用delphi10.3以上版本)。  这一章计划初步实现搜索算法,前两章基本上按照我自己对中国象棋的理解来设计程序,从这章开始参照象棋巫师算法。  本章目标:用子力位置价值表实现局面评价函数;用超出边界(Fail-Soft)的Alpha-Beta搜索让电脑走棋;用迭代加深技术实现时间控制;实现历史表启发,优化Alpha-Beta搜索的效率;实现杀棋步数评价,能有效搜索杀棋。  3.1 局面评价    中国象棋共有7种棋子:将(帅)、士、相、马、车、炮、兵,局面评价中最关键的因素是每种棋子的价值,子力价值是跟它的绝对位置相关的。比

FireMonkey3D之中国象棋程序设计(四)水平效应、检查重复局面

声明:本程序设计参考象棋巫师源码(开发工具dephi11,建议用delphi10.3以上版本)。上一章我们的程序终于会走棋了,不过很多时候它很低能。由于水平线效应,任何变化都只搜索固定的深度。还有,有时它会长将。我们能做哪些改进呢?本章的目标:用Zobrist校验码技术实现重复局面判定;实现静态(Quiescence)搜索和MVV/LVA启发;实现将军延伸和空步(Null-Move)裁剪。4.1 克服水平线效应     什么是水平线效应?(以下引用自其他博客)  之前搜索到叶子节点,都是调用评估函数,并返回估值。但有时叶子节点是一个吃子走法,这可能得到一个很好的评分,但如果是一个换子,即下一步

FireMonkey3D之中国象棋程序设计(五)置换表

声明:本程序设计参考象棋巫师源码(开发工具dephi11,建议用delphi10.3以上版本)。  这一章主要介绍置换表。本章目标:实现置换表;采用置换表走法、杀手走法等多种启发方式。5.1 置换表     没有置换表,就称不上是完整的计算机博弈程序。在搜索过程中,某个搜索结果可能会出现这么多次,这浪费了很多时间。为避免重复搜索,保存搜索结果的表,就是置换表。由于哈希表的读写速度很快,通常置换表就由哈希表来实现。    置换表非常简单,以局面的 ZobristKeymodHASH_SIZE 作为索引值。每个置换表项存储的内容无非就是:A. 深度,B. 标志,C. 分值,D. 最佳走法,E.Zo

FireMonkey3D之中国象棋程序设计(六)完善算法

  声明:本程序设计参考象棋巫师源码(开发工具dephi11,建议用delphi10.3以上版本)。    这一章主要完善算法。本章目标:实现开局库;实现PVS(主要变例搜索);把根节点的搜索单独处理,增加搜索的随机性;克服由长将引起的置换表的不稳定性。  6.1 实现开局库  开局库几乎是每个象棋程序必备的部件,它的好处是:  (1) 即使再笨的程序,开局库能使得它们在开局阶段看上去不那么业余;  (2) 通过随机选择走法,让开局灵活多变,增加对弈的趣味性。  我们程序使用开源象棋程序 ElephantEye 的开局库Book.dat文件,开局库文件的结构:  typeBookItem=re

php - 用于验证基于国际象棋的输入的正则表达式?

我正在使用HTML/CSS/PHP开发一个基于国际象棋的业余项目。我之前不熟悉国际象棋,所以我决定制作一个工具,根据给定棋子的类型和方格显示允许的走法。我有一个带有两个文本字段的HTML表单:一个用于棋子的类型,另一个用于该棋子的当前方格。一切正常,但我想包括使用正则表达式的验证。棋子类型的有效、不区分大小写的输入是p、pawn、r、rook、b、bishop、n、knight、q、queen、k、king。正方形的有效、不区分大小写的输入是LetterNumber,其中Letter可以是A-H和Number可以是1-8。所以我想知道使用正则表达式是否可行/实用,如果可行,谁能告诉我它

Autojs 利用OpenCV识别棋子之天天象棋你马没了

本例子通过代码像你介绍利用OpenCV实现霍尔找圆的方法定位棋子位置通过autojs脚本实现自动点击棋子开源地址https://github.com/Liberations/TtxqYourHorseIsGone/blob/master/main.jsAutoXJshttps://github.com/kkevsekk1/AutoX/releasesauto()//安卓版本高于Android9if(device.sdkInt>28){//等待截屏权限申请并同意threads.start(function(){packageName('com.android.systemui').text('立