https://en.wikipedia.org/wiki/Connect_Four
ไม่มีใครจำเกมผู้เล่น 2 คนเชื่อมต่อ 4 ได้หรือไม่? สำหรับผู้ที่ไม่ได้เป็นบอร์ดขนาด 6x7 ที่ยืนอยู่บนพื้นผิว เป้าหมายของการเชื่อมต่อ 4 คือเพื่อเชื่อมต่อ 4 กัน! การเชื่อมต่อจะถูกนับหากเป็นแนวนอนแนวทแยงหรือแนวตั้ง คุณวางชิ้นส่วนของคุณบนกระดานโดยการแทรกชิ้นส่วนที่ด้านบนของคอลัมน์ที่มันอยู่ด้านล่างของคอลัมน์นั้น กฎของเราเปลี่ยน 3 สิ่งในการเชื่อมต่อ 4
- เปลี่ยนอันดับที่ 1 การชนะหมายถึงผู้เล่นที่มีคะแนนมากที่สุด คุณจะได้รับคะแนนจากการเชื่อมต่อ 4 เหมือนในกฎ - เพิ่มเติมในภายหลัง
- เปลี่ยน # 2คุณมีผู้เล่น 3 คนในแต่ละรอบ
- เปลี่ยน # 3ขนาดบอร์ดคือ 9x9
เกณฑ์การให้คะแนน:
คะแนนขึ้นอยู่กับจำนวนที่คุณได้รับในแถว หากคุณมี 4 ในกลุ่มแถวคุณจะได้รับ 1 คะแนน หากคุณมี 5 ในกลุ่มแถวคุณจะได้รับ 2 คะแนน, 6 ในแถวที่ 3 และอื่น ๆ
ตัวอย่าง:
หมายเหตุ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 |_|_|_|#|_|_|_|
ถ้าตอนนี้เราวางชิ้นใน Coll อีกครั้งก็จะได้ที่ดินในสถานที่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
ได้รับ 3 คะแนนสำหรับ 6 ในแถว ( 1c 2c 3c 4c 5c 6c
)
อินพุต / เอาต์พุต
คุณจะสามารถเข้าถึงบอร์ดผ่านอาร์เรย์ 2d แต่ละสถานที่จะถูกแสดงด้วยint
รหัสผู้เล่นที่เป็นตัวแทน คุณจะต้องส่งรหัสผู้เล่นของคุณไปยังฟังก์ชั่นของคุณ คุณทำการย้ายโดยการคืน coll ที่คุณต้องการปล่อยชิ้นส่วนของคุณ ผู้เล่น 3 คนในแต่ละรอบจะได้รับเลือกให้เล่น ในตอนท้ายของเกมผู้เล่นทุกคนจะได้เล่นเกมเป็นจำนวนเท่ากัน
สำหรับช่วงเวลา 100k รอบที่จะทำงาน (โปรดทราบว่าใช้เวลานานคุณอาจต้องการลดความเร็วในการทดสอบการหมุนรอบอย่างรวดเร็ว) โดยรวมผู้ชนะคือผู้เล่นที่ชนะมากที่สุด
ควบคุมสามารถพบได้ที่นี่: https://github.com/JJ-Atkinson/Connect-n/tree/master
เขียนบอท:
ในการเขียนบอทคุณต้องขยายPlayer
ชั้นเรียน เป็นนามธรรมและมีวิธีการหนึ่งในการดำเนินการPlayer
int makeMove(void)
ในตัวmakeMove
คุณคุณจะต้องตัดสินใจว่าคอลไหนที่คุณอยากจะปล่อยให้เป็นชิ้น ๆ หากคุณเลือก Coll ไม่ถูกต้อง (เช่น Coll ไม่ได้อยู่ Coll เต็มไปแล้ว), การเปิดของคุณจะถูกข้ามไป ในPlayer
ชั้นเรียนคุณมีวิธีการช่วยเหลือที่มีประโยชน์มากมาย รายชื่อของคนที่สำคัญที่สุดดังนี้:
boolean ensureValidMove(int coll)
: กลับจริงถ้า coll อยู่บนกระดานและ coll ยังไม่เต็มint[] getBoardSize()
: ส่งคืนอาร์เรย์ int โดยที่[0]
จำนวนคอลัมน์[1]
คือและจำนวนแถวint[][] getBoard()
: คืนสำเนาของคณะกรรมการ[coll number][row number from bottom]
คุณควรจะเข้าถึงได้เช่นนี้- ในการค้นหาส่วนที่เหลือให้ดูที่
Player
ชั้นเรียน EMPTY_CELL
: ค่าของเซลล์ว่าง
ตั้งแต่นี้จะเป็นแบบมัลติเธรดฉันได้รวมrandom
ฟังก์ชั่นถ้าคุณต้องการ
การดีบัก ธ ปทของคุณ:
ฉันรวมบางอย่างไว้ในคอนโทรลเลอร์เพื่อให้ง่ายต่อการดีบักบอท Runner#SHOW_STATISTICS
คนแรกคือ หากเปิดใช้งานสิ่งนี้คุณจะเห็นผลงานพิมพ์ของกลุ่มผู้เล่นที่เล่นรวมถึงจำนวน bot ที่ชนะ ตัวอย่าง:
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
(ยกเว้นว่ากลยุทธ์ของคุณคือผ่านการเปลี่ยนของหลักสูตรนี้)