https://en.wikipedia.org/wiki/Connect_Four
Có ai nhớ game 2 người kết nối 4 không? Đối với những người không sử dụng nó là một bảng 6x7 đứng thẳng đứng trên một bề mặt. Mục tiêu của kết nối 4 là, kết nối tốt 4! Kết nối được tính nếu nó là ngang, chéo hoặc dọc. Bạn đặt các mảnh của bạn lên bảng bằng cách chèn một mảnh ở đầu cột nơi nó rơi xuống dưới cùng của cột đó. Quy tắc của chúng tôi thay đổi 3 điều trong kết nối 4.
- Thay đổi số 1 Chiến thắng được xác định là người chơi có nhiều điểm nhất. Bạn nhận được điểm bằng cách kết nối 4 như trong quy tắc - nhiều hơn về điều đó sau.
- Thay đổi # 2 Bạn có 3 người chơi mỗi vòng.
- Thay đổi # 3 Kích thước bảng là 9x9.
Ghi điểm:
Điểm số dựa trên số lượng bạn nhận được liên tiếp. Nếu bạn có một nhóm 4 trong một hàng, bạn nhận được 1 điểm. Nếu bạn có một nhóm 5 trong một hàng, bạn nhận được 2 điểm, 6 trong một hàng 3 và cứ thế.
Ví dụ:
Lưu ý o
và x
được thay thế bằng #
và ~
tương ứng, để tương phản tốt hơn
Ví dụ về bảng trống: (tất cả các ví dụ là bảng kích thước tiêu chuẩn 2 người chơi)
a b c d e f g
6 | | | | | | | |
5 | | | | | | | |
4 | | | | | | | |
3 | | | | | | | |
2 | | | | | | | |
1 |_|_|_|_|_|_|_|
Nếu chúng ta thả một mảnh trong coll d
, nó sẽ hạ cánh tại vị trí 1d
.
a b c d e f g
6 | | | | | | | |
5 | | | | | | | |
4 | | | | | | | |
3 | | | | | | | |
2 | | | | | | | |
1 |_|_|_|#|_|_|_|
Nếu bây giờ chúng ta thả một mảnh trong coll d
một lần nữa, nó sẽ hạ cánh tại vị trí 2d
. Dưới đây là ví dụ về 4 vị trí liên tiếp:
a b c d e f g
6 | | | | | | | |
5 | | | | | | | |
4 | | | |~| | | |
3 | | |~|#| | | |
2 | |~|#|~| |#| |
1 |~|#|~|#|_|#|_|
Trong trường hợp này x
được 1 điểm theo đường chéo ( 1a 2b 3c 4d
).
a b c d e f g
6 | | | | | | | |
5 | | | | | | | |
4 | | | |#| | | |
3 | | | |#| | | |
2 | | | |#| | | |
1 |_|~|_|#|~|_|~|
Trong trường hợp này, o
được 1 điểm theo chiều dọc ( 1d 2d 3d 4d
).
a b c d e f g
6 | | | | | | | |
5 | | | | | | | |
4 | | | | | | | |
3 | | | | | | | |
2 | | |#|#|#|#| |
1 |_|_|~|~|~|~|~|
Trong trường hợp này o
được 2 điểm theo chiều ngang ( 1c 1d 1e 1f 1g
) và x
được 1 điểm theo chiều ngang ( 2c 2d 2e 2f
).
a b c d e f g
6 | | |#| | | | |
5 | | |#| | | | |
4 | | |#| | | | |
3 | | |#| | |~| |
2 |~| |#| | |#|~|
1 |~|_|#|~| |~|~|
Lần này x
được 3 điểm cho 6 liên tiếp ( 1c 2c 3c 4c 5c 6c
).
Đầu ra đầu vào
Bạn sẽ có quyền truy cập vào bảng thông qua một mảng 2d. Mỗi vị trí sẽ được đại diện với một int
đại diện cho một id người chơi. Bạn cũng sẽ có id trình phát của bạn được chuyển đến chức năng của bạn. Bạn thực hiện di chuyển của bạn bằng cách trả lại coll mà bạn muốn thả mảnh của bạn vào. Mỗi người chơi vòng 3 sẽ được chọn để chơi. Vào cuối của trò chơi, tất cả người chơi sẽ chơi một số lượng trò chơi chẵn.
Đối với thời điểm 100k vòng sẽ được chạy (lưu ý điều này mất nhiều thời gian, bạn có thể muốn giảm nó để thử nghiệm quay vòng nhanh). Nhìn chung, người chiến thắng là người chơi có nhiều chiến thắng nhất.
Bộ điều khiển có thể được tìm thấy ở đây: https://github.com/JJ-Atkinson/Connect-n/tree/master .
Viết bot:
Để viết bot bạn phải mở rộng Player
lớp. Player
là trừu tượng và có một phương pháp để thực hiện , int makeMove(void)
. Trong makeMove
bạn sẽ quyết định coll nào bạn muốn thả tác phẩm của mình vào. Nếu bạn chọn một coll không hợp lệ (ví dụ coll không tồn tại, coll đã được điền), lượt của bạn sẽ bị bỏ qua . Trong Player
lớp bạn có nhiều phương thức trợ giúp hữu ích. Một danh sách những cái quan trọng nhất sau đây:
boolean ensureValidMove(int coll)
: Trả về true nếu coll nằm trên bảng và coll chưa được điền.int[] getBoardSize()
: Trả về một mảng int trong đó[0]
là số cột và[1]
là số hàng.int[][] getBoard()
: Trả lại một bản sao của bảng. Bạn nên truy cập nó như thế này :[coll number][row number from bottom]
.- Để tìm phần còn lại, nhìn vào
Player
lớp. EMPTY_CELL
: Giá trị của một ô trống
Vì đây sẽ là đa luồng, tôi cũng đã bao gồm một random
hàm nếu bạn cần nó.
Gỡ lỗi bot của bạn:
Tôi đã bao gồm một số thứ trong bộ điều khiển để đơn giản hơn để gỡ lỗi bot. Đầu tiên là Runner#SHOW_STATISTICS
. Nếu điều này được kích hoạt, bạn sẽ thấy một bản in của các nhóm người chơi đã chơi, bao gồm cả số lần thắng bot. Thí dụ:
OnePlayBot, PackingBot, BuggyBot,
OnePlayBot -> 6
PackingBot -> 5
BuggyBot -> 3
Draw -> 1
Bạn cũng có thể tạo một trò chơi tùy chỉnh với connectn.game.CustomGame
lớp, bạn có thể xem điểm số và người chiến thắng của mỗi vòng. Bạn thậm chí có thể thêm mình vào hỗn hợp với UserBot
.
Thêm bot của bạn:
Để thêm bot của bạn vào đội hình, hãy chuyển đến PlayerFactory
khối tĩnh và thêm dòng sau:
playerCreator.put(MyBot.class, MyBot::new);
Những điều khác cần lưu ý:
- Các mô phỏng là đa luồng. Nếu bạn muốn tắt nó đi, hãy đến
Runner#runGames()
và bình luận dòng này (.parallel()
). - Để thay đổi số lượng trò chơi, hãy đặt
Runner#MINIMUM_NUMBER_OF_GAMES
theo ý thích của bạn.
Đã thêm sau:
- Giao tiếp giữa các bot không được phép.
Liên quan: Chơi Kết nối 4!
================================
Bảng điểm: (100 000 trò chơi)
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
lớp để xem tất cả các phương thức có sẵn.
ensureValidMove
(trừ khi chiến lược của bạn là vượt qua lượt này tất nhiên).