체스 엔진을 작성하는 가장 좋은 방법은? [닫은]


15

저는 체스 애호가이자 프로그래머입니다. 최근에 체스와 프로그래밍 지식을 사용하여 체스 엔진을 만들기 시작했습니다. 여기 내 질문이 있습니다.

체스 엔진을 작성할 때 어떤 언어 (Java, C ++ 및 Python에 익숙 함) 및 방법론을 적용해야합니까?

약간의 지침을 주시면 감사하겠습니다.

편집하다:

그래서 JavaScript로 만들기로 결정했습니다. 나는 github 에서이 체스 UI를 다운로드 했으며 이제 모두 설정되었습니다! 나의 첫 번째 단계는 합법적 인 조치를 취하는 것입니다. 아무도 올바른 방향으로 나를 가리킬 수 있습니까? (jQuery를 처음 사용하지만 많은 프로그래밍 경험이 있습니다).

추신 : 나는 매우 효율적인 엔진을 만들려고하지 않습니다 (너무 어렵습니다). 프로세스에 익숙해지고 새로운 기술을 배우고 싶습니다.


5
모든 주류 언어와 방법론은 체스 엔진에 대해서는 특별한 것이 아닙니다.
yannis

3
목표에 대해 더 구체적으로 설명하겠습니다. 일련의 엄격한 규칙으로 정리하고 싶다면 큰 과제이지만 모든 프로그래머가 그처럼 무차별하게 분류 할 수 있습니다. 패턴 인식 또는 위험 대 보상의 무게 측정과 같은 것에 들어가고 싶다면 답이 칙칙해질 수 있습니다.
Erik Reppen

체스 엔진 위키에서 교육학 섹션을 확인 했습니까? 이것은 특별히 체스 프로그래밍을 가르치기위한 것으로 보이며 모두 오픈 소스입니다. : 당신은 실제 문서는 일반적으로 개발의 의미를 설명 할 것입니다 소스 코드를 사용하지 않는 경우에도 en.wikipedia.org/wiki/Chess_engine#Categorizations
user60812

1
정말 어려운 부분은 선택하기 위해 위치 A가 위치 B보다 나은지 확인해야하기 때문에 주어진 위치를 평가하는 방법입니다.

1
당신이 알고 싶은 것이 전혀 명확하지 않습니다. 당신은 위치의 표현을 결정 했습니까? 그렇다면 다음 단계는 이동 생성기를 작성하고 테스트하는 것입니다. jQuery가 그와 관련이 있다고 생각하는 것이 확실하지 않습니다.
kevin cline

답변:


19

2072 등급의 체스 선수는 여기. 주말 동안 이 웹 사이트 를 순수한 JavaScript 로 만들었습니다 . 그것은 체스 엔진이 아닙니다 (저는 재미있는 Chess960 엔진의 일종으로 재미있는 시작 위치를 만들도록 설계되었지만 시작점입니다). 소스 코드는 여기에 있습니다 .

기능성 보드를 만드는 데는 많은 합병증이 있습니다. 여기에는 다음이 포함됩니다.

  • 먼저 기본적인 법적 움직임을 나타내는 방법을 알아냅니다. 시작 좌표와 끝 좌표로 수학을해야합니다. 예를 들어, 루크 이동의 경우 좌표 중 하나가 전후의 동일해야합니다. 기사 이동의 경우 좌표 변경의 절대 값의 합은 3이어야하며 두 좌표가 모두 변경되어야합니다. 감독 이동을 사용하면 좌표의 합이 동일하게 유지되거나 둘 다 동일한 양만큼 증가합니다. 폰은 두 정사각형 또는 하나의 사각형을 움직일 수 있는지 알아 내야 할뿐만 아니라 (얼마나 많은 움직임을 저장했는지 대신 행과 색상을 확인해야 함) 전체 캡처를 대각선으로 이동해야하기 때문에 까다 롭습니다. 앞으로.
  • 폰과 체크 때문에 캡처하는 것은 어려운 일입니다. 조각이 다른 조각의 정사각형으로 이동하면 캡처라고 말할 수는 없습니다. 결국, 폰은 다른 조각의 정사각형으로 이동하여 캡처 할 수 없습니다.
  • 적법한 조각이 합법적인지 아닌지를 결정하기 위해 적의 조각이 움직일 수 있는지 확인하는 효율적인 방법을 찾아야합니다.
  • 수표를 다루기가 어렵습니다. 모든 움직임이 끝나면 적의 조각이 갈 수있는 모든 사각형을 확인하고 그 중 하나가 왕과 관련되어 있는지 확인해야합니다. 그렇다면 불법적 인 움직임입니다.
  • Castling, enpassant, promotion, stalemate, forced draws, repetition-문제의 규모를 감안할 때 다루기가 쉽지 않습니다.

