함수형 프로그래밍 언어 Elixir에서 간단한 MiniMax 구현을 만들고 있습니다. 완벽한 지식 게임 (tic tac toe, connect-four, checker, chess 등)이 많으므로이 구현은 이러한 게임 중 하나에 대한 게임 AI를 만들기위한 프레임 워크가 될 수 있습니다.
그러나 내가 직면하고있는 한 가지 문제는 기능적 언어로 게임 상태를 올바르게 저장하는 방법입니다. 이러한 게임은 주로 다음과 같은 작업이 빈번한 2 차원 게임 보드를 처리합니다.
- 특정 보드 위치의 내용을 읽습니다.
- 특정 보드 위치의 내용을 업데이트합니다 (새로운 이동 가능성을 반환 할 때)
- 현재 위치 (즉, 다음 또는 이전의 수평, 수직 또는 대각선 위치)에 연결된 하나 이상의 위치의 내용을 고려
- 여러 방향으로 연결된 여러 위치의 내용을 고려합니다.
- 전체 파일, 순위 및 대각선의 내용을 고려합니다.
- 보드 회전 또는 미러링 (이미 계산 된 것과 동일한 결과를 제공하는 대칭을 확인하기 위해)
대부분의 기능적 언어는 링크 된 목록 및 튜플을 다중 요소 데이터 구조의 기본 빌딩 블록으로 사용합니다. 그러나 이것들은 일을 위해 매우 나쁘게 보입니다.
- 연결된 목록 에는 O (n) (선형) 조회 시간이 있습니다. 또한 보드 위의 단일 스윕으로 '보드를 스캔하고 업데이트'할 수 없으므로 목록을 사용하는 것은 매우 비현실적입니다.
- 튜플 에는 O (1) (일정한) 조회 시간이 있습니다. 그러나 보드를 고정 크기 튜플로 표시하면 순위, 파일, 대각선 또는 다른 종류의 연속 정사각형을 반복하는 것이 매우 어렵습니다. 또한 Elixir와 Haskell (내가 알고있는 두 가지 기능 언어) 은 튜플 의 n 번째 요소 를 읽는 구문이 부족합니다 . 이로 인해 임의 크기의 보드에 적합한 동적 솔루션을 작성할 수 없습니다.
Elixir에는 O (log n) (logarithmic) 요소에 대한 액세스를 허용 하는 내장 Map 데이터 구조 (And Haskell has Data.Map
)가 있습니다. 지금 x, y
은 위치를 키로 나타내는 튜플이 있는 맵을 사용 합니다.
이 '작동'하지만 왜 그런지 정확히 알지 못하지만 이런 식으로 맵을 남용하는 것은 잘못된 느낌입니다. 함수형 프로그래밍 언어로 2 차원 게임 보드를 저장하는 더 좋은 방법을 찾고 있습니다.