프로시저럴 체스 플레이어 (Procedural Chess Player) 코드 스니펫
요약
본 문서는 주어진 포지션과 이동 기록을 바탕으로 표준 체스를 플레이하는 'Procedural Chess Player'의 코드 스니펫을 소개합니다. 이 시스템은 명시적인 전술적/전략적 검색을 통해 수를 선택하며, 점진적인 규칙 라우팅(progressive rule routing) 방식을 사용하여 체스 규칙의 합법성을 엄격하게 유지합니다.
핵심 포인트
- 점진적 규칙 라우팅(Progressive Rule Routing)을 사용해 상태 이탈 및 비합법적 움직임을 방지함.
- FIDE 표준에 따른 체크, 캐슬링, 엔 파상 등 모든 체스 규칙을 지원함.
- 다양한 이벤트(NEW_GAME, OPPONENT_MOVE 등) 발생 시 적절한 루팅 경로를 거쳐 처리됨.
- 체스 게임의 상태 관리와 수 생성 과정을 모듈화하여 설계된 구조임.
@ChombaBupe 제가 원한다면 이걸 작동하게 만들 수 있을 거예요... 채팅에서 한 번에 시도해봤어요 ㅋㅋ. 참고로, 이런 기술은 제대로 작동시키려면 여러 단계의 과정과 사람의 편집이 필요해요. 이건 저의 첫 번째 작업물이에요. 그렇지 않으면 정말 좋게 만드는 데는 너무 많은 노력이 들 거예요. 누가 이걸 가지고 재미있게 만져보는 걸 보고 싶네요.
"name: procedural-chess-player
description: 주어진 포지션이나 이동 기록을 바탕으로 표준 체스를 플레이합니다. 정확한 보드 상태를 유지하고, 합법적인 수만 생성합니다. 명시적인 전술적 및 전략적 검색을 통해 수를 선택합니다. 지원되지 않는 체스 규칙, 불가능한 기물 움직임, 그리고 상태 이탈(state drift)을 방지하기 위해 점진적인 규칙 라우팅(progressive rule routing)을 사용합니다.
version: 0.1.0
Procedural Chess Player
PROCEDURAL_FORM = CONTROLLED_PROCEDURAL_LANGUAGE
RULESET = STANDARD_CHESS
정통 체스 수의 합법성을 사용합니다. FIDE는 아래에 명시된 합법적인 움직임, 공격, 체크, 캐슬링(castling), 엔 파상(en passant), 승진(promotion), 반복 및 무승부 조건을 정의합니다. 국제 체스 연맹 (FIDE)
ROUTING
Routing State
EVENT ∈ {NEW_GAME, NEW_POSITION, OPPONENT_MOVE, OUR_TURN, CANDIDATE_MOVE, MOVE_APPLIED, OUTPUT_REQUEST}
PIECE_TYPE ∈ {KING, QUEEN, ROOK, BISHOP, KNIGHT, PAWN}
SPECIAL_MOVE ∈ {NONE, CASTLE_KINGSIDE, CASTLE_QUEENSIDE, EN_PASSANT, PROMOTION}
ROUTE_TARGET ∈ {INITIALIZE, INGEST_POSITION, INGEST_MOVE, POSITION_AUDIT, GENERATE_MOVES, KING_RULES, QUEEN_RULES, ROOK_RULES, BISHOP_RULES, KNIGHT_RULES, PAWN_RULES, CASTLING_RULES, EN_PASSANT_RULES, PROMOTION_RULES, ATTACK_MAP, LEGALITY_FILTER, TERMINAL_CHECK, SEARCH, APPLY_MOVE, FORMAT_MOVE, ERROR}
Procedure ROUTE
WHEN EVENT = NEW_GAME
THEN ROUTE to INITIALIZE.
WHEN EVENT = NEW_POSITION
THEN ROUTE to INGEST_POSITION.
WHEN EVENT = OPPONENT_MOVE
THEN ROUTE to INGEST_MOVE.
WHEN INGEST_POSITION completes
THEN ROUTE to POSITION_AUDIT.
WHEN INGEST_MOVE completes
THEN ROUTE to POSITION_AUDIT.
WHEN POSITION_AUDIT confirms STATUS = ACTIVE
AND SIDE_TO_MOVE = OUR_COLOR
THEN ROUTE to GENERATE_MOVES.
후보 이동(CANDIDATE_MOVE)이 킹(KING)을 사용하면
THEN ROUTE to KING_RULES.
후보 이동(CANDIDATE_MOVE)이 퀸(QUEEN)을 사용하면
THEN ROUTE to QUEEN_RULES.
후보 이동(CANDIDATE_MOVE)이 룩(ROOK)을 사용하면
THEN ROUTE to ROOK_RULES.
후보 이동(CANDIDATE_MOVE)이 비숍(BISHOP)을 사용하면
THEN ROUTE to BISHOP_RULES.
후보 이동(CANDIDATE_MOVE)이 나이트(KNIGHT)를 사용하면
THEN ROUTE to KNIGHT_RULES.
후보 이동(CANDIDATE_MOVE)이 폰(PAWN)을 사용하면
THEN ROUTE to PAWN_RULES.
SPECIAL_MOVE가 캐슬링(CASTLE_KINGSIDE)이거나 SPECIAL_MOVE가 캐슬링(CASTLE_QUEENSIDE)이면
THEN ROUTE to CASTLING_RULES.
SPECIAL_MOVE가 앙파상(EN_PASSANT)이면
THEN ROUTE to EN_PASSANT_RULES.
SPECIAL_MOVE가 승진(PROMOTION)이면
THEN ROUTE to PROMOTION_RULES.
임시 합법 이동(pseudo-legal move)이 구성되면
THEN ROUTE to LEGALITY_FILTER.
LEGAL_MOVES가 완료되면
THEN ROUTE to TERMINAL_CHECK.
STATUS가 ACTIVE이고
SIDE_TO_MOVE가 OUR_COLOR이며
LEGAL_MOVES가 완료되면
THEN ROUTE to SEARCH.
SEARCH가 SELECTED_MOVE를 선택하면
THEN ROUTE to APPLY_MOVE.
APPLY_MOVE가 SELECTED_MOVE를 검증하면
THEN ROUTE to FORMAT_MOVE.
모호성(ambiguity)으로 인해 합법 이동 생성에 변화가 생기면
THEN ROUTE to ERROR.
RETURN.
STATE
COLOR는 {WHITE, BLACK} 중 하나이다.
SQUARE는 FILE + RANK로 구성된다.
FILE은 {a,b,c,d,e,f,g,h} 중 하나이다.
RANK는 {1,2,3,4,5,6,7,8} 중 하나이다.
BOARD[SQUARE]는 {EMPTY, PIECE} 중 하나이다.
PIECE는 {COLOR, PIECE_TYPE}으로 구성된다.
SIDE_TO_MOVE는 {WHITE, BLACK} 중 하나이다.
OUR_COLOR는 {WHITE, BLACK} 중 하나이다.
OPPONENT_COLOR는 OUR_COLOR의 반대 색상이다.
CASTLING_RIGHTS는 {WHITE_KINGSIDE, WHITE_QUEENSIDE, BLACK_KINGSIDE, BLACK_QUEENSIDE}의 부분집합이다.
EN_PASSANT_TARGET은 {SQUARE, NONE} 중 하나이다.
HALFMOVE_CLOCK은 {INTEGER, UNKNOWN} 중 하나이다.
FULLMOVE_NUMBER는 {INTEGER, UNKNOWN} 중 하나이다.
POSITION_HISTORY는 POSITION_KEY의 순서가 있는 컬렉션이다.
LEGAL_MOVES는 MOVE의 컬렉션이다.
STATUS는 {ACTIVE, CHECKMATE, STALEMATE, DEAD_POSITION, DRAW_FIVEFOLD, DRAW_75_MOVE, DRAW_CLAIMABLE, AMBIGUOUS} 중 하나이다.
MOVE는 {SOURCE, DESTINATION, PIECE_TYPE, COLOR, CAPTURE, SPECIAL_MOVE, PROMOTION_TYPE}으로 구성된다.
PROMOTION_TYPE은 {QUEEN, ROOK, BISHOP, KNIGHT, NONE} 중 하나이다.
정의되지 않은 상태 값(undefined state value)을 사용하지 마라.
RETURN.
CORE BOARD GEOMETRY
White는 증가하는 랭크 번호 방향으로 이동한다.
Black은 감소하는 랭크 번호 방향으로 이동한다.
White는 랭크 1과 2에 배치된다.
Black은 랭크 8과 7에 배치된다.
초기 White 후방 열(back rank)은 다음과 같다:
a1 ROOK
b1 KNIGHT
c1 BISHOP
d1 QUEEN
e1 KING
f1 BISHOP
g1 KNIGHT
h1 ROOK
White 폰을 랭크 2에 배치한다.
초기 Black 후방 열은 다음과 같다:
a8 ROOK
b8 KNIGHT
c8 BISHOP
d8 QUEEN
e8 KING
f8 BISHOP
g8 KNIGHT
h8 ROOK
Black 폰을 랭크 7에 배치한다.
아군 말이 점유한 칸에는 적군 말을 놓지 못하게 한다.
합법적인 포획 이동이 해당 칸으로 이루어질 때 적군 말을 제거한다.
킹은 포획하지 않는다.
체크메이트(checkmate) 시 게임을 종료한다.
RETURN.
PROCEDURE INITIALIZE
BOARD를 표준 초기 위치로 설정한다.
SIDE_TO_MOVE = WHITE로 설정한다.
네 가지 캐슬링 권리(castling rights)를 모두 설정한다.
EN_PASSANT_TARGET = NONE으로 설정한다.
HALFMOVE_CLOCK = 0으로 설정한다.
FULLMOVE_NUMBER = 1로 설정한다.
초기 POSITION_KEY를 생성한다.
초기 POSITION_KEY를 POSITION_HISTORY에 추가한다.
STATUS = ACTIVE로 설정한다.
RETURN.
PROCEDURE INGEST_POSITION
만약 유효한 FEN이 제공되면
THEN 보드 필드를 파싱(parse)한다.
THEN SIDE_TO_MOVE를 파싱한다.
THEN CASTLING_RIGHTS를 파싱한다.
THEN EN_PASSANT_TARGET을 파싱한다.
THEN HALFMOVE_CLOCK을 파싱한다.
THEN FULLMOVE_NUMBER를 파싱한다.
만약 초기 위치부터 완전한 이동 기록(move history)이 제공되면
THEN 모든 합법적인 이동을 재연하여 위치를 재구성한다.
명시적인 보드(board)가 제공되면
THEN 제공된 모든 말을 정확한 칸에 매핑한다.
만약 SIDE_TO_MOVE를 결정할 수 없다면
THEN STATUS = AMBIGUOUS로 설정하고
STOP한다.
만약 캐슬링 기록을 결정할 수 없고
캐슬링 권리가 현재 합법적인 이동에 영향을 미칠 수 있다면
THEN STATUS = AMBIGUOUS로 설정하고
STOP한다.
만약 en-passant 기록을 결정할 수 없고
en passant가 현재 합법적인 이동에 영향을 미칠 수 있다면
THEN STATUS = AMBIGUOUS로 설정하고
STOP한다.
반복(repetition) 기록이 이용 불가능하면
반복 상태를 UNKNOWN으로 표시한다.
만약 halfmove clock이 이용 불가능하면
HALFMOVE_CLOCK = UNKNOWN으로 설정한다.
누락된 기록을 임의로 만들지 않는다.
RETURN.
PROCEDURE POSITION_AUDIT
정확히 하나의 White 킹을 요구한다.
필수 사항: 정확히 하나의 Black 킹을 요구한다.
모든 점유된 칸은 정확히 하나의 기물을 포함해야 한다.
모든 기물은 한 가지 색상을 가져야 한다.
모든 기물은 한 가지 기물 유형을 가져야 한다.
SIDE_TO_MOVE가 정의되어 있어야 한다.
만약 두 킹이 이전의 합법적인 이동 수열에서 동시에 법적 체크 상태에 있다면, 해당 포지션을 거부한다.
단순히 재료 개수가 초기 포지션과 다르다는 이유로 제공된 포지션을 거부하지 않는다.
두 킹 모두에 대한 공격을 계산한다.
현재의 체크 상태를 설정한다.
RETURN.
공격 규칙 (ATTACK RULES)
Procedure ATTACK_MAP
ATTACKING_COLOR의 모든 기물에 대해 현재 보드 지오메트리로부터 공격받는 칸을 계산한다.
비숍(bishop)의 경우
각 대각선 광선을 추적한다.
첫 번째 점유된 칸에서 비숍 광선을 멈춘다.
첫 번째 점유된 칸을 공격 지도에 포함시킨다.
룩(rook)의 경우
각 행과 열 광선을 추적한다.
첫 번째 점유된 칸에서 룩 광선을 멈춘다.
첫 번째 점유된 칸을 공격 지도에 포함시킨다.
퀸(queen)의 경우
비숍 광선과 룩 광선을 결합한다.
나이트(knight)의 경우
변위 (±1, ±2) 또는 (±2, ±1)에 있는 모든 보드 칸을 포함시킨다.
킹(king)의 경우
모든 인접한 보드 칸을 포함시킨다.
White 폰(pawn)의 경우
한 행 높은 두 대각선 칸을 포함시킨다.
Black 폰(pawn)의 경우
한 행 낮은 두 대각선 칸을 포함시킨다.
폰의 전진 이동 칸을 공격받는 칸으로 취급하지 않는다.
캐슬링은 공격으로 포함시키지 않는다.
공격하는 기물이 자신의 킹을 노출시키는 이유로 법적으로 움직일 수 없더라도, 해당 칸을 공격받는 것으로 간주한다. International Chess Federation (FIDE)
RETURN.
기물 규칙 (PIECE RULES)
Procedure BISHOP_RULES
목적지가 출처와 달라야 한다.
절대 열 변위가 절대 행 변위와 같아야 한다.
모든 중간 대각선 칸은 비어 있어야 한다.
목적지는 비어 있거나 적이 점유해야 한다.
의사 합법적인 이동을 구성한다.
RETURN.
Procedure ROOK_RULES
도착지는 출발지와 달라야 한다.
출발지 파일과 도착지 파일이 같거나
출발지 랭크와 도착지 랭크가 같은 것을 요구한다.
모든 중간 칸은 비어 있어야 한다.
도착지가 비어 있거나 적이 점유해야 한다.
의사 합법적인 이동을 구성한다.
반환한다.
절차 QUEEN_RULES
만약 이동이 대각선이라면
BISHOP_RULES를 적용한다.
만약 이동이 직교(orthogonal)라면
ROOK_RULES를 적용한다.
만약 이동이 대각선도 직교도 아니라면
후보를 거부한다.
반환한다.
절차 KNIGHT_RULES
절대 파일 변위를 계산한다.
절대 랭크 변위를 계산한다.
변위가 (1,2)이거나
변위가 (2,1)이어야 한다.
중간에 있는 말들은 무시한다.
도착지가 비어 있거나 적이 점유해야 한다.
의사 합법적인 이동을 구성한다.
반환한다.
절차 KING_RULES
만약 킹이 어떤 방향으로 정확히 한 칸 움직인다면
도착지가 비어 있거나 적이 점유할 것을 요구한다.
그다음 의사 합법적인 이동을 구성한다.
그다음 그 이동을 LEGALITY_FILTER를 통해 경로 지정한다.
만약 킹이 원래 위치에서 두 파일 움직인다면
그 이동을 캐슬링(castling)으로 분류한다.
그다음 CASTLING_RULES로 경로 지정한다.
다른 모든 킹의 변위는 거부한다.
반환한다.
절차 PAWN_RULES
FORWARD를 백에게는 +1 랭크로 설정한다.
FORWARD를 흑에게는 -1 랭크로 설정한다.
START_RANK를 백에게는 2로 설정한다.
START_RANK를 흑에게는 7로 설정한다.
PROMOTION_RANK를 백에게는 8로 설정한다.
PROMOTION_RANK를 흑에게는 1로 설정한다.
만약 폰이 같은 파일에서 한 칸 앞으로 움직인다면
도착지가 비어 있어야 한다.
만약 폰이 같은 파일에서 두 칸 앞으로 움직인다면
폰이 START_RANK에 위치해야 한다.
그다음 중간 칸이 비어 있어야 한다.
그다음 도착 칸이 비어 있어야 한다.
만약 폰이 대각선으로 한 파일 이동하고
한 랭크 앞으로 이동하며
도착지에 적 말이 포함되어 있다면
그 이동을 일반 포획(normal capture)으로 분류한다.
만약 폰이 대각선으로 한 파일 이동하고
한 랭크 앞으로 이동하며
도착지가 비어 있고
도착지가 EN_PASSANT_TARGET과 같다면
그 이동을 앙파상(EN_PASSANT)으로 분류한다.
만약 폰이 승진 랭크(PROMOTION_RANK)에 도달하면
그 이동을 승진(PROMOTION)으로 분류한다.
다른 모든 폰의 이동은 거부한다.
반환한다.
특별 규칙 (SPECIAL RULES)
앙파상 규칙 (Procedure EN_PASSANT_RULES)
이동하는 말이 폰이어야 한다.
EN_PASSANT_TARGET이 도착지와 같아야 한다.
도착지 칸이 비어 있어야 한다.
적군 폰이 도착지 뒤쪽 인접 칸을 차지하고 있어야 한다.
그 적군 폰이 시작 랭크에서 방금 두 칸 전진했어야 한다.
시뮬레이션 동안 포획된 폰을 실제 위치에서 제거한다.
포획하는 폰을 EN_PASSANT_TARGET으로 이동시킨다.
포획된 폰을 제거한 후 왕의 안전도를 재계산한다.
만약 포획 후에 공격받는 쪽의 왕이 공격받으면 그 이동은 거부한다.
앙파상은 적군 폰이 두 칸 전진한 직후에만 가능하다. 국제 체스 연맹(FIDE)
반환한다.
승진 규칙 (Procedure PROMOTION_RULES)
이동하는 말이 폰이어야 한다.
폰이 가장 먼 랭크에서 끝나야 한다.
PROMOTION_TYPE ∈ {퀸, 룩, 비숍, 나이트}여야 한다.
폰을 제거한다.
선택된 승진 말(piece)을 도착지에 배치한다.
승진한 말의 효과를 즉시 적용한다.
이러한 승진 유형을 선택하기 전에 이전에 포획된 말이 존재할 필요는 없다. 국제 체스 연맹(FIDE)
반환한다.
캐슬링 규칙 (Procedure CASTLING_RULES)
백(White)의 킹사이드 캐슬링:
WHITE_KINGSIDE가 CASTLING_RIGHTS에 속해야 한다.
백 왕이 e1에 있어야 한다.
백 룩이 h1에 있어야 한다.
f1이 비어 있어야 한다.
g1이 비어 있어야 한다.
e1이 공격받지 않아야 한다.
f1이 공격받지 않아야 한다.
g1이 공격받지 않아야 한다.
왕을 e1 → g1로 이동시킨다.
룩을 h1 → f1로 이동시킨다.
백(White)의 퀸사이드 캐슬링:
WHITE_QUEENSIDE가 CASTLING_RIGHTS에 속해야 한다.
백 왕이 e1에 있어야 한다.
백 룩이 a1에 있어야 한다.
b1이 비어 있어야 한다.
c1이 비어 있어야 한다.
d1이 비어 있어야 한다.
e1이 공격받지 않아야 한다.
d1이 공격받지 않아야 한다.
c1이 공격받지 않아야 한다.
왕을 e1 → c1로 이동시킨다.
룩을 a1 → d1로 이동시킨다.
흑(Black)의 킹사이드 캐슬링:
BLACK_KINGSIDE가 CASTLING_RIGHTS에 속해야 한다.
검은 킹을 e8에 요구한다.
검은 룩을 h8에 요구한다.
f8이 비어있어야 한다.
g8이 비어있어야 한다.
e8이 공격받지 않아야 한다.
f8이 공격받지 않아야 한다.
g8이 공격받지 않아야 한다.
킹을 e8 → g8로 이동시킨다.
룩을 h8 → f8로 이동시킨다.
검은 퀸사이드 캐슬링의 경우:
BLACK_QUEENSIDE가 CASTLING_RIGHTS에 속해야 한다.
검은 킹을 e8에 요구한다.
검은 룩을 a8에 요구한다.
b8이 비어있어야 한다.
c8이 비어있어야 한다.
d8이 비어있어야 한다.
e8이 공격받지 않아야 한다.
d8이 공격받지 않아야 한다.
c8이 공격받지 않아야 한다.
킹을 e8 → c8로 이동시킨다.
룩을 a8 → d8로 이동시킨다.
룩 자체가 비공격 상태일 것을 요구하지 않는다.
킹이 체크 상태일 때 캐슬링하는 것을 허용하지 않는다.
체크를 거쳐서 캐슬링하는 것을 허용하지 않는다.
체크 상태인 곳으로 캐슬링하는 것을 허용하지 않는다. International Chess Federation (FIDE)
반환(RETURN).
PROCEDURE GENERATE_MOVES
LEGAL_MOVES를 {}로 설정한다.
SIDE_TO_MOVE에 속하는 모든 기물을 열거한다.
AI 자동 생성 콘텐츠
본 콘텐츠는 X Unity/게임개발의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기