【研究性学习】五子棋开发日志

我懒得更新这里了。如果有兴趣就看github仓库吧。
——懒惰的czyarl,2021.10.24

教程

运行

在成功编译之后,你可以将编译出来的可执行文件放到任何地方执行。

编译

我们给出了一个makefile文件。如果你的电脑中有g++、mingw并支持c++11,你就可以使用这个文件直接编译。
注意,它只会帮你重新编译在上一次编译过后又被改变了的那些.cpp及其影响的文件。这个机制是为了节约编译时间。
如果你希望它重新编译,(假设你编译时输入的指令为mingw32-make)运行指令

mingw32-make clean

即可。

windows

你可以这样使用:在文件夹中按住shift并右键单击空白处,在选项中找到“在此处打开PowerShell窗口”,单击它。之后在打开的PowerShell窗口中输入以下命令:

mingw32-make

如果你的电脑提示没有此文件,(假设你的MinGW在的文件夹叫MinGW64)可以将你的MinGW64/bin/的完整路径添加到系统的path里面,然后在bin里面找一个名字里带make的.exe,假设为Xmake.exe。然后在刚刚打开的PowerShell窗口里面输入命令Xmake就行了。
如果你打不开PowerShell窗口,可以把上面提到的命令写到.bat里面并运行这个bat也能起到同样的效果。
如果还不行,再说。

linux

请你自己尝试使用mingw的make功能。

新增AI

环境及函数

推荐参考文件Entity1.cpp

  • 一个AI需要提供四个函数do_startGame,do_setPos,do_endGame,do_playChess。
    • do_startGame为提醒你游戏开始,可以预处理。
    • do_setPos为告诉你有人下棋了。会告诉你新棋子的位置和是谁下的(你自己下的也会再告诉你一遍)
    • do_endGame为告诉你游戏结束。你应该释放自己动态申请的空间并结束自己开启的所有线程。
    • do_playChess为让你下棋。你应当返回一个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东西。

新增AI的调试和修改

假设你将其取名为EntityX(X应该按顺序排下去),你应该

  1. 仿照entity/Entity1建立entity/EntityX.cpp和entity/EntityX.h,将EntityX_do中的private成员改成你的内容,并改动其中的一些带编号的Entity名字。其他函数不应有改动。
  2. 运行entity/AIs/build.exe
  3. 重新编译。如果使用makefile并且之前已经经过编译,他将重新编译newEntity.cpp EntityControl.cpp main.cpp chess_v???.exe。

版本更新日志

v0.000000001 chess_dos_randomAI

这是一个相当愚蠢的版本。
entity里面放置了几个AI。在这份文档里面是一个随机下棋的AI(Entity1),一个行优先按顺序扫描能放就放的AI(Entity2)和一个从stdin读入坐标的AI(Entity3)。
basic里面放置了基本struct的定义。现在里面定义了一个棋盘和一个游戏模式。
chess.cpp 是主程序。
你可以通过makefile编译。编译输出文件为shiyan
编译前请确保你有g++和make。

更进一步的开发请等一等,我要去写题了。

v0.1 chess_visible_randomAI

pcftxdy!实现可视化了!我们有了一个优美简洁的UI界面!
BasicDef.h里面更新了一个从UI获取用户落子地点的函数UI_getPos。
更新了一个Entity4,其中实现了从UI界面获取用户落子地点的真·人工智能。
当然,在这个版本里,你也可以观察两个AI对战。

但是测试时候发现了一个问题:如果是AI对战,落子两轮之后才会在UI上面显示。如果是PVE,这一轮完了UI上面才显示。

v0.1.1

我们加入了一些选项。
你可以设置棋盘大小,游戏规则(现在只开发了一个,就是经典的排成一条线,但是你可以设置长度),这一局使用的AI(我们有4个AI,编号为1至4,每种有2个,编号为0到1;你应当先输入种类,再输入这种的第几个。如果你输入相同的两个AI,我也不知道会发生什么。)
你可以在AI自动对战的时候,选择每下一步就暂停一下。

我不想进一步开发,去写题了。大家快写点厉害的AI。

v0.6.1

已经好几个版本没有更新readme了!

伟大的pcf实现了纯UI控制,但是愚蠢的czy加上了一个让AI进行大规模对抗的功能,导致你必须在运行程序时,先用dos窗口选择功能。

UI

纯UI控制相信大家都能看懂。值得一提的是,如果你选择让两个AI对抗,点击start之后,你必须把鼠标从start上面移开程序才会正常工作。不过这不是大问题,就先不修了。

大规模对抗功能

大规模对抗功能使用的时候,我们将不会创建UI窗口。在读入基本设定之后,程序将按此设定自动运行给定的次数。只会在最后的时候输出黑白双方各自的胜利次数。

  • AI编号:1:随机下棋;2:初级智能AI;3:从stdin读取坐标。
  • 棋盘大小:最大为100* 100。在这个版本中,我们认为棋盘只能是正方形。因此输入棋盘大小的时候你只需要输入一个数字代表正方形边长。
  • 暂停和过程输出功能:供调试使用。不推荐开启。

v0.6.2

  1. 更新了readme中的教程。
  2. Entity2被偷梁换柱成了pcf的一个只知进攻的AI。
  3. czy写了个新的AI,叫Entity4,是Entity2的魔改版。这个AI太强了!我们都被打爆了!

v0.6.5

这是好几个版本累计的更新了。放在一起,就当是这个版本的更新吧。

  1. srf写了一个AI,强度挺好的。
  2. pcf为UI开发了一个船新功能:可以显示每个子是哪一手。就更方便调试分析了。

v0.6.6

  1. csl写了个Entity6,打爆了czy的Entity4。
  2. 曾经我们认为第一点是对的,但是后来发现这两个AI实际上是先手优势放大机。
  3. czy更新了一个由Entity4改过来的Entity7。

v0.7

这是一个大进步!
我们在保留已有entity接口的同时,优化了新AI的添加逻辑。现在你只需要将同名的按顺序编号的EntityX.cpp和EntityX.h放到entity/AIs/里面并运行__build.exe就可以重新利用makefile编译了。
但是此时我们的一些细节还有一点点问题。

v0.7.1

我们提供了两个全新的功能:撤回以及记录整盘棋局的每步操作。
snz写了一个新的AI:Entity11。

v0.7.1.1

  1. 略微修复了部分v0.7.1中的小bug。
  2. 为v0.7.1找回了v0.6.6中更新的Entity7
  3. 顺便说一句,刚刚完成中期汇报。很刺激。
  4. 有没有神仙来写深度学习?

v0.7.1.2

  1. 因为明天的汇报重启了这个项目(雾。
  2. czy添加了一个可以自行调参的AI: Entity8。
  3. 有没有神仙来写深度学习?
原文地址:https://www.cnblogs.com/czyarl/p/14563664.html