声明:本程序设计参考象棋巫师源码(开发工具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
声明:本程序设计参考象棋巫师源码(开发工具dephi11,建议用delphi10.3以上版本)。 本章目标:实现中国象棋规则 上一章我们设计了图形界面,可以开始轮流走棋了。但是,由于没有按中国象棋的规则进行限制,所有的棋子都可以在棋盘上随意走动,这章我们开始制定行棋规则。 2.1 记录局面 在制定规则之前,我们要先考虑把当前局面记录下来,这样棋子移动后才能知道移动后的局面。棋盘是10×9的格子组成,我们就用二维数组来记录局面变化情况,同时用一个一维数组记录每个棋子的位置:varchessbd:array[0..9,0..8]ofByte;//记录当前棋局,添加到csPieceMove单
声明:本程序设计参考象棋巫师源码(开发工具dephi11,建议用delphi10.3以上版本)。 这一章计划初步实现搜索算法,前两章基本上按照我自己对中国象棋的理解来设计程序,从这章开始参照象棋巫师算法。 本章目标:用子力位置价值表实现局面评价函数;用超出边界(Fail-Soft)的Alpha-Beta搜索让电脑走棋;用迭代加深技术实现时间控制;实现历史表启发,优化Alpha-Beta搜索的效率;实现杀棋步数评价,能有效搜索杀棋。 3.1 局面评价 中国象棋共有7种棋子:将(帅)、士、相、马、车、炮、兵,局面评价中最关键的因素是每种棋子的价值,子力价值是跟它的绝对位置相关的。比
声明:本程序设计参考象棋巫师源码(开发工具dephi11,建议用delphi10.3以上版本)。上一章我们的程序终于会走棋了,不过很多时候它很低能。由于水平线效应,任何变化都只搜索固定的深度。还有,有时它会长将。我们能做哪些改进呢?本章的目标:用Zobrist校验码技术实现重复局面判定;实现静态(Quiescence)搜索和MVV/LVA启发;实现将军延伸和空步(Null-Move)裁剪。4.1 克服水平线效应 什么是水平线效应?(以下引用自其他博客) 之前搜索到叶子节点,都是调用评估函数,并返回估值。但有时叶子节点是一个吃子走法,这可能得到一个很好的评分,但如果是一个换子,即下一步
声明:本程序设计参考象棋巫师源码(开发工具dephi11,建议用delphi10.3以上版本)。 这一章主要介绍置换表。本章目标:实现置换表;采用置换表走法、杀手走法等多种启发方式。5.1 置换表 没有置换表,就称不上是完整的计算机博弈程序。在搜索过程中,某个搜索结果可能会出现这么多次,这浪费了很多时间。为避免重复搜索,保存搜索结果的表,就是置换表。由于哈希表的读写速度很快,通常置换表就由哈希表来实现。 置换表非常简单,以局面的 ZobristKeymodHASH_SIZE 作为索引值。每个置换表项存储的内容无非就是:A. 深度,B. 标志,C. 分值,D. 最佳走法,E.Zo
声明:本程序设计参考象棋巫师源码(开发工具dephi11,建议用delphi10.3以上版本)。 这一章主要完善算法。本章目标:实现开局库;实现PVS(主要变例搜索);把根节点的搜索单独处理,增加搜索的随机性;克服由长将引起的置换表的不稳定性。 6.1 实现开局库 开局库几乎是每个象棋程序必备的部件,它的好处是: (1) 即使再笨的程序,开局库能使得它们在开局阶段看上去不那么业余; (2) 通过随机选择走法,让开局灵活多变,增加对弈的趣味性。 我们程序使用开源象棋程序 ElephantEye 的开局库Book.dat文件,开局库文件的结构: typeBookItem=re
使用Delphi和FireMonkey执行与UIViewanimateWithDuration相同的操作的最佳方法是什么?我希望它能在iOS和Android上运行(使用DelphiXE5) 最佳答案 在我的例子中,我试图为TImageControl的大小设置动画。这是我做的:我将一个TFloatAnimation控件拖到Canvas上。使用Delphi中的结构Pane,我将FloatAnimation1拖到ImageControl1上,因此它在结构Pane中显示为ImageControl1的嵌套组件。根据自己的喜好设置Duratio
我正在尝试向TExpander添加自定义行为。基本上我想要实现的是以下内容:我的表格上有多个TExpanders。当用户展开其中一个TExpanders时,所有其他TExpanders都应最小化。 最佳答案 最简单的方法是处理TExpander的OnResize事件,然后在该事件中检查每个其他TExpander面板的IsExpanded属性并将它们设置为False。 关于ios-FiremonkeyiOSTExpanderButtononclick,我们在StackOverflow上找到
我对使用原生组件进行iOS开发的想法非常感兴趣,所以我正在测试当前可用的两个选项:TMSiCL和D.P.FiOSNativeComponents.不幸的是,我发现它们都有局限性,使它们使用起来很麻烦或无法使用,但我仍然希望我只是忽略了一些东西,因此我在这里问一下。我发现的限制:TMSiCL:它要求整个应用程序中的所有原生组件都采用相同的形式!D.P.F.:没有允许您将其与FMX表单/组件组合的FMX包装器。这是我需要的简化版。我有3个表单,一个带有主菜单的主表单(作为按钮)和两个我想滑入的表单。这是组件结构:MainFormUINavigationControllerUIButtonA
我想制作一个在iphone中播放fmradio的应用程序,但通过搜索我发现iphone中没有硬件-fm接收器可以直接(离线)播放FM。所以我想要任何以编程方式或任何其他苹果硬件将gsmradio频率(900Mhz-1800Mhz:india)转换为FM频率(88.1Mhz-108.1Mhz)的解决方案。 最佳答案 这是一个聪明的想法,但您不能只是将GSM接收器重新调到FM波段。即使可以,您也无法访问iPhone上的原始模拟输出(然后您必须自己解调,这是其中一件困难的事情,而不是不可能的事情)。您需要的设备是外部FM接收器。那是完全可