https://en.wikipedia.org/wiki/Losing_chess
นี่เป็นพื้นฐานการแข่งขันหมากรุกแต่สำหรับความเป็นปฏิปักษ์;)
Antichess เป็นหนึ่งในเกมหมากรุกที่ได้ถูกประดิษฐ์ขึ้น เป้าหมายคือการสูญเสียชิ้นส่วนทั้งหมดของคุณ (ซึ่งอาจดูแปลก ๆ เล็กน้อย แต่มันเรียกว่า antichess ด้วยเหตุผล)
กฎระเบียบ
กฎของ antichess นั้นคล้ายกับหมากรุกมาตรฐาน - แต่มีความแตกต่างเล็กน้อยเล็กน้อย เป้าหมายที่ฉันกล่าวถึงข้างต้นคือการสูญเสียชิ้นส่วนทั้งหมดของคุณ ในการทำให้สิ่งนี้เกิดขึ้นถ้าคู่ต่อสู้ของคุณมีโอกาสที่จะจับชิ้นส่วนหนึ่งของคุณนั่นเป็นเพียงการเคลื่อนไหวเดียวที่เขาสามารถทำได้ หากคุณให้โอกาสเขาหลายครั้งในคราวเดียวผู้เล่นคนอื่นอาจเลือกตาเขาได้ อีกสิ่งหนึ่งที่เปลี่ยนไปคือราชาไม่มีพลังพิเศษ - ในขณะที่คุณไม่สามารถรุกฆาตคู่ต่อสู้ของคุณและคุณไม่สามารถบังคับให้เขาตรวจสอบ
การเปลี่ยนแปลงต่อไปนี้สำหรับเกมมาตรฐานจะมีผลบังคับใช้ด้วย (จะช่วยทำให้เกมง่ายขึ้น):
- En passantจะถูกละเว้น
- การขว้างเป็นไปไม่ได้
- กฎห้าสิบย้ายนำไปใช้โดยอัตโนมัติ (หมายถึงเกมสิ้นสุดในการวาด)
- ผู้จำนำจะสามารถเลือกสิ่งที่พวกเขาส่งเสริม
- หากผู้เล่นต้องการความเคลื่อนไหวนานกว่า 2 วินาทีเขาจะแพ้ในเกม
- การคืนการย้ายที่ไม่ถูกต้องจะส่งผลให้สูญเสียเกม
- ที่จะชนะฝ่ายตรงข้ามของคุณจะต้องจับชิ้นส่วนทั้งหมดของคุณ
- ขาวเริ่มเกม
- สีขาวถูกวางไว้ "ที่ด้านล่าง" ของฟิลด์ (y = 0) สีดำจะอยู่ที่ด้านบน (y = 7)
- การเข้าถึงทรัพยากรอื่น ๆ นอกเหนือจากบอทของคุณ (อินเทอร์เน็ต, ไฟล์, บอทอื่น ๆ , ... ) เป็นสิ่งต้องห้าม
เกณฑ์การให้คะแนน
- ผู้ชนะจะได้รับ 3 คะแนนเสมอ 1 คะแนนและเสีย 0 คะแนน
- การส่งแต่ละครั้งจะเล่นกับการส่งอื่น ๆ 10 ครั้ง (สีขาว 5 ครั้ง, 5 สีดำ)
กำลังเขียนบอทของคุณ
รหัสคอนโทรลเลอร์อยู่ที่นี่: https://github.com/JJ-Atkinson/SimpleAntichessKOTH
คุณสามารถเขียน bot ของคุณใน Java หรือ Groovy ในการเขียนบอทคุณต้องขยายPlayer
ชั้นเรียน Move getMove(Board board, Player enemy, Set<Move> validMoves)
ชั้นผู้เล่นที่มีวิธีนามธรรมหนึ่ง
นี่คือบทสรุปอย่างรวดเร็วเกี่ยวกับวิธีการที่มีประโยชน์:
Player
:
List<Piece> getPieces(Board board)
: คืนชิ้นส่วนทั้งหมดของคุณที่อยู่บนกระดานPieceUpgradeType pieceUpgradeType
: หาก / เมื่อเบี้ยหนึ่งใบของคุณถึงจุดสิ้นสุดของกระดานคุณจะต้องกำหนดสิ่งนี้เป็นประเภทของชิ้นส่วนที่คุณต้องการอัปเกรด คุณมีทางเลือกของROOK
,KNIGHT
,QUEEN
, และBISHOP
KING
Board
:
Field getFieldAtLoc(Location loc)
: ส่งคืนField
ที่ตำแหน่ง นี่เป็นgetAt
วิธีการจับคู่ดังนั้นถ้าคุณใช้ groovy คุณสามารถเขียนboard[loc]
ได้Field getFieldAtLoc(int x, int y)
: ส่งคืนField
ที่ตำแหน่ง นี่เป็นgetAt
วิธีการจับคู่ดังนั้นถ้าคุณใช้ groovy คุณสามารถเขียนboard[x, y]
ได้Board movePiece(Player player, Move move)
: ทำการย้ายบนกระดานเพื่อให้คุณสามารถดูว่ามันจะเล่นออกมา ส่งคืนบอร์ดใหม่
enemy.getPieces(board)
หากคุณต้องการที่จะเห็นฝ่ายตรงข้ามของชิ้นเพียงเขียน ในการเพิ่มบ็อตของคุณไปยังรายการเพิ่มบรรทัดต่อไปนี้ไปที่PlayerFactory
:
put(YourBot.class, { new YourBot() } )
การดีบัก ธ ปทของคุณ:
ฉันได้รวมเครื่องมือสองอย่างเพื่อช่วยในการดีบักบ็อตของคุณ หากต้องการดูเกมของคุณเล่นสดคุณสามารถตั้งค่าGame#DEBUG
สถานะเป็นจริง คุณจะได้ผลลัพธ์ดังนี้:
Game started. Players: [OnePlayBot(WHITE), SacrificeBot(BLACK)]
...
BLACKs turn.
validMoves: [Move(Piece(BLACK, PAWN, Loc(0, 6)), Loc(0, 5)), ...]
board:
RKBQIBKR
PPPPPPPP
--------
--------
--------
p-------
-ppppppp
rkbqibkr
captureless turns: 1
chosen move: Move(Piece(BLACK, PAWN, Loc(7, 6)), Loc(7, 4))
Game over? false
==============================
WHITEs turn.
validMoves: [Move(Piece(WHITE, ROOK, Loc(0, 0)), Loc(0, 1)), ...]
board:
RKBQIBKR
PPPPPPP-
--------
-------P
--------
p-------
-ppppppp
rkbqibkr
...
(สีขาวเป็นตัวพิมพ์ใหญ่กษัตริย์จะแสดงพร้อมi
)
หากคอนโซลของคุณรองรับตัวอักษรพิเศษ utf-8 คุณสามารถแสดงบอร์ดด้วยตัวหมากรุกได้โดยใช้Board#USE_UTF8_TO_STRING
:
♜♞♝♛♚♝—♜
♟—♟♟♟♟♟♟
————————
—♟——————
————————
♙———————
—♙♙♙♙♔♙♙
♖♘♗♕—♗♘♖
(ดูดีขึ้นเมื่อใช้แบบอักษรเว้นวรรคแบบเดี่ยว)
เพื่อป้องกันไม่ให้น้ำท่วมของผลลัพธ์ที่ไม่พึงประสงค์คุณควรเปลี่ยนMain#main
ฟังก์ชั่นเป็นดังนี้:
new Game(new MyBot(), new SacrificeBot()).run()
วางบอทของคุณทางซ้ายเพื่อเล่นเป็นสีขาววางไว้ทางด้านขวาเพื่อเล่นเป็นสีดำ
การสร้างตัวควบคุม:
คอนโทรลเลอร์ถูกเขียนเป็น groovy ดังนั้นคุณต้องติดตั้ง java และ groovy หากคุณไม่ต้องการติดตั้ง Groovy คุณสามารถใช้ไฟล์ build gradle ที่มาพร้อมกับคอนโทรลเลอร์ (ยังไม่ได้ทำการทดสอบ) หากคุณไม่ต้องการใช้ Groovy หรือ gradle คุณสามารถใช้ jar รุ่นล่าสุด ( https://github.com/JJ-Atkinson/SimpleAntichessKOTH/releases ) หากคุณทำสิ่งนี้คุณจะต้องสร้างmain
วิธีการของคุณเองและเพิ่มบอทของคุณเองไปยังโรงงานผู้เล่น ตัวอย่าง:
PlayerFactory.players.put(YourBot.class, { new YourBot() } )
new Runner().runGames();
(โปรดทราบว่าคุณยังคงสามารถตั้งค่าสถานะการดีบักและเนื้อหา)
การค้นหาข้อผิดพลาดใด ๆ และทุกคนชื่นชม!
คะแนน:
SearchBot -> 101
SacrificeBot -> 81
MeasureBot -> 37
RandomBot -> 28
OnePlayBot -> 24
โปรดทราบว่าฉันยินดีที่จะมีการส่งใหม่เสมอ!