모든 체스 엔진은 한 위치에서 합법적 인 움직임의 모든 (어쩌면 heuristically 결정된 부분 집합)을보고 그러한 움직임을 만들고 재귀 적으로 결과 위치에 대해 동일한 일을 수행하여 상대 가치를 나타내는 숫자를 평가하여 작동합니다. 당신의 쌍둥이 문제는

  • 이 데이터를 효율적으로 저장하는 방법
  • 이 재귀 적 검색을 진행하는 방법-결국, 당신은 영원히 계속할 수 없으므로 한계를 설정 한 다음 그 한계 내에서 가장 최적의 철저한 검색을 수행하도록 알고리즘을 설계하는 방법을 알아 내야합니다. 예를 들어, 최소한 가능한 각 시작 이동에 대한 평가가 필요하지만 모든 이동에 동일한 시간을 제공하는 대신 더 유망한 이동을 평가하는 데 더 많은 시간을 소비하고 싶을 수도 있습니다.

이 모든 것은 처음에 알고리즘을 설계하는 것 외에도 많은 정보가 있습니다.

어떤 언어를 사용 해야할지 (이미 JavaScript를 결정했다고 생각하지만) 다른 언어보다 목표에 더 의존한다고 생각합니다. 나는 온라인으로 만들고 싶었고 JavaScript를 더 잘하고 싶었 기 때문에 JavaScript가 나의 선택이었다. 모든 객체 지향 프로그래밍 언어가 가능합니다.

하고있는 일에 익숙해지면 다음 리소스가 도움이 될 것입니다.

행운을 빕니다!


고마워요, 시작하는 데 도움이되었습니다. 아직도 배우고 구현해야 할 것이 많지만 체스 엔진은 결코 쉽게 쓸 수 없습니다. 그러나 나는 당신이 좋아하는 무언가로 일하는 것이 좋다고 생각합니다!
Adnan Zahid

나는 동의한다. 정말 다양한 프로젝트를 재개하고 싶었지만 정직하게 체스를 개발하는 것을 좋아합니다.
앤드류 Latham

lathamcity.com 도메인은 현재 판매 중입니다. 다른 웹 사이트에서 코드를 사용할 수 있습니까?
IkWeetHetOokNiet

14

개념으로서 "체스 프로그램"의 문제점은 많은 시간을 흡수 할 수있는 많은 부분이 있으며 반드시 현재 당신에게 관심을 가질 필요는 없다는 것입니다. 그래픽, 알파-베타 검색 또는 시각화를 검색 엔진으로 개발하는 데 도움이되는 시각화 작업에 수년을 소비 할 수 있습니다.

오픈 소스 체스 프로그램 (많은 것이 있어야 함)을 찾아서 가장 관심있는 부분을 개선하는 것이 좋습니다. 결국 전체 프로그램, 한 번에 하나의 기능을 교체하거나, 충분히 배우고 그것을 버리고 자신의 프로그램을 처음부터 디자인하도록 동기를 부여 할 수 있습니다. 어쨌든, 핵심은 전체 프로그램을 설계하기 전에 "빛"을 시작하고 로프를 배우는 것입니다.


설정된 인터페이스 프로토콜 중 하나를 준수하면 엔진에 기존 프런트 엔드를 사용할 수 있습니다.

알파 베타가 몇 년이 걸리지 않기를 바랍니다.
Kevin

1
몇 년 동안 글을 쓰지 않고 몇 년 동안 :)
ddyer

9

체스 규칙에 익숙하다면 기본 기술에 대한 좋은 출발점은 http://www.frayn.net/beowulf/theory.html입니다 . 광범위한 자료와 링크는 여기에서 찾을 수 있습니다. http : // chessprogramming .wikispaces.com / 그리고 셋째 : 다른 사람의 코드에서 배우십시오. Crafty 의 출처를 살펴보십시오 . 최고의 오픈 소스 엔진입니다. 테스트 케이스에 대해 생각하고 개선이 필요한지 확인하는 것이 매우 중요합니다. 예를 들어 3 ~ 4 자리의 간단한 게임 종료 위치로 시작하십시오.


3

