Hansu-Fairy

한수요정은 전통 한국 장기(장기, Janggi)를 자동으로 플레이하는 봇입니다. 이 프로그램은 NNUE 기반 평가 함수를 활용한 Fairy-Stockfish 엔진을 이용하여 최적의 수를 계산하고, LDPlayer 에뮬레이터에서 실시간으로 자동 플레이를 지원합니다.

주요 특징

  • LDPlayer 화면 실시간 캡처: LDPlayer 에뮬레이터에서 실행 중인 장기판을 실시간으로 캡처하는 고급 이미지 처리 기술을 사용합니다.
  • FEN 포맷 변환: OpenCV 기반의 고성능 템플릿 매칭 알고리즘을 통해 장기판 이미지를 분석하고, 이를 FEN 포맷으로 변환합니다.
  • NNUE 기반 Fairy-Stockfish 엔진: NNUE 기술을 활용해 최적의 수를 계산하며, 높은 정확도와 효율성을 자랑합니다.
  • 자동 플레이: PyAutoGUI를 사용해 LDPlayer에서 자동으로 수를 입력합니다.
  • 상대의 착수 시간 반영: 상대방의 착수 시간을 분석하여 전략적인 대응을 제공합니다.

Coming Soon...

[문의처] 이메일: hansufairy@janggi.xyz

프로그램 흐름

이 프로그램은 여러 모듈이 유기적으로 연결되어 작동하며, LDPlayer에서 장기 게임을 실시간으로 분석하고, Fairy-Stockfish 엔진을 통해 최적의 수를 찾아 자동으로 수를 두는 방식으로 동작합니다. 각 단계는 명확하게 정의되어 있으며, 모듈 간의 데이터 흐름이 원활하게 진행되도록 설계되었습니다.

주요 단계

  • LDPlayer에서 장기판 상태 캡처: 프로그램이 시작되면 main.py에서 screen_handler.py를 호출하여 LDPlayer에서 실행 중인 장기판을 캡처합니다.
  • 장기판 이미지 분석 및 FEN 변환: 캡처된 이미지는 OpenCV 기반으로 분석되며, 이를 FEN 포맷으로 변환합니다.
  • FEN 포맷을 Fairy-Stockfish에 전달하여 최적의 수 계산: 변환된 FEN 포맷은 Fairy-Stockfish 엔진을 통해 최적의 수를 계산합니다.
  • 최적의 수 선택 및 동작: PyAutoGUI를 사용하여 LDPlayer에서 계산된 수를 자동으로 둡니다.
  • 상대방의 수 모니터링 및 자동 수 연속 동작: 상대방의 수를 실시간으로 모니터링하고, 적절한 타이밍에 수를 둡니다.
  • 반복 처리 및 게임 종료: 프로그램은 이 과정을 반복하여 게임을 진행하며, 종료 시 이를 감지하여 동작을 처리합니다.

Coming Soon...

[문의처] 이메일: hansufairy@janggi.xyz

기술적 구현

핵심 알고리즘 및 로직

  • NNUE 기반 연산: Fairy-Stockfish 엔진은 최신 NNUE 방식을 통해 장기판을 빠르고 정확하게 평가하며, 복잡한 포지션에서도 최적의 수를 계산합니다.
  • FEN 변환: OpenCV 기반으로 장기판 이미지를 분석하고, 이를 FEN 포맷으로 변환하여 Fairy-Stockfish 엔진에 전달합니다.
  • 자동 플레이: PyAutoGUI를 사용하여 LDPlayer 창에서 최적의 수를 자동으로 클릭하여 입력합니다.
  • 상대방 시간 반영: 상대방의 착수 시간을 모니터링하고, 나의 계산 시간을 조정하여 자연스러운 게임 진행을 유지합니다.
  • 병렬 연산 및 멀티스레드 최적화: 멀티코어 CPU의 성능을 극대화하기 위해 병렬 연산을 활용하여 빠른 연산을 수행합니다.
  • 고급 GUI 지원: Tkinter 기반의 GUI를 통해 실시간 피드백과 다양한 설정을 조작할 수 있습니다.
  • 동적 리소스 최적화 및 자동 튜닝: 시스템 리소스를 실시간으로 모니터링하여, 최적의 성능을 위해 자동으로 설정을 조정합니다.

Coming Soon...

[문의처] 이메일: hansufairy@janggi.xyz

주요 포인트

  • 최적화된 NNUE 연산: 짧은 시간에도 깊이 15 이상의 탐색을 수행할 수 있는 NNUE 기반 평가 함수로 최적의 수를 계산합니다.
  • 하이퍼파라메터 튜닝: 멀티스레드와 해시 크기 등의 파라메터를 최적화해, 최고의 성능을 발휘하도록 설정합니다.
  • 상대방 착수 시간에 기반한 연산 조정: 상대방의 수에 따라 프로그램의 연산 시간을 동적으로 조정하여 자연스러운 플레이를 유지합니다.
  • 비활성 창에서도 원활한 캡처 및 클릭: 비활성 창에서도 정확한 화면 캡처와 클릭을 수행하여 게임을 중단 없이 진행합니다.
  • 가용 메모리 기반 동적 해시 사이즈 최적화 설정: 시스템 메모리에 따라 해시 크기를 동적으로 조정하여 성능을 최적화합니다.
  • 프로세서 최적화 기반 자동 스레드 관리: 시스템의 물리적 코어와 가상 스레드를 감지하여 최적의 스레드 개수를 설정합니다.
  • 자동 탐색 시간 최적화: 초기 탐색 깊이 분석을 통해 최적의 착수 시간을 자동으로 설정합니다.

Coming Soon...

[문의처] 이메일: hansufairy@janggi.xyz