https://en.wikipedia.org/wiki/Connect_Four
2プレイヤーゲーム接続4を覚えている人はいますか?そうでない人にとっては、表面に垂直に立っている6x7のボードでした。接続4の目標は、接続4です!接続は、水平、斜め、または垂直の場合にカウントされます。ピースをボードの上部に置くには、ピースをその列の一番下に落ちるようにボードの上部に置きます。ルールは、コネクト4で3つのことを変更します。
- 変更#1の勝ちは、最も多くのポイントを持つプレーヤーとして定義されます。ルールのように4をつなげることでポイントを獲得します-それについては後で詳しく説明します。
- 変更#2各ラウンドに3人のプレイヤーがいます。
- 変更#3ボードサイズは9x9です。
得点:
スコアは、連続して取得する数に基づいています。行グループに4がある場合、1ポイントを獲得します。行グループに5がある場合、2ポイント、行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
斜めに1ポイント(1a 2b 3c 4d
)を取得します。
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連続で3ポイントを獲得し1c 2c 3c 4c 5c 6c
ます()。
入出力
2Dアレイを介してボードにアクセスできます。各場所はint
、プレーヤーIDを表すことで表されます。また、プレーヤーIDを関数に渡します。作品をドロップしたいコラージュを返すことで、あなたは動きます。各ラウンド3人のプレイヤーがプレイするために選択されます。ゲームの終わりに、すべてのプレイヤーはゲームを均等にプレイします。
100kのラウンドが実行される瞬間(注これにかかる長い時間を、あなたは、高速のターンアラウンド・テストのためにそれを軽減することができます)。全体的に勝者は、最も勝ったプレーヤーです。
コントローラはhttps://github.com/JJ-Atkinson/Connect-n/tree/masterにあります。
ボットの作成:
ボットを作成するには、Player
クラスを拡張する必要があります。Player
は抽象的で、実装するメソッドが1つありint makeMove(void)
ます。ではmakeMove
もしあなたがにあなたの作品をドロップしたいどの蔵決定します。無効なcollを選択した場合(例:collが存在しない、colが既に入力されている場合)、あなたのターンはスキップされます。ではPlayer
クラスあなたは多くの有用なヘルパーメソッドを持っています。最も重要なもののリストは次のとおりです。
boolean ensureValidMove(int coll)
:collがボード上にあり、colがまだ満たされていない場合、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
お好みに設定します。
後で追加:
- ボット間の通信は許可されていません。
================================
スコアボード:(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
(もちろん、あなたの戦略がこのターンをパスすることでない限り)。