언급 한 바와 같이, 체스 엔진을 구축하는 것은 대단히 어려운 일이 아닙니다. 아마도 언어 선택에 따라이 응용 프로그램을 사용하고 (잠재적으로) 배포하는 방법에 집중해야 할 것입니다.

재미있는 연습 인 경우 Javascript로 코딩하여 웹 페이지로 배포 할 수 있습니다. 당신이 그것을 전문 체스 게임으로 만들고 싶지 않다면, 적어도 다른 사람들은 그것과 그 소스 코드를 가지고 놀 수있을 것입니다.

WPF와 같이 특정 기술을 동시에 배우려면 하나의 돌로 두 마리의 새를 죽이는 것이 좋습니다. 이 앱에서는 MVVM이 과도 할 수 있지만 적어도 배우는 것이 좋습니다.

안드로이드 장치를 대상으로하려면 Java를 선택하는 것이 좋습니다. 마찬가지로 iOS 기기 용 Objective-C.

길고 짧은 언어 선택은 진공 상태에 존재하지 않습니다.


3

Min-Max, 나무 및 가지 치기, 휴리스틱 및 기타 기본 개념에 대해 이미 알고 있다고 가정하고 여기에 쓰는 내용은 과소 평가되었을 수있는 세부 사항 일뿐입니다.

나는 회사와 친구가 때때로 우리 자신의 체스 엔진을 썼다. 우리가 가진 몇 가지 문제와 아이디어를 공유했으며 유용하다고 생각합니다.

우리 둘 다 자바 프로그래머이기 때문에 우리 언어는 우리를 자바로 바꾸었고 객체 지향 접근법으로 시작했습니다. 조각은 대상, 보드는 대상, 파일 및 순위 (체스 문학의 행과 열)는 대상이었습니다. 그리고 이것은 틀렸다. 오버 헤드는 엄청 났고 프로그램은 검색 트리에서 2 이동 (4 플라이) 이상 진행하기 위해 고심하고있었습니다.

그래서 몇 가지 검색으로 우리는 훌륭한 아이디어 (우리는 아니지만!)로 끝났습니다 : 조각과 보드를 긴 정수 (64 비트)로 나타냅니다. 이것은 체스 판에 64 개의 사각형이 있기 때문에 의미가 있습니다. 나머지는 약간 현명한 작업이었습니다 (cpu에 매우 가깝게 실행 = 매우 빠름). 예를 들어, 이진 64 비트 정수는 조각이 공격 할 수있는 사각형을 보드에 표시합니다. 이제 이와 같이 두 숫자 사이에 논리적 "AND"를 실행하면 0이 아닌 결과는 공격자와 사각형이 있음을 나타냅니다. 체스 판과 조각을 제시하는 방법에는 여러 가지가 있습니다.

1- 보드 프리젠 테이션 결정

그런 다음 데이터베이스가 필요합니다. 체스 오프닝은 어떻게 든 개미를 풀고 개미를 가지고 개설하는 것이 좋습니다. 이 경우, 블리츠 게임에 많은 시간이 필요합니다.

2-첫 책을 찾으십시오.

우리는 이런 일을했지만 여전히 우리는 선하지 못했습니다.

3-좋은 체스 엔진은 6 번의 움직임 (12 플라이)을 볼 수 있어야합니다.

그래서 우리가 한 일은 데드 타임을 사용하는 것이 었습니다 (사람 대 컴퓨터 엔진 인 경우).

4-상대가 당신의 나무를 어느 정도 만들려고 생각하는 시간을 사용하십시오.

그리고 여전히 우리는 12 겹에서 멀리 떨어져있었습니다. 더 많은 연구를 통해 몇 가지 요령을 발견했습니다! 예를 들어 나무의 한 겹을 건너 뛰고 다음 겹에서 시작하는 것이 좋습니다 (상대자가없는 것처럼). 아이디어가 움직임이 극도로 관용적이라면 왜 시간을 낭비하고 상대방이 그 움직임에 반응 하는지를 보는 것입니다. 그러나 하나의 좋은 엔진은 관용적 행동과 천재 여왕 희생을 구별 할 수 있어야합니다.

5- 이 특정 문제 (체스)에 대한 프로그래밍 요령배웁니다 .

이 상태에서 나와 나와 친구는 여전히 나빴습니다. 위치를 계산하는 경우 나중에 저장하십시오! 검색 트리에서 for 루프도 마찬가지입니다. 요점은 효율적으로 저장 / 검색하는 것이 었습니다.

6-생성 한 데이터를 효율적으로 저장하십시오!

그리고 마지막으로:

