ChessLang 방향 시스템 완전 레퍼런스

방향 레퍼런스

방향은 기물이 보드를 가로질러 이동하는 방법을 정의합니다. ChessLang은 절대 및 상대 방향 시스템을 모두 제공합니다.

절대 방향

절대 방향은 어떤 플레이어가 이동하든 동일합니다.

직선 방향

방향벡터설명
N(0, +1)북 (랭크 8 방향)
S(0, -1)남 (랭크 1 방향)
E(+1, 0)동 (파일 h 방향)
W(-1, 0)서 (파일 a 방향)
chesslang
piece Rook {
  move: slide(N) | slide(S) | slide(E) | slide(W)
}

대각선 방향

방향벡터설명
NE(+1, +1)북동
NW(-1, +1)북서
SE(+1, -1)남동
SW(-1, -1)남서
chesslang
piece Bishop {
  move: slide(NE) | slide(NW) | slide(SE) | slide(SW)
}

방향 그룹

그룹포함설명
orthogonalN, S, E, W모든 직선 방향
diagonalNE, NW, SE, SW모든 대각선 방향
any모두 8모든 방향
chesslang
piece Queen {
  move: slide(orthogonal) | slide(diagonal)
  # 다음과 동일: slide(any)
}

piece King {
  move: step(any)
}

상대 방향

상대 방향은 어떤 플레이어가 이동하는지에 따라 달라집니다. 흑에게는 자동으로 뒤집힙니다.

플레이어 기준 방향

방향설명
forwardNS상대 쪽으로
backwardSN자기 쪽으로
leftWE플레이어의 왼쪽
rightEW플레이어의 오른쪽
chesslang
piece Pawn {
  move: step(forward)           # 백은 N, 흑은 S
  capture: step(forward-left) | step(forward-right)
}

상대 대각선 방향

방향설명
forward-leftNWSE앞 왼쪽
forward-rightNESW앞 오른쪽
backward-leftSWNE뒤 왼쪽
backward-rightSENW뒤 오른쪽
chesslang
piece Pawn {
  capture: step(forward-left) | step(forward-right)
}

방향 시각화

백 플레이어 기준

text
NW   N   NE
      ↖  ↑  ↗
   W ← [P] → E
      ↙  ↓  ↘
    SW   S   SE

흑 플레이어 기준

text
SE   S   SW
      ↖  ↑  ↗
   E ← [P] → W
      ↙  ↓  ↘
    NE   N   NW

참고: 상대 방향은 뒤집혀서 forward는 항상 상대를 향합니다.

패턴과 방향 사용

step

고정된 수의 칸을 이동합니다:

chesslang
# 모든 방향으로 1칸
step(any)

# 앞으로 2칸
step(forward, 2)

# 대각선으로 1칸
step(diagonal)

slide

막힐 때까지 여러 칸을 이동합니다:

chesslang
# 직선 방향으로 슬라이드 (룩)
slide(orthogonal)

# 대각선으로 슬라이드 (비숍)
slide(diagonal)

# 모든 방향으로 슬라이드 (퀸)
slide(any)

방향 조합

|를 사용하여 여러 방향을 조합합니다:

chesslang
# 룩 이동
move: slide(N) | slide(S) | slide(E) | slide(W)

# 다음과 동일
move: slide(orthogonal)

방향 수정자

거리

step으로 정확한 거리를 지정합니다:

chesslang
step(N)        # 북으로 1칸
step(N, 2)     # 북으로 2칸
step(N, 3)     # 북으로 3칸

최대 거리

슬라이드 거리를 제한합니다:

chesslang
slide(orthogonal, 3)    # 최대 3칸 슬라이드

커스텀 방향

표준 방향에 맞지 않는 이동은 leap을 사용합니다:

chesslang
# 나이트의 L자형
leap(2, 1)    # 8가지 회전 모두 포함

# 캐멀
leap(3, 1)

# 제브라
leap(3, 2)

# 기린
leap(4, 1)

leap 함수는 자동으로 모든 대칭 위치를 생성합니다:

  • (2, 1), (-2, 1), (2, -1), (-2, -1)
  • (1, 2), (-1, 2), (1, -2), (-1, -2)

예시

표준 기물

chesslang
# 킹 - 모든 방향으로 1칸
piece King {
  move: step(any)
  traits: [royal]
}

# 퀸 - 모든 방향으로 슬라이드
piece Queen {
  move: slide(any)
}

# 룩 - 직선으로 슬라이드
piece Rook {
  move: slide(orthogonal)
}

# 비숍 - 대각선으로 슬라이드
piece Bishop {
  move: slide(diagonal)
}

# 나이트 - L자형 점프
piece Knight {
  move: leap(2, 1)
  traits: [jump]
}

# 폰 - 앞으로 이동
piece Pawn {
  move: step(forward) where empty
  move: step(forward, 2) where first_move and clear
  capture: step(forward-left) | step(forward-right)
  traits: [promote]
}

페어리 기물

chesslang
# 아마존 - 퀸 + 나이트
piece Amazon {
  move: slide(any) | leap(2, 1)
}

# 챈슬러 - 룩 + 나이트
piece Chancellor {
  move: slide(orthogonal) | leap(2, 1)
}

# 대주교 - 비숍 + 나이트
piece Archbishop {
  move: slide(diagonal) | leap(2, 1)
}

# 캐멀 - (3,1) 점프
piece Camel {
  move: leap(3, 1)
  traits: [jump]
}

# 제브라 - (3,2) 점프
piece Zebra {
  move: leap(3, 2)
  traits: [jump]
}

커스텀 이동

chesslang
# 베를리나 폰 - 대각선 이동, 앞으로 잡기
piece BerolinaPawn {
  move: step(forward-left) | step(forward-right) where empty
  capture: step(forward) where enemy
  traits: [promote]
}

# 그리폰 - 대각선 후 직선
piece Gryphon {
  move: step(diagonal) + slide(orthogonal)
}

# 와지르 - 직선으로 1칸
piece Wazir {
  move: step(orthogonal)
}

# 페르즈 - 대각선으로 1칸
piece Ferz {
  move: step(diagonal)
}

참고