这个世界已经有太多的框架,我们为什么需要学习一种新的?
简单点来回答这个问题 —— 效率!
掌握前沿的技术,顺应技术演进的趋势,抱紧 google 的大腿,现在就是上路的时候了。
我们的专栏中完整跟进了「棋路」象棋游戏在开发中遇到的各种问题,尝试解决问题的方式不限于 Flutter 或 Dart,而是实用为王。从真实项目的,你能得到语言或框架以外的经验和知识。
以下的专栏中涉及到的主要知识点,以及推荐的学习资源:
Dart 语言知识
Dart 语言容易学习和使用,如果你学习过 C++ 或是 Java,学习 Dart 将非常容易和快捷。可以试看 GitChat 专栏《Dart 入门实践》,你能在几个小时内掌握 Dart 语言的精义。
Flutter 开发技术
如果你有过 iOS 或 Android 的开发经验,亦或是你有 Ionic 或 Web 开发经验,则完全不用担心 Flutter 的入门问题。即使什么开发经验都没有,Dart 的入门也是容易的。使用中文的 Flutter 官方文档,是 Flutter 入门的好办法。
iOS 和 Android 开发基础知识
我们要做的是跨平台的游戏 App,对 iOS 和 Android 开发有基本的了解是很有帮助的,但这并不是这个专栏的前提。我们的专栏中除了单机引擎部分调用了 C++ 原生引擎、需要在 iOS 和 Android 平台上进行少量混合开发外,其它的内容都是在 Flutter 环境下实现的。即使你没有 iOS 和 Android 开发基础,跟着我们的专栏指示,你也能完成全部的开发任务。
如果你想要系统地学习 iOS 开发技术,那么以下这些链接将给你绝佳的入门引导:
Swift5 语言简介
Swift 语言 Getting Start
Start Developing iOS Apps (Swift)
如果你有志于系统地学习 Android 开发技术,那么以下这链接你也千万别错过:
百度搜索:《Thinking in Java》电子版
构建你的第一个 Android 应用
Android 开发者指南
Android 官方开发示例
Android 开发技术
C/C++开发技术
专栏中将使用 C++ 语言实现的人机对战引擎来做电脑端的大脑,如果有一定的 C++ 基础,将有利于你得更好地理解象棋对战引擎的实现原理。这当然不是学习这门专栏的前提。即使没有接触过 C/C++ 语言,你不会阻碍你顺畅地学习我们的专栏。
百度搜索:《Thinking in C++》电子版
菜鸟 C++基础教程
Nodejs / Koa 开发技术
Nodejs 技术栈非常流行,其生态也是枝繁叶茂。
我们的专栏并不要求你掌握 Nodejs 技术栈的知识,但 Nodejs 学习和应用极简单明快,是我技术学习过程中最愉快的一段经历了。我推荐大家课后学习 Nodejs 技术;作为一个现代的开发人员,不应该对如此活跃的一个生态一无所知。
Nodejs 和 Koa 的学习,建议直接去官网:Koa 的首页文章对你理解和入门 Koa 极有帮助。
不必担心自己尚未掌握这些技术点,我们专栏的每一个环节都呈现了可执行的代码和指令,这些代码都经过了作者的至少两轮从头到尾的验证。
只需要跟着专栏的脚步,一步一步地往下走,在实践中去做、去体会,理论正是来自于实践的。
跟随我们的教程,实现中国象棋的游戏过程,你将学习到以下知识点:
一个完整的产品涉及到的细节比较多,有些特定场景到我们遇到时再和大家分解。
现实当中,每一个真实产品的开发过程几乎不可能只使用一种技术、甚至一套技术栈,正是由于这个原因,许多开发人员学习了某种语言的一系列专栏、完成一系列专栏中的 demo 后,并不能实际完成公司或项目组交给的真实项目任务,这正是纯理论专栏的短板!
我们的专栏反映了真实项目的众多细节,中间的衔接与各种技术的综合运用来自于长期的项目实践,接近并学习这些知识,能快速地提升你独立完成真实项目任务的能力。
如果你是开发界的新兵,学习我们的专栏将助你在实际中学习 Dart/Flutter 综合应用能力,关键能提升你对互联网产品的整个生命周期的理解。
如果你已经是经验丰富的开发老兵了,跟随这个专栏你除了能学习到一些具体问题的解决方法外,还将学习到解决问题的更多思路、各种设计模式与开发的流程。
如果你是学生,将会发现这个专栏和你以前读到的各种课本完全不同,它实用而不教条,在带给你难得的项目实践经验的同时,助打开广阔的技术视野。
贺照云,曾就职于腾讯、联想软件、360;十年开发经验、十年产品策划经验; 熟悉 C++、Java、JS、Swift、Dart、Groovy 等多种语言;熟悉 J2EE/Nodes/Android/iOS/Windows 等多种开发平台;
中国象棋通用引擎协议 (Universal Chinese Chess Protocol,简称UCCI),是一种象棋界面和象棋引擎之间的基于文本的通讯协议。
规范通用引擎协议 UCCI 协议,为棋软的 AI 引擎与界面分享提供标准接口,一些团队可以实现优美的界面,而另一些团队可以关注于 AI 引擎算法提升。
中国象棋的软件理论主要参考了国际象棋,通用引擎协议也是这样。UCCI 参考国际象棋的 UCI 来制定的。
通常情况下,引擎程序以独立进程方式运行,以标准输入输出与界面程序进行通信。
独立进程运行的情况下,象棋软件使用输入输出管道方式与作为子进程的引擎程序进行通信,通信内容为文本。/Users/linmi/Documents/Work/GitChat/专栏/照云/flutter 实战:中国象棋引擎也可以象棋程序的线程方式运行,象棋软件和引擎运行于同一个内存空间,可以使用更灵活的方式进行通信。
象棋程序与引擎之间的通信过程一般是这样的:
象棋程序以 position
指令告知引擎局面信息。局面信息以 FEN 方式标记,一个典型的局面指令:
position fen rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR w - - 0 1
为了让引擎自动判断禁手(重复等),可以在 position
指令中分两部分反应局面信息,一部分是上一次吃子(或开局)后的局面,另一部分是上一次吃子后的招法列表。
position fen rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR w - - 0 1
Case 2 - 红方走出了炮二平五,请求引擎为黑方出着:无咋子局面,使用开局局面,有一步着法:
position fen rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR w - - 0 1 moves h2e2
Case 3 - 黑方炮8平5,请引擎为红方出着:无吃子过程,有两步着法:
position fen rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR w - - 0 1 moves h2e2 h7e7
Case 4 - 红方炮五进四,请引擎为黑方出着:前一步红方吃子,局面变化最最近吃子局面,无着法列表:
position fen rnbakabnr/9/1c2c4/p1p1C1p1p/9/9/P1P1P1P1P/1C7/9/RNBAKABNR b - - 0 2
Case 5 - 黑方走出士4进5,请引擎为红方出着,使用上一个咋子局面,着法列表中是上一步黑方「士4进5」:
position fen rnbakabnr/9/1c2c4/p1p1C1p1p/9/9/P1P1P1P1P/1C7/9/RNBAKABNR b - - 0 2 moves d9e8
象棋应用和引擎程序之间对着法的表示使用 ICCS 格式。
ICCS 格式用 4 个字符表示一步着法的,例如 b0c2
:
举个例子,引擎返回着法 b0c2
,表示将第2列第1行的棋子移动到第3列第3行
。
ucci
这是引擎启动后,界面需要给引擎发送的第一条指令,通知引擎现在使用的协议是UCCI。
id {name | copyright | author | user} <信息>
返回引擎的版本号、版权、作者和授权用户,例如:
id name ElephantEye 1.6 Betaid copyright 2004-2006 www.xqbase.comid author Morning Yellowid user ElephantEye Test Team
option <选项> type <类型> [min <最小值>] [max <最大值>] [var <可选项> [var <可选项> [...]]] [default <默认值>]
显示引擎所支持的选项,UCCI 引擎支持以下选项:
ucciok
引导状态的反馈,此后引擎进入空闲状态。
isready
检测引擎是否处于就绪状态
readyok
表明引擎处于就绪状态。
setoption <选项> [<值>]
设置引擎参数,这些参数都应该是前述 ucci 指令的 option 反馈的参数,例如:
setoption usebook false,不让引擎使用开局库; setoption selectivity large,把选择性设成最大; setoption style risky,指定冒进的走棋风格; setoption loadbook,初始化开局库。
position {fen | startpos} [moves <后续着法列表>]
设置局面,用 fen 来指定 FEN 格式串,moves 后面跟的是随后走过的着法。startpos表示开始局面,它等价于 rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR w - - 0 1
banmoves <禁止着法列表>
为当前局面设置禁手,以解决引擎无法处理的长打问题
go [ponder | draw] <思考模式>
要求引擎根据 position 指令设定的棋盘来思考,各选项为思考方式,有三种模式可供选择:
info <思考信息>
显示引擎思考信息,通常有以下几种信息:
ponderhit [draw]
思考过程中的指令,告诉引擎后台思考命中,现在转入正常思考模式(引擎继续处于思考状态,此时go指令设定的时限开始起作用)。draw 选项表示向引擎提和,引擎以 bestmove 提供的选项作为反馈。
stop
中止引擎的思考。注意:发出该指令并不意味着引擎将立即回到空闲状态,而是要等到引擎反馈bestmove或nobestmove后才表示回到空闲状态。
bestmove <最佳着法> [ponder <后台思考的猜测着法>] [draw | resign]
思考结果反馈,以及猜测在这个着法后对手会有怎样的应对。
通常,最佳着法是思考路线、中的第一个着法,而后台思考的猜测着法则是第二个着法。在对手尚未落子时,可以根据该着法来设定局面,并作后台思考。当对手走出的着法和后台思考的猜测着法吻合时,称为“后台思考命中”。
draw 选项表示引擎提和或者接受界面向引擎发送的提和请求
resign 选项表示引擎认输。
nobestmove
反馈思考结果,但引擎一步着法也没计算,表示当前局面是死局面,或者接收到诸如 go depth 0 等只让引擎给出静态局面评价的指令。
quit
让引擎退出运转。
bye
接收到 quit 指令后的反馈
电脑象棋联赛使用 UCCI 引擎,参赛引擎必须能够识别并正确处理以下的指令:
参赛引擎必须能够反馈的信息有:
为了更好地让引擎适应模拟器,引擎最好能够实现以下功能:
另外,识别 setoption 指令不是必须的,但在联赛中也会有用,例如用 setoption bookfiles …来导入开局库。
阅读全文: http://gitbook.cn/gitchat/column/5e9d67352b34772795873df4