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


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.