https://ko.wikipedia.org/wiki/Connect_Four
2 플레이어 게임이 4를 연결한다는 것을 기억하는 사람이 있습니까? 그렇지 않은 사람들에게는 표면에 수직으로 서있는 6x7 보드였습니다. Connect 4의 목표는 4를 연결하는 것입니다! 연결이 수평, 대각선 또는 수직이면 계산됩니다. 조각을 열의 맨 아래에 해당 열의 맨 아래에 삽입하여 조각을 보드에 배치합니다. 우리의 규칙은 connect 4에서 3 가지를 바꿉니다.
- 변경 # 1 승리는 가장 많은 점수를 얻은 플레이어로 정의됩니다. 규칙에서와 같이 4를 연결하여 포인트를 얻습니다.
- # 2 변경 라운드마다 3 명의 선수가 있습니다.
- 변경 # 3 보드 크기는 9x9입니다.
채점 :
점수는 행 수에 따라 결정됩니다. 행 그룹에 4가 있으면 1 점을 얻습니다. 행 그룹에 5가 있으면 2 점, 6 행에 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
다시 놓으면 위치 에 놓 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
추상적이고 구현할 방법이 하나 int makeMove(void)
있습니다. 에서 makeMove
당신이 결정할 것입니다 당신이로 조각을 드롭하고 싶은 콜있다. 유효하지 않은 콜을 선택한 경우 (예 : 콜이 존재하지 않거나 콜이 이미 채워져 있음) 턴을 건너 뜁니다 . 에서 Player
클래스는 많은 유용한 도우미 메서드가 있습니다. 가장 중요한 것들의 목록은 다음과 같습니다.
boolean ensureValidMove(int coll)
: 콜이 보드에 있고 콜이 아직 채워지지 않은 경우 true를 리턴합니다 .int[] getBoardSize()
:[0]
열[1]
개수와 행 개수 인 int 배열을 반환합니다 .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
원하는대로 설정 하십시오.
나중에 추가 :
- 봇 간의 통신이 허용되지 않습니다.
관련 : Play 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
.