7-최대 최적화 코드.

이 문제는 CPU 시간과 메모리 모두에서 매우 비쌉니다. 코드를 매우 효율적으로 작성하는 것이 매우 중요합니다. 분기 요소 35에 대해 이야기하고 있음을 기억하십시오. 이는 휴리스틱 어딘가에서 3.3792205e+18쓸모없는 "if"가 검색 트리의 깊은 곳에서 쓸모없는 "if" 로 바뀔 수 있음 을 의미합니다.

체스 프로그래밍은 매우 흥미로운 과제이며 프로그래밍 기능을 심각한 테스트에 넣을 수있는시기입니다. 내가 제안 할 수있는 몇 가지 사항이 더 있지만 직접 발견 할 것이라고 확신합니다. 내가 모르는 더 많은 포인트가 있지만 인터넷에서 찾을 수 있습니다!

행운을 빌고 재미있게 보내!

추신 : 나는 자바 스크립트를 잘 모르지만 무언가가 문제의 어려움에 기초하고 있다고 말할 수 있습니다. 아마도 C ++이 제공 할 수있는 모든 것을 고려하면 자바 스크립트를 삭제하고 C ++ 로하는 것이 더 좋습니다.


2

편집에 따라 '법적'동작을 정의하는 단계까지 있습니다.

체스에서의 움직임을 설명하는 두 가지 방법이 있습니다. 설명 표기법 및 대수 표기법. 아마도 원하는 것은 조각, 시작 위치 및 끝 위치를 매개 변수로 취하는 함수입니다. 예. QN1에서 QB2까지의 기사는 유효하지 않지만 QN1에서 Q2까지의 기사는 유효합니다. 생각해 보면 대수 표기법은 '상대적'위치 결정을 쉽게 계산할 수 있기 때문에 더 간단 할 수 있습니다.

필요한 최소량의 코드를 작성하려면 먼저 해당 기능에 대한 테스트 작성부터 시작 합니다. 대수 표기법을 사용하는 경우 조각 / 시작 / 끝당 테스트가 필요하지 않을 수 있습니다. 다음 테스트로 넘어 가기 전에 각 테스트 작업을 수행하고 중복을 리팩터링하십시오. 코드가 더 깨끗해집니다.

각 조각에 대해 합법적이고 불법적 인 움직임을 충분히 다루었다면 다른 변수에 대한 검사를 추가하기 시작합니다 (예 : King을 '확인'및 '메이트'조건으로 이동).

JavaScript 에서 단위 테스트에는 qunit 을 , 동작 테스트에는 jasmine 을 사용하는 것이 좋습니다 .


1

실제로 체스 엔진을 작성했습니다. 간식과 악몽에 대비하십시오. 내 친구와 내가 그것을했을 때, 그것은 정시 프로그래밍 경연 대회에 있었고 우리가 함께하기로 결정한 언어는 Java였습니다. Java 또는 C가 최선의 선택이라고 생각하지만 Javascript를 사용하기로 결정한 것을 알았습니다. 나는 내가 그것을 잘 모르기 때문에 그것을 두 드릴 수 없습니다.

여기서 가장 큰 문제는 고려해야 할 모든 조각마다 이동 / 승리 시나리오가 너무 많기 때문에 실제로 코딩을 시작하기 전에 각 조각에 대해 가능한 모든 상황을 작성하는 것이 좋습니다. 계획없이 뛰어 들어가면이 재미있는 프로젝트가 반복되는 집안일로 바뀔 것입니다. 그러나 그것은 정말로 중요한 것입니다. 코드 외부에서 먼저 계획하고 모든 시나리오를 한 번에 하나씩 확인하십시오.

행운을 빕니다


1

