오목

개발한 것들 2013. 1. 28. 12:30

프로그래밍을 배우고 제가 최초로 구현했던 프로그램이 테트리스라면 두번째로 구현한 것이 오목입니다.

 

컴퓨터로 무언가 지능을 가진 프로그램을 만들면 재미있지 않을까 하는 생각에 시작하게 되었고 당시 다른 시험 준비를 하면서 틈틈히 구현을 했습니다. 무슨 책을 보거나 한 것이 아니고 그냥 무턱대고 구현을 시작한 것이라서 처음에는 컴퓨터의 실력이 형편없었습니다. 그래도 프로그램이랑 오목을 두어 보면서 조금씩 조금씩 보완해 나가다 보니 어느 순간에 저를 뛰어넘더군요.

 

이제 됐다 싶어서 같이 시험 준비를 하던 친구를 집으로 불러다 밥을 해 먹이면서 제가 만든 프로그램이랑 오목을 두게 했습니다. 결과는 거의 프로그램의 압승 ㅎㅎㅎ. 그때 속으로 느꼈던 희열이 아직도 기억에 남는군요. 그 친구는 지금은 대학 교수로 있는데 우연히라도 이 글을 보게 되면 아마도 기억이 나겠죠 ^^.

 

아쉽게도 당시 도스 환경에서 터보 C로 구현했던 오목 프로그램의 원본 소스는 지금은 사라지고 없습니다. 다만 그 뒤 인공지능 기법중 알파베타(alpha-beta) 기법이란 것을 배우고 나서 이를 적용해서 수정했던 윈도우 버전의 오목 프로그램만이 남아있습니다. 윈도우 버전의 프로그램은 첨부로 올립니다.

 

당시 알파베타 기법을 적용하면 성능이 훨씬 좋아질 것이라고 기대하면서 수정을 했었는데, 결론적으로 왠지 모르게 실망스러웠습니다. 그건 아마도 휴리스틱과 이론의 차이라 생각됩니다. 처음 도스 버전이 온갖 휴리스틱의 집합체였다면 두번째 윈도우 버전은 잘 정립된 이론에 기반한 방법입니다. 두 번째 애도 나름 잘 두긴 하는데 정형화된 틀 속에 있다는 느낌입니다. 반면 첫번째 버전은 가끔 엉뚱한 수를 두기도 하지만 종종 기발한 수를 두어서 놀래키기도 했던 것 같습니다. 그러고 보니 두 프로그램을 같이 올렸다면 흥미로운 비교가 되었을 텐데 아쉽네요.

 


omok.exe


(2016.03.14 추가)

요즘 이세돌과 알파고의 바둑 대결이 세간의 화제를 모으고 있습니다. 1국과 2국의 패배에 이어서 3국에서의 패배를 지켜보면서 저렇게까지 해야 하나.. 알파고에게 물이라도 한바가지 찌끄려야 하나 하는 생각이 들었습니다. 하지만 어제 이세돌이 알파고를 누르고 1승을 거두었을 때의 감정은 말로 표현하기 힘듭니다. 원래 블로그에 올렸던 위 오목 프로그램에 탐색 수만 늘려서 4수까지 탐색하도록 프로그램을 수정해 보았습니다. 당연히 속도는 많이 느려졌는데 성능은 그렇게 좋아진지는 잘 모르겠네요..


omok2.exe



(2016.07.02 추가)

요즘 마나님이 오목에 푹 빠져서 심심하면 오목을 둡니다. 그래서 이왕이면 내가 짠 걸로 둬 보라고 추천을 했습니다. 처음에는 컴터한테 거진 지더니 요즘에는 자꾸 이깁니다. 그러면서 프로그램에 자꾸 오류가 뜬다고 불평을 합니다. 오류가 뜨는 것은 아래 댓글에서도 몇번 지적되었던 사항인대 사실 그동안 귀찮아서 손을 대지는 않았습니다. 하지만 마나님이 두시는데 이럴 순 없다 싶어서 거의 15년만에 코드를 다시 봤습니다. 그랬더니 버그도 많이 발견되었고 논리적 오류도 발견되었습니다. 전반적으로 코드를 다시 수정하고 버그 및 성능을 보완한 버전을 다시 올립니다. 난이도(앞으로 몇 수를 볼 것인지)를 조정하는 기능을 추가했고 앞서의 두 버전에 비해 성능도 일부 개선이 되었습니다.


omok_advanced.exe


☞ 구현된 3x3 금지 기능은 오목의 공식적인 3x3 규칙과는 다릅니다. 여기서는 연속해서 붙어있는 돌 3개와 3개가 만나는 경우만을 금하는 것으로 구현되어 있습니다.


by 다크 프로그래머