https://en.wikipedia.org/wiki/Connect_Four
有人记得2人游戏连接4个吗?对于那些不喜欢的人来说,那是一块6x7的板,它垂直于表面。连接4的目标是连接4!如果连接是水平的,对角的或垂直的,则将其计算在内。您可以通过以下方式将棋子放置在板上:在棋子的顶部插入棋子,使其落在该棋子的底部。我们的规则更改了连接4中的3件事。
- 变更#1获胜定义为得分最高的玩家。您可以通过像规则中那样连接4来获得积分-稍后再介绍。
 - 变更#2您每轮有3个玩家。
 - 变更#3电路板尺寸为9x9。
 
得分:
分数基于您连续获得的分数。如果您有一个连续的4组,您将获得1分。如果您在连续5组中获得5分,则在3行中获得6分,依此类推。
例子:
注意o和x分别用#和代替~,以获得更好的对比
空棋盘示例:(所有示例均为2人标准尺寸棋盘)
   a b c d e f g
6 | | | | | | | |
5 | | | | | | | |
4 | | | | | | | |
3 | | | | | | | |
2 | | | | | | | |
1 |_|_|_|_|_|_|_|
如果我们在coll中放一块d,它会降落在适当的位置1d。
   a b c d e f g
6 | | | | | | | |
5 | | | | | | | |
4 | | | | | | | |
3 | | | | | | | |
2 | | | | | | | |
1 |_|_|_|#|_|_|_|
如果现在d再次在coll中放入一块,它将落在location上2d。以下是连续4个位置的示例:
   a b c d e f g
6 | | | | | | | |
5 | | | | | | | |
4 | | | |~| | | |
3 | | |~|#| | | |
2 | |~|#|~| |#| |
1 |~|#|~|#|_|#|_|
在这种情况下x,对角线(1a 2b 3c 4d)得到1点。
  a b c d e f g
6 | | | | | | | |
5 | | | | | | | |
4 | | | |#| | | |
3 | | | |#| | | |
2 | | | |#| | | |
1 |_|~|_|#|~|_|~|
在这种情况下,o垂直获得1点(1d 2d 3d 4d)。
   a b c d e f g
6 | | | | | | | |
5 | | | | | | | |
4 | | | | | | | |
3 | | | | | | | |
2 | | |#|#|#|#| |
1 |_|_|~|~|~|~|~|
在这种情况下o,水平获得2点(1c 1d 1e 1f 1g),x水平获得1点(2c 2d 2e 2f)。
   a b c d e f g
6 | | |#| | | | |
5 | | |#| | | | |
4 | | |#| | | | |
3 | | |#| | |~| |
2 |~| |#| | |#|~|
1 |~|_|#|~| |~|~|
这次x获得了6分(1c 2c 3c 4c 5c 6c)的3分。
输入输出
您将可以通过二维阵列访问电路板。每个位置将以int代表玩家ID 的形式表示。您还将把您的玩家ID传递给函数。您可以通过返回要放入的列来采取行动。每回合将选出3名选手参加比赛。在游戏结束时,所有玩家都将玩均匀数量的游戏。
目前将进行10万发回合(请注意,这需要花费很长时间,您可能希望减少它以进行快速周转测试)。总体而言,获胜者是获胜最多的玩家。
控制器可以在这里找到:https : //github.com/JJ-Atkinson/Connect-n/tree/master。
编写机器人:
要编写机器人,您必须扩展Player该类。Player是抽象的,有一种实现方法int makeMove(void)。在其中,makeMove您将决定要放入哪个列。如果您选择了无效的列队(例如,列队不存在,列队已经被填满),您的回合将被跳过。在Player课堂上,您有许多有用的辅助方法。最重要的清单如下:
boolean ensureValidMove(int coll):如果 coll在板上并且尚未填充coll,则返回true 。int[] getBoardSize():返回一个int数组,其中[0]是列[1]数和行数。int[][] getBoard():退还电路板的副本。您应该这样访问它:[coll number][row number from bottom]。- 要找到其余的内容,请看
Player课。 EMPTY_CELL:空单元格的值
由于这将是多线程的,因此random如果需要,我还提供了一个函数。
调试您的机器人:
我在控制器中包含了一些东西,以使其更易于调试机器人。第一个是Runner#SHOW_STATISTICS。如果启用此功能,您将看到已打出的玩家组的打印输出,包括机器人获胜的次数。例:
OnePlayBot, PackingBot, BuggyBot, 
OnePlayBot -> 6
PackingBot -> 5
BuggyBot -> 3
Draw -> 1
您也可以与该connectn.game.CustomGame班级一起制作自定义游戏,您可以查看每个回合的得分和获胜者。您甚至可以使用添加自己UserBot。
添加您的机器人:
要将您的机器人添加到阵容中,请转到PlayerFactory静态块并添加以下行:
playerCreator.put(MyBot.class, MyBot::new);
其他注意事项:
- 模拟是多线程的。如果您要关闭此功能,请转到
Runner#runGames()并注释此行(.parallel())。 - 要更改游戏数量,请
Runner#MINIMUM_NUMBER_OF_GAMES根据自己的喜好进行设置。 
稍后添加:
- 禁止漫游器之间进行通信。
 
相关:玩Connect 4!
===============================
计分板:(100 000场比赛)
MaxGayne -> 22662
RowBot -> 17884
OnePlayBot -> 10354
JealousBot -> 10140
Progressive -> 7965
Draw -> 7553
StraightForwardBot -> 7542
RandomBot -> 6700
PackingBot -> 5317
BasicBlockBot -> 1282
BuggyBot -> 1114
FairDiceRoll -> 853
Steve -> 634
===============================
Player该类以查看所有可用方法。
                ensureValidMove(除非您的策略是通过这一回合)。