오목

개발한 것들 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 다크 프로그래머

'개발한 것들' 카테고리의 다른 글

걷는 속도와 비를 맞는 양 - 컴퓨터 시뮬레이션  (46) 2013.06.05
라이브 왜곡 보정 프로그램  (73) 2013.02.13
FFT와 모아레 제거 프로그램  (63) 2013.01.28
오목  (49) 2013.01.28
  • 이전 댓글 더보기
  • BlogIcon 오수 2013.12.17 22:25 ADDR 수정/삭제 답글

    제가 이겼음에도 불구하고 5개를 만들어 컴퓨터가 정신승리(...)를 시전하는 경우가 생기네요 ㄷㄷ...

    • BlogIcon 다크pgmr 2013.12.18 09:03 신고 수정/삭제

      저는 그런 경우를 한번도 보지 못했는데.. 아마도 자아가 생긴 모양입니다.

  • 이삼열 2013.12.22 21:56 ADDR 수정/삭제 답글

    저 이겻어요~

  • 윙.. 2014.02.04 14:49 ADDR 수정/삭제 답글

    오목을 두다보니 전체의 2/3 저도 바둑알을 채웠더니.. 프로그래이 디졌네요.. -_-;;
    무한루프는 아닌것같고.. 그냥 알고리즘에서 배열 첨자 잘못 엑세스 해서 디진거같아보임...

    • BlogIcon 다크pgmr 2014.02.04 17:00 신고 수정/삭제

      아마도 몇 군데는 버그가 있을수도 있겠네요. 한 20년 전쯤에 짠 코드라 어디가 문제일지는..

  • 클락 2014.02.23 02:55 ADDR 수정/삭제 답글

    저 디자인 보니 저도 예전에 해봤던 기억이 나는데.. 이걸 만드신 분 블로그를 오늘 우연히 들리다니.. 이것 참 희안하네 ㅋㅋ 반갑습니다~ ^^

  • 2014.05.04 18:07 ADDR 수정/삭제 답글

    비밀댓글입니다

  • ㅎㅎ 2014.05.07 16:55 ADDR 수정/삭제 답글

    인공지능 오목이랑 두개 돌렸더니 에러 나네요 ㅠㅜ
    그래도 이 정도로 진행이 되는게 너무 대단 ㅠㅠ 실력을 차츰 쌓으면 구현 할 수 있겠죠? ㅋㅎ ㅠㅠ

    • BlogIcon 다크pgmr 2014.05.08 12:07 신고 수정/삭제

      에러가 난다는 분들이 있어서 코드를 다시 한번 봤는데.. 저는 잘 찾지 못하겠네요 ㅠㅠ. 혹시 컴파일러나 컴파일 환경 문제일 수도 있겠다 싶어서 최신 환경에서 다시 컴파일해서 올립니다.
      구현은.. 작심하고 시작하면 누구나 할 수 있다고 생각합니다.

  • pando 2014.08.01 09:37 ADDR 수정/삭제 답글

    흠...두다가 프로그램이 다운되네요;;

  • 초보 pgmr 2014.10.04 00:56 ADDR 수정/삭제 답글

    3by3는 않된다고 해놓구선 컴본인은 allow 하네요..ㅜㅜ 삼삼에 걸려 자꾸 져서, 삼삼을 허락했더니
    컴이 지기 시작합니다...ㅎ

  • 저기 죄송한데 2014.11.05 20:26 ADDR 수정/삭제 답글

    인공지능 소스코드는 공개 안되시나요 ? 인공지능을 좀 배우고싶어서요 ... 부탁드립니다.

    • BlogIcon 다크pgmr 2014.11.05 22:53 신고 수정/삭제

      네 코드공개는 하지 않습니다.
      인공지능 기법으로는 알파베타 기법을 사용한 것이 다입니다. 인터넷 검색을 해보면 관련 글들이 많으니 읽어보시면 좋을 것 같습니다(예: http://musicdiary.egloos.com/viewer/4274653)

  • ems7747 2015.11.15 18:44 ADDR 수정/삭제 답글

    .....바보!

    소리 듣고 덧글 남깁니다(도저히 이길수가 없다....)

    • BlogIcon 다크pgmr 2015.11.16 10:20 신고 수정/삭제

      설마요. 천천히 둬보시면 어렵지 않게 이길 수 있습니다. ^^

  • 옴부즈맨 2016.03.10 19:49 ADDR 수정/삭제 답글

    음.. 첨부가 되면 좋을 것 같은데 안 되서 어떻게 언급을 해야할지 모르겠는데..
    대충 생각없이 뒀더니 계속 지더라구요? ㅡㅡ 그래서 신경써서 뒀더니 마지막에 5번쨰 돌을 놓으려는 순간... Exception나면서 종료되어 버립니다.
    로직의 누수는 혹 없으실지.. (있으니 그렇게 되었겠지요?)
    지나가는 길에 잠시..

    • BlogIcon 다크pgmr 2016.03.13 06:16 신고 수정/삭제

      네, 감사합니다. 다시 시간을 내서 코드를 보기는 쉽지가 않네요.. ^^

  • 솔로알고리즘 2016.04.04 13:28 ADDR 수정/삭제 답글

    5개만들어서 이겼는데 흑이 5개를 만들더니 바보래요 ㅠㅜ

  • ㄷㄷ 2016.05.07 04:30 ADDR 수정/삭제 답글

    분명 33 안되게 설정해놓았는데, 컴터가 33을 하네요.
    http://omok.or.kr/bbs/view.php?id=yungu&page=2&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=11

    • BlogIcon 다크pgmr 2016.05.08 23:14 신고 수정/삭제

      제가 33에 대해 잘못 알고 있었나 봅니다 ㅠㅠ. 덕분에 알게 되었습니다.

  • 알파오보다 2016.05.16 13:19 ADDR 수정/삭제 답글

    알파오라고 알려진 중국 프로그램에 비해서도 떨어지지 않네요 ㅜㅜ
    저는 5판 모두 내리 졌다는 ㅜㅜ

    • BlogIcon 다크pgmr 2016.05.17 07:34 신고 수정/삭제

      그런 프로그램이 있었군요.. ^^ 이건 기본적인 게임이론(알파베타)을 구현한 것이라서 그냥 재미로 봐 주시면 좋을 것 같습니다.

  • 잠못드는밤 오목은 내리 지고 2016.07.04 01:56 ADDR 수정/삭제 답글

    자꾸 바보라 하니 잠을 잘 수 없습니다. ㅠㅠ
    암튼 코드 수정하느라 고생하셨네요.
    열심히? 두겠습니다. ^^

  • 5연패후 2017.02.21 00:28 ADDR 수정/삭제 답글

    5연패후 이렇게 멋진프로그램을 만들어보고 싶어졌습니다!!
    c++까지 공부했는데 ..AI부분이 걸리네요,, 그리고 콘솔에서 벗어나고 싶은데
    win32 API,MFC,머신러닝 까지 배워야 하나요 ?? ㅜㅜ

    • BlogIcon 다크pgmr 2017.02.21 10:32 신고 수정/삭제

      c++을 배우셨으면 mfc를 공부하시면 좋을 것 같습니다. 그리고 머신러닝도 배우면 좋겠지만 그냥 알파베타 프로시져(alpha-beta procedure)에 대해 찾아보시면 될 것 같습니다.

  • 007본드 2017.08.02 22:29 ADDR 수정/삭제 답글

    회사를 은퇴하고 젊은 시절부터 배워보고 싶었던 프로그래밍을 늦은 나이에 혼자서 공부하기 시작한 사람입니다. 오목 프로그램을 짜보고 싶어 공부하는데 생각보다 어렵군요.
    다크님의 오목게임을 해보니 정말 강력한 것 같습니다.
    염치없지만 소스코드 좀 얻어서 공부할 수 있을까요?
    제 이메일은 pcyjh@daum.net 입니다.

    • BlogIcon 다크pgmr 2017.08.03 15:26 신고 수정/삭제

      어려가지 번거로운 문제를 피하기 위해 소스코드는 공개하지 않고 있습니다. 양해를 부탁드립니다. 대부분의 AI 게임 프로그램은 알파-베타(alpha-beta) 방법을 사용합니다. '인공지능+알파+베타'로 검색하시면 오목과 같은 턴제 ai 프로그래밍 방법 및 관련코드를 어렵지 않게 구할 수 있습니다.

  • 디텍터킴 2018.05.07 01:24 ADDR 수정/삭제 답글

    와 이런글 너문 좋습니다, 잘보고 가요

  • BJ 최병조 2018.06.06 16:13 ADDR 수정/삭제 답글

    사람과 하는 간단한 오목게임을 만들려고 하는데 돌이 5개가 연속되면 게임을 끝내는 방법이 궁금합니다......... 알려주세여

    • BlogIcon 다크pgmr 2018.06.07 13:34 신고 수정/삭제

      오목판의 돌의 상태는 대게 행렬로 표현될텐데요, 행렬의 원소를 조사해서 가로, 세로, 대각선 방향으로 같은 색의 돌이 5개 있는 경우를 감지하면 됩니다.

  • ㅇㅅㅇ 2019.11.22 15:36 ADDR 수정/삭제 답글

    심심풀이로 도전했는데 2판만에 이겼네요. 오목이라 가볍게 생각하고 덤볐는데 꽤나 힘들었어요.←붙여넣기