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
(除非您的策略是通过这一回合)。