선임분께서 체스 인공지능 개발할 건데 같이 해볼 생각이 없냐고 제안하셨다.
난 인공지능에 대해 아예 모르니 공부해보고 좋을거 같다라는 생각으로 프로젝트를 시도해보고자 한다.
1. 목표
일단 목표는 llm을 사용하지 않고 구현해보는 것이 목표다.
1차 목표: 체스 엔진
2차 목표: 체스 판 시각화
3차 목표: 체스 인공지능
구현력은 선임왈 내가 더 뛰어나기 때문에 1차, 2차는 내가 맡고, 3차는 선임분께서 맞게 될것이며, 프로젝트를 하며 인공지능 코드를 읽어볼 기회가 생길것 같다.
2. 구성
일단 구성도를 생각해야한다.
크게 생각해본것은 3가지 이다.
1) api 형식
선임분께서 어떻게 인공지능을 하실지 잘 모르겠어서 생각한 가장 초기 모델(?) 이다. 체스 엔진을 따로 두어, 시각화와 인공지능쪽으로 뿌리는 느낌이다.
한계가 있다. 네트워크 상의 소통이 들어가기 때문에 데드락의 가능성이 있고, 인공지능이 학습할때 레이턴시가 발생하며, 인공지능이 병렬로 학습을 진행한다고 할때, 엔진의 구성이 너무 복잡해진다.
2) 큰 하나의 프로그램
인공지능 내에 모든 요소가 들어가는 프로그램이다. 엔진은 그냥 인공지능 학습을 위한 함수로써 존재하며, 멀티 스레드를 이용해 인공지능과 시각화가 돌아가지 않을까 생각한다.
한계가 있다. 모두가 상호작용할 가능성이 있기 때문에 모듈화가 제대로 이루어지지않을 가능성이 커 각각을 디버깅 하는데 오랜 시간이 걸릴 수 있고, 각 모듈마다 최적화된 언어 사용보다는 한개의 언어만을 사용하여 만들어야한다.
3) 하이브리드
인공지능을 위한 체스 엔진은 함수로써 존재하고, 시각화를 위한 api를 던져주는 방식이다. 이또한 멀티 스레드로 돌아가지 않을까 생각한다. api용과 체스엔진용.
한계가 있다. 데드락의 가능성이 있고, 1과 2의 모든 요소가 포함되어있기에 구현상의 난이도가 높아질 수 있다.
<결론>
내가 생각하는 방식은 다음과 같다.
일단 3의 방식으로 간다. 체스 엔진은 c++를 이용하여 개발하며, 추후 인공지능은 아마 python으로 돌아갈 것이기 때문에 dll파일로 내보내면 python에서도 사용 가능하다.
1. ai와 시각화의 가장 좋은 방법은 shared memory로 각각의 프로그램에서 접근하며, 데드락을 막는 방법이나,
2. 인공지능의 학습 과정을 굳이 시각화하여 보일 필요는 없기에 시각화용 프로그램 따로, 인공지능 프로그램 따로 각 상황에 맞게 돌리는 방법,
3. 시각화와 인공지능 프로그램을 각 멀티스레드로 돌리는 방법이 있는데,
실제 체스 게임을 진행할 때도 생각해야하기 때문에 이 부분은 일단 c++ 라이브러리 개발을 하고 나서 추후에 다시 논의해봐야할 것 같다. 사실 인공지능 학습에 관해서는 잘 모르기 때문에 엔진을 만든 이후 인공지능 개발을 맡으실 선임분과 논의하도록 하겠다.
3. 체스 엔진 라이브러리
러프한 구성
기본적으로 return해야할 데이터는 다음과 같다.
1. last_movement_log
2. full_log
- humanreadable
- move 클래스 array
3. piece_position
- pieces 각각
1) humanReadable
2) from
3) to
4) owner
4. next_possible_movement
5. game_state (진행중? 누구차례? 종료?)
정도 생각난다. 이 글에서 작성하는 모든 구성은 개발을 진행하며 추가 및 수정될 가능성이 있다.
각 기물은 Piece 부모 클래스를 상속받는다. 클래스 구성으로는
1. value: owner - (black or white)
2. value: position
3: value: isMoved (castling 용)
2. function: moveTo(int row, int column)
3. function: getPossibleMovement()
정도 생각나고, 더 큰 구성은 개발을 진행하며 추가하도록 하겠다.
log를 남기는 것은 실제 체스를 진행할때 사용하는 e4, Nxd4와 같은 언어를 사용하여야 인공지능학습에 복잡도를 줄이지 않을까 생각한다.(예상임.) 일단 시각화를 인공지능에 사용하는것은 매우 어려울 것같다는 자체 판단이다.
Move 클래스
1. array: struct
- Piece
- tocol
- torow
2. captured piece
3. isPromosion (프로모션인지)
4. isCastling (캐슬링인지)
5. isEnPassant (앙파상인지)
Board 클래스
1. value: piece_position (return value의 piece position와 같으면 되지 않을까?)
2. value: humanReadableLog (human readable)
3. value: moveLog (move 클래스 array)
4. value: whoseturn
5. function: move(Piece whichone, Move move)
6. function: undo()
7. function: getGameState()
정도 생각한다.
이후 수정 및 추가 내용은 실제 구현을 하는 개발 과정에서 더 기술하도록 하겠다.
'프로젝트 > 체스 엔진' 카테고리의 다른 글
| [체스 엔진] 체스 엔진 개발 일지 - 3 board 클래스 설계 및 구상. (0) | 2026.02.25 |
|---|---|
| [체스 엔진] 체스 엔진 개발 일지 - 2 큰 구성도 (0) | 2026.02.23 |