隖齜麡开发日志
Day?:
这个程序的导火索是srf做的某一道题,而这时正值研究性学习选课题的最后阶段。由于我们没有什么想法,就将五子棋的实现和研究作为了主要课题。
以下:主要来自czyarl
## 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。在这个版本中,我们认为棋盘只能是正方形。因此输入棋盘大小的时候你只需要输入一个数字代表正方形边长。
* 暂停和过程输出功能:供调试使用。不推荐开启。
为了获得更加清楚易懂且便于维护的实现,我们在高铁上提出了“三权分立”的概念,即主控制权、UI权和下棋权三权分立,而这些权利都设立一个自己单独的模块。
## v0.6.2
1. 更新了readme中的教程。
2. Entity2被偷梁换柱成了pcf的一个只知进攻的AI。
3. czy写了个新的AI,叫Entity4,是Entity2的魔改版。这个AI太强了!我们都被打爆了!
1 # 教程 2 3 ### 编译 4 我们给出了一个makefile文件。如果你的电脑中有g++、mingw并支持c++11,你就可以使用这个文件直接编译。 5 注意,它只会帮你重新编译在上一次编译过后又被改变了的那些.cpp及其影响的文件。这个机制是为了节约编译时间。 6 如果你希望它重新编译,(假设你编译时输入的指令为mingw32-make)运行指令 7 8 ``` 9 mingw32-make clean 10 ``` 11 即可。 12 13 #### windows 14 你可以这样使用:在文件夹中按住shift并右键单击空白处,在选项中找到“在此处打开PowerShell窗口”,单击它。之后在打开的PowerShell窗口中输入以下命令: 15 ``` 16 mingw32-make 17 ``` 18 如果你的电脑提示没有此文件,(假设你的MinGW在的文件夹叫MinGW64)可以将你的MinGW64/bin/的完整路径添加到系统的path里面,然后在bin里面找一个名字里带make的.exe,假设为Xmake.exe。然后在刚刚打开的PowerShell窗口里面输入命令Xmake就行了。 19 如果你打不开PowerShell窗口,可以把上面提到的命令写到.bat里面并运行这个bat也能起到同样的效果。 20 如果还不行,再说。 21 22 #### linux 23 请你自己尝试使用mingw的make功能。 24 25 ### 新增AI 26 27 #### 环境及函数 28 29 推荐参考文件Entity1.cpp 30 * 一个AI需要提供四个函数do_startGame,do_setPos,do_endGame,do_playChess。 31 * do_startGame为提醒你游戏开始,可以预处理。 32 * do_setPos为告诉你有人下棋了。会告诉你新棋子的位置和是谁下的(你自己下的也会再告诉你一遍) 33 * do_endGame为告诉你游戏结束。你应该释放自己动态申请的空间并结束自己开启的所有线程。 34 * do_playChess为让你下棋。你应当返回一个pair<int,int>表示(行,列)。 35 * 外部程序会维护若干变量:(你不需要也不应该在四个函数中修改这些变量) 36 * int role,n,m:分别表示你的颜色,棋盘行数,棋盘列数。 37 * GameType G:表示游戏胜利规则。目前仅有五子棋一种规则,可以暂时忽略。 38 * int a[][]:表示棋盘中的状态。理论上用三个变量colorEmpty,colorBlack,colorWhite表示,实际上0表示无棋子,1表示黑棋,2表示白棋。(当然希望你去使用那三个变量,但是无所谓。) 39 * const int MaxBoardSize=100:表示棋盘最大的大小。 40 * 可以看一下BasicType.h。里面定义的东西可以直接使用。 41 * 尽量不要定义宏(如果定义,请使用绝对安全的名字,比如ENTITY4_DO_MAXNUM),但是可以随意include东西。 42 43 #### 新增AI的调试和修改 44 45 假设你将其取名为newEntity,你应该 46 1. 仿照entity/Entity1建立entity/newEntity.cpp和entity/newEntity.h,将newEntity_do中的private成员改成你的内容,其他函数不应有改动。 47 2. 修改entity/EntityControl.cpp:MaxEntityType增加1;Player::setPlayer(int)中仿照前文加一句话。 48 3. 修改entity/Entity.h: 添加#include "newEntity.h" 49 4. 修改paint/paint.cpp:init仿照已有代码加入新列表。 50 5. 修改makefile:在最后一条修改SBJS的代码后添加SBJS += newEntity.o;仿照其他代码添加编译newEntity.cpp的语句: 51 ``` 52 newEntity.o : entity/newEntity.cpp 53 g++ -c entity/newEntity.cpp $(CXXFLAGS) 54 ``` 55 6. 重新编译。如果使用makefile并且之前已经经过编译,他将重新编译newEntity.cpp EntityControl.cpp main.cpp chess_v???.exe。
TUTORIAL