AI 체스 봇 개발 일지(7일차)

이동민·2023년 10월 14일
0

체스 봇 개발 일지 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에서는 위의 문제점을 해결하게끔 한 수 앞을 내다보는 기능을 구현할 것이다.

0개의 댓글