适用于v0.7.3.2
v0.7.4的区别主要在于编译。附加指令不用win/lin,用winfull64/winfull32/lindos/windos就好了,顾名思义即可。
在成功编译之后,你可以将编译出来的可执行文件放到任何地方执行。
注意data/目录中存放了迭代数据。如果你不移动该文件夹,你可能会丢失以前进化的数据。
你需要先编译所有AI生成静态库。接下来我们给出了一个makefile文件。如果你的电脑中有g++、mingw并支持c++11,你就可以使用这个文件直接编译。
编译并运行entity/AIs/__build.cpp即可自动进行。
应用程序使用makefile进行编译。具体操作根据操作系统有所不同。
你可以这样使用:在文件夹中按住shift并右键单击空白处,在选项中找到“在此处打开PowerShell窗口”,单击它。之后在打开的PowerShell窗口中输入以下命令:
mingw32-make win
如果你的电脑提示没有此文件,(假设你的MinGW在的文件夹叫MinGW64)可以将你的MinGW64/bin/的完整路径添加到系统的path里面,然后在bin里面找一个名字里带make的.exe,假设为Xmake.exe。然后在刚刚打开的PowerShell窗口里面输入命令Xmake就行了。
如果你打不开PowerShell窗口,可以把上面提到的命令写到.bat里面并运行这个bat也能起到同样的效果。
如果还不行,再说。
如果你希望它重新编译,(假设你编译时输入的指令为mingw32-make)运行指令
mingw32-make clean
即可。
在终端中输入:
make lin
如果你希望它重新编译,(假设你编译时输入的指令为make)运行指令
make clean
即可。
推荐参考文件Entity1.cpp
- 一个AI需要提供四个函数
do_startGame,do_setPos,do_endGame,do_playChess。do_startGame为提醒你游戏开始,可以预处理。如果你有迭代的设计也请在这个地方完成。do_setPos为告诉你有人下棋了。会告诉你新棋子的位置和是谁下的(你自己下的也会再告诉你一遍)do_endGame为告诉你游戏结束。你应该释放自己动态申请的空间并结束自己开启的所有线程。如果你有迭代的设计也请在这个地方完成。do_playChess为让你下棋。你应当返回一个std::pair<int,int>表示(行,列)。
- 外部程序会维护若干变量:(你不需要也不应该在四个函数中修改这些变量)
int role,n,m:分别表示你的颜色,棋盘行数,棋盘列数。GameType G:表示游戏胜利规则。目前仅有五子棋一种规则,可以暂时忽略。int a:表示棋盘中的状态。理论上用三个变量colorEmpty,colorBlack,colorWhite表示,实际上0表示无棋子,1表示黑棋,2表示白棋。(当然希望你去使用那三个变量,但是无所谓。)const int MaxBoardSize=100:表示棋盘最大的大小。
- 可以看一下
BasicType.h。里面定义的东西可以直接使用。 - 尽量不要定义宏(如果定义,请使用绝对安全的名字,比如
ENTITY4_DO_MAXNUM),但是可以随意include东西。 - 如果你需要使用文件以进行数据迭代,请将其输出到
data/里面。必须使用确定不会对其他人进行干扰的名字(比如以你的AI的文件名命名)。
假设你将其取名为EntityX,你应该
- 仿照
entity/Entity1建立entity/EntityX.cpp和entity/EntityX.h,将EntityX_do中的private成员改成你的内容,并改动其中的一些带编号的Entity名字。其他函数不应有改动。 - 编译并运行
entity/AIs/__build.cpp,这个程序会将entity/AIs/底下的所有AI全部编译。注意到此时你新加入的AI在程序内部的编号(你在dos模式下需要使用它)应该在entity/AIs/table.txt里面查看。 - 重新编译。
你可以使用std::cerr将调试信息输出到标准输出流中。
这是一个相当愚蠢的版本。
entity里面放置了几个AI。在这份文档里面是一个随机下棋的AI(Entity1),一个行优先按顺序扫描能放就放的AI(Entity2)和一个从stdin读入坐标的AI(Entity3)。
basic里面放置了基本struct的定义。现在里面定义了一个棋盘和一个游戏模式。
chess.cpp 是主程序。
你可以通过makefile编译。编译输出文件为shiyan
编译前请确保你有g++和make。
更进一步的开发请等一等,我要去写题了。
pcftxdy!实现可视化了!我们有了一个优美简洁的UI界面! BasicDef.h里面更新了一个从UI获取用户落子地点的函数UI_getPos。 更新了一个Entity4,其中实现了从UI界面获取用户落子地点的真·人工智能。 当然,在这个版本里,你也可以观察两个AI对战。
但是测试时候发现了一个问题:如果是AI对战,落子两轮之后才会在UI上面显示。如果是PVE,这一轮完了UI上面才显示。
我们加入了一些选项。 你可以设置棋盘大小,游戏规则(现在只开发了一个,就是经典的排成一条线,但是你可以设置长度),这一局使用的AI(我们有4个AI,编号为1至4,每种有2个,编号为0到1;你应当先输入种类,再输入这种的第几个。如果你输入相同的两个AI,我也不知道会发生什么。) 你可以在AI自动对战的时候,选择每下一步就暂停一下。
我不想进一步开发,去写题了。大家快写点厉害的AI。
已经好几个版本没有更新readme了!
伟大的pcf实现了纯UI控制,但是愚蠢的czy加上了一个让AI进行大规模对抗的功能,导致你必须在运行程序时,先用dos窗口选择功能。
纯UI控制相信大家都能看懂。值得一提的是,如果你选择让两个AI对抗,点击start之后,你必须把鼠标从start上面移开程序才会正常工作。不过这不是大问题,就先不修了。
大规模对抗功能使用的时候,我们将不会创建UI窗口。在读入基本设定之后,程序将按此设定自动运行给定的次数。只会在最后的时候输出黑白双方各自的胜利次数。
- AI编号:1:随机下棋;2:初级智能AI;3:从stdin读取坐标。
- 棋盘大小:最大为100* 100。在这个版本中,我们认为棋盘只能是正方形。因此输入棋盘大小的时候你只需要输入一个数字代表正方形边长。
- 暂停和过程输出功能:供调试使用。不推荐开启。
- 更新了
readme.md中的教程。 Entity2被偷梁换柱成了pcf的一个只知进攻的AI。- czy写了个新的AI,叫
Entity4,是Entity2的魔改版。这个AI太强了!我们都被打爆了!
这是好几个版本累计的更新了。放在一起,就当是这个版本的更新吧。
- srf写了一个AI,强度挺好的。
- pcf为UI开发了一个船新功能:可以显示每个子是哪一手。就更方便调试分析了。
- csl写了个
Entity6,打爆了czy的Entity4。 - 曾经我们认为第一点是对的,但是后来发现这两个AI实际上是先手优势放大机。
- czy更新了一个由
Entity4改过来的Entity7。
这是一个大进步!
我们在保留已有entity接口的同时,优化了新AI的添加逻辑。现在你只需要将同名的按顺序编号的EntityX.cpp和EntityX.h放到entity/AIs/里面并运行__build.exe就可以重新利用makefile编译了。
但是此时我们的一些细节还有一点点问题。
我们提供了两个全新的功能:撤回以及记录整盘棋局的每步操作。
snz写了一个新的AI:Entity11。
- 略微修复了部分v0.7.1中的小bug。
- 为v0.7.1找回了v0.6.6中更新的
Entity7 - 顺便说一句,刚刚完成中期汇报。很刺激。
- 有没有神仙来写深度学习?
- 因为明天的汇报重启了这个项目(雾。
- czy添加了一个利用遗传算法自行调参的AI:
Entity8。 - 有没有神仙来写深度学习?
- 更新了makefile文件,现在可以在linux上面正常进行编译
- 更新了一些
entity/AIs/AIHeader.h里面的定义以适配linux - 更新了一个
main_dos.cpp,这个文件是linux下的主程序 - 修复了
dosplay.cpp里面换行多次读入的问题。 - 更新了
__build.cpp,现在他可以按照字典序对AI的名称进行排序并输出每个AI在程序内部的编号到entity/AIs/table.txt里面。
- 更新了
undo功能,但是值得注意的是这个功能仅在UI模式下可以使用并且有些AI并不能支持。
- 修复了在linux下的一些编译问题。
- 为dos模式添加了一个选用默认棋盘的功能;增加了每一步棋下完之后输出棋盘的功能。
- 为dos模式增加了输出比赛结果至文件的功能以防止测试意外中断数据丢失。
- 增强了输出对局结果的功能
- 为确定性算法增加了一个随机开局的设计以更好地评估。
- pcf新完成了一个支持遗传的对抗搜索
EntityPCF。 - czy发现了
EntityPCF里面的一个逻辑漏洞,可是并不能很好地修正,于是自己写了一个EntityCzy。 - 更新了
makefile的一个不智能的问题。现在修改AI之后重新编译只用运行__build.exe再运行makefile就行了。
- 我们发现此前的版本出现了许可证问题:ege(Easy Graph Engine)使用了LGPL 2.1,我们却用了CC BY-SA 4.0。因此紧急进行了许可证更新。
- 计划更新makefile,争取实现更广泛的支持。