게임의 컴퓨터 플레이어 제작 결정 부분에 대해서는 "인공 지능 : 현대적 접근"(책 웹 사이트 http://aima.cs.berkeley.edu/ ) 책을 충분히 추천 할 수 없습니다 . 수학의 배경에 따라 (그래프 이론이 도움이 됨) 다소 높은 수준 일 수 있지만,이 학술적인 내용과 같이 간단하게 작성되었으며 매우 최신의 기술 (및 심도)에 대한 프로그램이 결정하도록합니다.

목표 (예 : checkmate 또는 null)를 명시하고 특정 상태 (보드 레이아웃)가 목표와 얼마나 가까운 지 평가, 현재 상태에서 시작하여 다른 가능한 다음 상태를 생성하는 방법, 그리고 거대한 문제 공간을 횡단하는 방법.

AI 알고리즘을 설계하는 데 도움이 될 수있는 한 가지 방법은 원 게임과 매우 가까운 상황에서 시작하여 마치 마치 마치 마치 마치 세계 어느 곳에서 플레이할지 결정하는 방법을 알아내는 것입니다. 합리적인 시간 (시간) 내에 솔루션을 찾도록 최적화 한 다음, 아직 모든 결과를 탐색하지는 않았지만 우승 경로를 선택할 수있는 방법을 찾아 실제로 "생각"을 중단 할 수 있습니다. 한 번의 시간 가치.

그런 다음에 만 제안 된대로 긴 정수를 사용하는 것과 같이 개별 계산을 더 빠르게하기 위해 표현을 최적화하는 방법을 살펴 보겠습니다. 아무리 빠른 속도로 단일 비교를 할 수 있더라도 문제 공간을 통과하는 방식에 휴리스틱 스가 없으면 시간이 오래 걸릴 것입니다.


0

당신은 정말로 원하는 방식으로 갈 수 있지만 이것들은 주제에 대한 나의 생각입니다.

Java를 사용하여 매우 높은 수준을 유지하고 사용자 인터페이스 라이브러리 (AWT, Swing)를 직접 처리 할 수 ​​있습니다. 체스 판과 조각을 모델링하기 위해 객체 지향 접근법을 사용할 수 있습니다. 다른 사물은 이동 기록 및 득점을 할 수 있습니다. 플레이어도 대상이 될 수 있으며 나중에 Player인공 지능 컴퓨터 플레이어를 제공하기 위해 수업을 확장 할 수 있습니다 .

당신은 한 번 봐 걸릴 수도 있습니다 모델 - 뷰 - 컨트롤러 (MVC)를 그 사용자 인터페이스 (보기)에 모델 객체 (도메인 모델)를 묶는하고 사용자가 조작 할 수 있도록이 경우에는 아주 좋은 방법이기 때문에 (컨트롤러를 통해) 모델.

또한 테스트 중심 개발 을 적용 하여 모든 방법이 원하는 방식으로 작동 할뿐만 아니라 테스트 가능한 모듈 식 코드를 작성하도록 할 수도 있습니다.


4
체스 엔진은 UI와는 아무 상관이 없으며, 최고의 움직임을 계산하는 "마음"만 있습니다.
CSE

@CSE- 엔진 정의에 따라 다릅니다 .
다니엘 AA Pelsmaeker

@CSE -로 아드 난의 편집 쇼, 그는 사실 또한 UI를 찾고. 그래서 내 대답은 관련이 있습니다.
Daniel AA Pelsmaeker

-8

체스 자체의 규칙은 매우 간단합니다. 보드에 대한 행렬 (2 차원 배열)을 만들고 조각의 개념, 각 조각의 이동 규칙, 이동이 합법적인지 확인 및 신호를 보내는 조건을 인코딩 할 수있는 방법 만 있으면됩니다. 게임의 끝. 그것에 대해 특별히 어려운 것은 없습니다. 가장 익숙한 언어를 사용해야합니다.

이제 플레이어 중 한 사람의 역할을 수행 할 체스 게임 AI를 만들려면 상황이 까다로워집니다. 그러나 여기서도 언어 선택이 가장 큰 문제는 아닙니다. 관련된 AI 원칙을 이해하는 것이 있습니다. 그것은 훨씬 더 중요한 요소가 될 것입니다.

(이러한 의사 결정은 계산에 매우 집중적 일 수 있으며 스크립팅 언어가 아닌 네이티브 코드로 컴파일되는 것을 사용하고 싶을 것입니다. -이 문제에 적합하지만 일반적으로 매우 나쁜 언어 이기 때문에 복잡한 것을 구현하려고하면 모든 종류의 두통을 스스로 코드화하는 좋은 방법입니다.)


15
거룩한 전쟁을 피하기 위해 C ++ 이이 특정 작업에 적합하지 않은 이유에 대해 좀 더 구체적이어야한다고 생각합니다.
Erik Reppen

9
거룩한 전쟁을 시작하려는 시도에 -1.
Doc Brown

1
C ++이 일반적으로 매우 나쁜 언어라고 생각하는 이유는 무엇입니까?
Anthony

확실히 당신이 그를 잘못 생각합니다. 나는 그의 의견을 공유하기 위해 C ++은 시작하기에 좋은 언어이지만 복잡한 것들을 다룰 때 고통이됩니다!
Adnan Zahid
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.