체스 봇 개발 일지 7일차
2023 10 14
지난번에 ai 첫 번째 버전인 버전 1을 완성시켰다. 하지만 승률은 너무 낮았고 문제점이 많았다. 그래서 오늘은 그 문제점들 중 하나인 체크일 때 킹이 피하지 못하는 점을 고칠 것이다.
1. 버전 1의 문제점
위에서 말했듯이 버전 1의 알고리즘은 킹이 체크 상황일 때 피하지 못한다. 이 점을 보완하여 버전 2를 만들 것이다.
2. 코드 설명
if (ck == 1) {
if (Ki_ch(1, wkx, wky, wkx, wky + 1, _pBoard)) {
if (wky < 8) {
_move(wkx, wky, wkx, wky + 1, _pBoard);
wky += 1;
return;
}
}
if (Ki_ch(1, wkx, wky, wkx + 1, wky, _pBoard)) {
if (wkx < 8) {
_move(wkx, wky, wkx + 1, wky, _pBoard);
wkx += 1;
return;
}
}
if (Ki_ch(1, wkx, wky, wkx, wky -1, _pBoard)) {
if (wky > 1) {
_move(wkx, wky, wkx, wky - 1, _pBoard);
wky -= 1;
return;
}
}
if (Ki_ch(1, wkx, wky, wkx - 1, wky, _pBoard)) {
if (wkx > 1) {
_move(wkx, wky, wkx - 1, wky, _pBoard);
wkx -= 1;
return;
}
}
if (Ki_ch(1, wkx, wky, wkx + 1, wky+1, _pBoard)) {
if (wkx < 8 && wkx < 8) {
_move(wkx, wky, wkx + 1, wky + 1, _pBoard);
wkx += 1;
wky += 1;
return;
}
}
if (Ki_ch(1, wkx, wky, wkx - 1, wky - 1, _pBoard)) {
if (wkx > 1 && wky > 1) {
_move(wkx, wky, wkx - 1, wky - 1, _pBoard);
wkx -= 1;
wky -= 1;
return;
}
}
if (Ki_ch(1, wkx, wky, wkx + 1, wky-1, _pBoard)) {
if (wkx < 8 && wky > 1) {
_move(wkx, wky, wkx + 1, wky - 1, _pBoard);
wkx += 1;
wky -= 1;
return;
}
}
if (Ki_ch(1, wkx, wky, wkx - 1, wky + 1, _pBoard)) {
if (wkx > 1 && wky < 8) {
_move(wkx, wky, wkx - 1, wky + 1, _pBoard);
wkx -= 1;
wky += 1;
return;
}
}
}
일단 현재 체크 상태인지 아닌지를 ck라는 인자로 받는다. 만약 ck 가 1이라면 체크인 상황이고 0이라면 체크가 아닌 상황이다. 만약 ck가 1이면 간단히 킹이 피할 수 있는 위치로 피하는 알고리즘이다.
3. 버전 2의 문제점
이번 버전 3의 문제점은 체크 상황 때 피하긴 피하는데 피해도 킹이 잡히는 위치로 피할 때가 있다는 것이다.

위와 같은 상황일 때

위와 같이 이동을 하여 체크 상황을 벗어나지 못한다.
이 문제점은 다음 버전 3 때 한 수 앞을 내다보는 알고리즘을 통해 해결할 것이다.
4. 마치며
이렇게 체크 상황 때 피하는 기능을 탑재한 버전 2를 만들었다. 버전 3에서는 위의 문제점을 해결하게끔 한 수 앞을 내다보는 기능을 구현할 것이다.