<?xml version="1.0" encoding="UTF-8" ?>
<feed xmlns="http://www.w3.org/2005/Atom">
   <title type="text">오델로 프로그래밍</title>
      <updated>2010-07-31T07:36:24+09:00</updated>
   <id>http://othelloclub.com/?mid=program&amp;act=atom</id>
   <link rel="alternate" type="text/html" hreflang="ko" href="http://othelloclub.com/program"/>
   <link rel="self" type="application/atom+xml" href="http://othelloclub.com/?mid=program&amp;act=atom"/>
   <generator uri="http://www.xpressengine.com/" version="1.4.0.5">XpressEngine</generator>
   <entry>
      <title>이런 오델로 AI가 현실적으로 가능 할까요?..</title>
      <id>http://othelloclub.com/66538</id>
      <published>2009-08-04T22:28:33+09:00</published>
      <updated>2009-08-04T22:28:33+09:00</updated>
      <link rel="alternate" type="text/html" href="http://othelloclub.com/66538"/>
      <link rel="replies" type="text/html" href="http://othelloclub.com/66538#comment"/>
      <author>
         <name>Solver2000</name>
               </author>
            <content type="html">&lt;div class=&quot;xe_content&quot;&gt;현재 취미삼아 오델로 프로그램을 만들고 있는 1人..&lt;BR&gt;&lt;BR&gt;그런데 보통&amp;nbsp;세고 센 오델로 AI 처럼 단순한 프로그램을 제작 하고 싶지 않아서 좀 독특(?) 하게 제작 하고 있습니다.&lt;BR&gt;&lt;BR&gt;보통 프로그램은 현재 둘 수 있는 자리중에서 모든 노드를 검색하고 쓸모 없는 가지를 쳐내는 방식으로 수십수 까지 추적하고 있는걸로 알고 있는데, 이 방법에는 분명히 한계가 있다고 생각하여 전혀 다른(정말 그런진 모르지만) 방식으로 제작하고 있습니다.&lt;BR&gt;&lt;BR&gt;제브라에 비교해 보면.. 우선 수 깊이 1에서 현재 상황의 모든 자리에 한번씩 놓아보고 평가함수를 돌려서 최선의 수를 찾는 방식인데&lt;BR&gt;&lt;BR&gt;제껀 안그렇습니다. &lt;BR&gt;&lt;BR&gt;생각할 때 돌하나 안놓아보고 단지 모양만 가지고 둘 자리를 결정합니다. &lt;BR&gt;&lt;BR&gt;이러면 컴퓨터의 입장에서는 제대로 두기 힘들거라 생각할지도 모르지만.. 그래도 지금은&amp;nbsp;비교적 많은 판의 모양을 컴터에 입력시킨 상태라.. 제브라 1수랑 붙여보니 만만 하더군요. &lt;BR&gt;즉, 직관으로 두는 AI를 어느정도는 완성한 셈입니다.(허접한 완성도때문에 올리진 못하겠군요..)&lt;BR&gt;물론&amp;nbsp;모양 대한 정보를 제가 일일이 다 입력해야 하지만.. 언젠간 스스로 학습할 수 있게 할 생각이고..&lt;BR&gt;&lt;BR&gt;그런데 제가 현실성에 대해 묻고 싶은것은 이게 아닙니다.&lt;BR&gt;&lt;BR&gt;아무리 직관에 의존한다 해도 어느 한계를 넘을 수는 없죠.&lt;BR&gt;&lt;BR&gt;이런 수읽기 방식은 어떨까요?&lt;BR&gt;&lt;BR&gt;약간 수학적인 표현이 나오니 이해 하는분만..&lt;BR&gt;&lt;BR&gt;저는 먼저 이 직관적인 AI의 평가 수치가 얼마나 정확한지가 궁금해서 제브라&amp;nbsp;연습모드로 들어가&amp;nbsp;24수 세팅 후 &lt;BR&gt;&lt;BR&gt;각 자리에 대한 평가수치와 제 프로그램의 평가수치의 차이를 데이터화 시킨 후 표준편차를 구해봤습니다.&lt;BR&gt;&lt;BR&gt;대략 5~10정도 되더군요.&lt;BR&gt;&lt;BR&gt;대충 10정도 된다 치고.. 이 상황에서 가설을 세워봤습니다.&lt;BR&gt;&lt;BR&gt;먼저 컴퓨터가 이렇게 수를 읽도록&amp;nbsp;&lt;BR&gt;&amp;nbsp;1) 직관에 의존한 방법으로 현재 상황에서 끝까지 빠르게 한 판을 둔다( 즉 자기 혼자 대충 한판을 둔다는 뜻입니다)&lt;BR&gt;&amp;nbsp;2)&amp;nbsp;&amp;nbsp;&amp;nbsp; (1)의 과정을 수백번, 많게는 수천번 반복하여 각 게임의 결과를&amp;nbsp;평균 낸다.&lt;BR&gt;&amp;nbsp;3)&amp;nbsp;&amp;nbsp;&amp;nbsp;이 평균값이 현재 상황에 대한&amp;nbsp;평가수치&lt;BR&gt;&lt;BR&gt;즉, 가지 형태로&amp;nbsp;검사하는게 아니라 1자 모양으로 여러번의 검사를 하는것입니다.&lt;BR&gt;&lt;BR&gt;1,2 과정을 한&amp;nbsp;400번 정도 반복했다고 하면&amp;nbsp;기본 평가수치의 표준편차가 10이므로 평균의 표준편차는 10/√400&amp;nbsp;= 0.5&lt;BR&gt;(물론 수학적으로 이상적인 정규분포에서만 그렇지만..)&lt;BR&gt;&lt;BR&gt;이는 최종&amp;nbsp;평가수치가 실제 값의&amp;nbsp;±1 범위 내에 들 확률이 약 95% 임을 의미합니다.&lt;BR&gt;&lt;BR&gt;1)에서 한판을 다 두는데 많아봐야 60번의 검사를 하게 되고,&amp;nbsp;&amp;nbsp;이를 400번 반복한다면 총 node는 24000 n 정도입니다.&lt;BR&gt;&lt;BR&gt;이정도면 계산하는데 1초도 안걸리죠...&lt;BR&gt;&lt;BR&gt;제브라 24수가 수천만회 이상의 검사를 한 후 결과를 내는것에 비교하면 상당히 경제적인 수읽기 아닐까요?&lt;BR&gt;&lt;BR&gt;이해한 분들의 의견을 부탁드립니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;</content>
                  
   </entry>
   <entry>
      <title>alpha-beta pruning을 사용하여만든 오델로 tester</title>
      <id>http://othelloclub.com/65196</id>
      <published>2009-05-03T11:27:17+09:00</published>
      <updated>2009-05-03T11:47:27+09:00</updated>
      <link rel="alternate" type="text/html" href="http://othelloclub.com/65196"/>
      <link rel="replies" type="text/html" href="http://othelloclub.com/65196#comment"/>
      <author>
         <name>yoon</name>
               </author>
            <content type="html">&lt;div class=&quot;xe_content&quot;&gt;음.. 오델로 계시판이 많이 뜸하네요.&lt;BR&gt;&lt;BR&gt;요번 학기에 학교 프로젝트로 AI를 연구하다가 들리게 된 이곳인데요,&lt;BR&gt;많은 stragey를 이곳에서 배우게 되어 많이 감사할따름임니다.&lt;BR&gt;&lt;BR&gt;recursion을 이용한&amp;nbsp;search&amp;nbsp;tree&amp;nbsp;이며, 한 depth, 또다른 depth 내려가면서 evaluation에의해&lt;BR&gt;필요없는 파트는 잘라내는 기본 방식임니다.&lt;BR&gt;&lt;BR&gt;evaluation은 2차배열을 사용하여 보드를 직접 가로열, 세로행 점수를 비교해나가는 방식입니다.&lt;BR&gt;&lt;BR&gt;음application을 아직 applet으로 convert하는 방법은 귀찮아서 ;;&lt;BR&gt;&lt;BR&gt;othello.bat로 실행파일이 되어있으며,&lt;BR&gt;&lt;BR&gt;jdk를 설치한 후 돌리시길...&lt;/div&gt;</content>
                  
   </entry>
   <entry>
      <title>유용한 오델로 프로그래밍 사이트</title>
      <id>http://othelloclub.com/29558</id>
      <published>2007-06-15T19:59:25+09:00</published>
      <updated>2008-03-13T12:57:18+09:00</updated>
      <link rel="alternate" type="text/html" href="http://othelloclub.com/29558"/>
      <link rel="replies" type="text/html" href="http://othelloclub.com/29558#comment"/>
      <author>
         <name>cabalero</name>
               </author>
            <content type="html">&lt;div class=&quot;xe_content&quot;&gt;&lt;STRONG&gt;제브라 제작자 거너의 오델로 프로그래밍 소개 사이트&lt;/STRONG&gt;&lt;BR&gt;&lt;A href=&quot;http://radagast.se/othello/howto.html&quot;&gt;http://radagast.se/othello/howto.html&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;세계 최고의 오델로 프로그램 로지스텔로를 제작한 마이클 뷰로의 오델로&amp;nbsp;프로그래밍 관련 논문들&lt;BR&gt;&lt;/STRONG&gt;&lt;A href=&quot;http://www.cs.ualberta.ca/~mburo/publications.html&quot;&gt;http://www.cs.ualberta.ca/~mburo/publications.html&lt;/A&gt;&lt;BR&gt;(참고로 뷰로는 오델로&amp;nbsp;AI 프로그래밍&amp;nbsp;논문들을 통해&amp;nbsp;박사 학위를 취득했습니다.)&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;로지스텔로 소스 다운로드&lt;/STRONG&gt;&lt;BR&gt;&lt;A href=&quot;http://www.cs.ualberta.ca/~mburo/log.html&quot;&gt;http://www.cs.ualberta.ca/~mburo/log.html&lt;/A&gt;&lt;/div&gt;</content>
                  
   </entry>
   <entry>
      <title>오델로 AI의 구성</title>
      <id>http://othelloclub.com/29553</id>
      <published>2007-06-15T17:24:59+09:00</published>
      <updated>2008-03-13T12:57:18+09:00</updated>
      <link rel="alternate" type="text/html" href="http://othelloclub.com/29553"/>
      <link rel="replies" type="text/html" href="http://othelloclub.com/29553#comment"/>
      <author>
         <name>cabalero</name>
               </author>
            <content type="html">&lt;div class=&quot;xe_content&quot;&gt;출처 - &lt;A href=&quot;http://blog.naver.com/hellz777&quot;&gt;http://blog.naver.com/hellz777&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;&lt;SPAN class=&quot;pcol1 itemSubjectBoldfont&quot;&gt;&lt;STRONG&gt;&lt;FONT color=#333333&gt;오델로 AI의 구성&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;
&lt;P&gt;오델로 AI뿐만 아니라 이런구도의 퍼즐&amp;amp;전략게임은 &lt;/P&gt;
&lt;P&gt;대략 두개의 구조로 AI가 구성됩니다...&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;일단 기본적으로 내가 이렇게 두면 다른 사람이 이렇게 두듯이 &lt;/P&gt;
&lt;P&gt;인간이 하는 수읽기를 하는 구조가 먼저 필요합니다...&lt;/P&gt;
&lt;P&gt;이 탐색알고리즘도 여러종류가 있죠..&lt;/P&gt;
&lt;P&gt;깊이 우선방식과 넓이 우선 방식, MINMAX등 여러방식이 있습니다...&lt;/P&gt;
&lt;P&gt;보통 이런종류 게임에선 MINMAX를 많이 사용하더군요...&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;MINMAX란 나는 항상 최상의 수를 구사하고 적도 최상의 수를 구상하는 알고리즘입니다..&lt;/P&gt;
&lt;P&gt;이 알고리즘을 얼마만큼 잘 짜서 검색해야 하는 상황을 줄이면서도 &lt;/P&gt;
&lt;P&gt;깊게 탐색하는게 AI가 얼마나 강한지 결정하는 요소중의 하나죠..&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;만약에 최하위 트리에서 승리하는 노드들만 거슬러 올라가면서 탐색할수 있다면&lt;/P&gt;
&lt;P&gt;매우 강한 AI가 되겠죠..&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;하지만, 이렇게 한다고 해도 모든 탐색트리의 최하위까지 검색할려면 시간이 너무 걸립니다..&lt;/P&gt;
&lt;P&gt;통상적으로 10^6정도가 컴퓨터가 풀수 있는 단위라고 옛날 책에서 본거 같네요(정확한건 아님--)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;그래서&amp;nbsp;평가함수(evaluation functions)란게 등장하게 됩니다..&lt;/P&gt;
&lt;P&gt;간단히 말하자면 현제의 국면을 분석하여 점수를 매겨 국면을 평가하는거죠...&lt;/P&gt;
&lt;P&gt;이것도 방식이 무지하게 많습니다... &lt;/P&gt;
&lt;P&gt;가장 단순한 Disk-square table부터 인공신경망까지....&lt;/P&gt;
&lt;P&gt;일단 제가 읽어본 문서들을 보자면 딱 하나의 수학적 수식으로 결정되는것보다&lt;/P&gt;
&lt;P&gt;휴리스틱(인간의 경험적 정보)로 결정되는게 더 많이 보이더군요...&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;요약하지면 강한 AI는 탐색알고리즘과 평가함수의 견고성을 갖추어야 할거 같군요...&lt;/P&gt;
&lt;P&gt;개인적으로 탐색알고리즘은 평가함수가 정확히지 않으면 큰힘을 발휘할수 없으니 &lt;/P&gt;
&lt;P&gt;평가함수가 더 중요하지 않을까 생각되기도 합니다..&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;국내 싸이트엔 이러한 정보가 별로 없는거 같습니다..&lt;/P&gt;
&lt;P&gt;일단 제 검색실력이 좋은편이 아니지만, 이런 지식이 크게 공개되어 있지 않은거 같네요..&lt;/P&gt;
&lt;P&gt;외국경우엔 국제 대회를 온라인에서 개최하기도 하고 &lt;/P&gt;
&lt;P&gt;제작팀싸이트도 있는거 같은데, 국내엔 별로 없는거 같아서 아쉽군요 ==;&lt;/P&gt;&lt;/div&gt;</content>
                  
   </entry>
   <entry>
      <title>오델로 AI 만들다보니까 이곳까지 오게되었습니다.</title>
      <id>http://othelloclub.com/29542</id>
      <published>2007-06-14T03:11:26+09:00</published>
      <updated>2008-03-13T12:57:18+09:00</updated>
      <link rel="alternate" type="text/html" href="http://othelloclub.com/29542"/>
      <link rel="replies" type="text/html" href="http://othelloclub.com/29542#comment"/>
      <author>
         <name>아크메이지</name>
               </author>
            <content type="html">&lt;div class=&quot;xe_content&quot;&gt;보통&amp;nbsp;전자사전에 있는 AI는 가볍게 이기는 정도라 제가 오델로 잘하는 줄 알았는데&lt;BR&gt;오늘 이 곳에 와보니깐 완전 딴세상이네요^^&lt;BR&gt;전자사전에 있는게 너무 재미없어서 직접 만들려는 거였는데 여기에 오델로 프로그램들 보니깐 완전 의욕상실....&lt;BR&gt;오델로에 이렇게 깊고 넓은 세계가 있는 줄 오늘 처음 알았습니다&lt;BR&gt;(제브라 2수 깊이도 못이김;;; 오프닝 끄고, 아주 크게 무작위로 하니깐&amp;nbsp;2수 깊이도&amp;nbsp;가끔 이김;;)&lt;BR&gt;&lt;BR&gt;AI만들려는 입장에서 보니깐 제브라는 정말 대단한 프로그램같습니다&lt;BR&gt;보아하니 이미 십수년? 수십년?은 개량되었을 오델로 프로그램들이니...&lt;BR&gt;제가 며칠해서 따라잡으리라곤 꿈에도 생각치 않습니다^^ 이런게 있는 줄도 몰랐으니...&lt;BR&gt;그런데 전 그냥 사람 수준에서 전략세워서 플레이하는 AI를 만들려고하는데&lt;BR&gt;제브라는 보니까 정석으로 시작한 다음에, 심하면 24수까지 내다보고 최선의 수를 두더군요&lt;BR&gt;절대 못이기게^^ 이거 이기려면 다 외워야 한다고도 하고;;&lt;BR&gt;2수 깊이만 해도, 기본 설정으로 하면 저같은 사람은 한번 삐끗하면 회복이 불가능하더군요..&lt;BR&gt;&lt;BR&gt;이 정도 AI는 뭐 바라지도 않고&lt;BR&gt;이렇게 만들려면 정석 몽땅 입력해야할텐데;; 그만한 열정은 제가 좀 부족하네요&lt;BR&gt;단순한 개인적 취미 차원에서 재미로 하는 일인데;; 그래도 제가 만든게 전자사전에 있는 놈은 이기네요&lt;BR&gt;오델로 별로 안해본 친구들도 이기고-_-b&lt;BR&gt;하지만 제 목표엔 한참 못미칩니다.&amp;nbsp;전 제가 만든거엔 절대 안지거든요&lt;BR&gt;그래서 기본 전략을 좀더 연구하고 있는데, 몇가지 질문 좀 올릴게요&lt;BR&gt;&lt;BR&gt;여기와서 &apos;오프닝&apos;이란걸 처음 알았습니다. 어마어마하게 많은 종류가 있다는 것도 알았고,&lt;BR&gt;&apos;정석&apos;이라고 생각하면 되다는 것도 알았는데;;&lt;BR&gt;이게 도대체 흑에 유리한 건가요? 아니면 백에 유리한 건가요? 이건 아무리 봐도 모르겠네요;;&lt;BR&gt;흑이 알려져있는 최선의 정석으로 두면, 백은 불리해지지 않도록 그 정석에&amp;nbsp;맞춰서 둔다고 보면 되나요?&lt;BR&gt;오프닝이 뭔지 이해하게되면 제 AI에 어떻게 좀 적용해 보려고 하는데 도통 모르겠네요&lt;BR&gt;제가 만들 오델로는 오델로의 ㅇ 까지만 아는 범인(凡人)들이 플레이하게 될테니 상당히 중요한 문제입니다.&lt;BR&gt;오프닝을 모르는 사람이랑 두면, 어차피 오프닝대로 진행 못하니깐 소용 없는거 아닌가요?&lt;BR&gt;&lt;BR&gt;질문 몇가지 한다고 해놓고, 오프닝 질문 하고나니깐 또 질문할게 없네요&lt;BR&gt;제가 아는만큼 질문이 나오는 법인데;; 머리가 텅텅 비었으니;;&lt;BR&gt;좀 더 공부하고 궁금한거 있으면 또 여쭤볼께요&lt;BR&gt;답변 부탁드립니다&lt;BR&gt;&lt;BR&gt;그나저나 제브라하고 오델로 하다보니깐 열받아 죽겠네요!!! 절 막 구석에 몰아넣고 밟아죽임ㅠㅠ&lt;BR&gt;&lt;/div&gt;</content>
                  
   </entry>
   <entry>
      <title>오델로 프로그래밍에 대한 질문</title>
      <id>http://othelloclub.com/29537</id>
      <published>2007-05-03T21:01:03+09:00</published>
      <updated>2008-03-13T12:57:18+09:00</updated>
      <link rel="alternate" type="text/html" href="http://othelloclub.com/29537"/>
      <link rel="replies" type="text/html" href="http://othelloclub.com/29537#comment"/>
      <author>
         <name>金翅劈海</name>
                  <uri>http://kr.blog.yahoo.com/kimalji2004</uri>
               </author>
            <content type="html">&lt;div class=&quot;xe_content&quot;&gt;괜찮은 오델로 AI를 만들고 싶은데...&lt;BR&gt;&lt;BR&gt;어떻게 만들어야 될까요???&lt;BR&gt;&lt;BR&gt;제가 만든 건 너무 비효율적이여서...&lt;BR&gt;&lt;BR&gt;소스 있으신 분은 보내주세요.&lt;BR&gt;&lt;BR&gt;(&lt;A href=&quot;mailto:kimalji2004@gmail.com&quot;&gt;kimalji2004@gmail.com&lt;/A&gt;)&lt;/div&gt;</content>
                  
   </entry>
   <entry>
      <title>새 기보 게시판에 사용된 자바 스크립트 소스</title>
      <id>http://othelloclub.com/29532</id>
      <published>2006-04-16T02:37:18+09:00</published>
      <updated>2008-03-13T12:57:18+09:00</updated>
      <link rel="alternate" type="text/html" href="http://othelloclub.com/29532"/>
      <link rel="replies" type="text/html" href="http://othelloclub.com/29532#comment"/>
      <author>
         <name>클럽장</name>
               </author>
            <content type="html">&lt;div class=&quot;xe_content&quot;&gt;&lt;P&gt;새 기보 게시판에 사용된&amp;nbsp;자바 스크립스&amp;nbsp;소스입니다.&lt;BR&gt;클릭한대로 수가 둬지고 히스토리 저장으로 이전수 이동이 가능한 소스입니다.&lt;BR&gt;예제는 &lt;A href=&quot;http://www.othelloclub.com/othellojava/othellogibo.htm&quot;&gt;http://www.othelloclub.com/othellojava/othellogibo.htm&lt;/A&gt;&amp;nbsp;에 있습니다.&lt;BR&gt;&lt;BR&gt;원리는 다음과 같습니다.&lt;BR&gt;8x8 총 64칸의 테이블을 만들고 각 칸에 오델로 초기배치 대로 이미지를 배치합니다.&lt;BR&gt;(중앙 네곳만 흰색, 검은색이 교차하게 나머지는 그냥 빈 판) 각 이미지에 명칭을 부여합니다. (c11, c12 이런식으로..)&lt;BR&gt;&lt;BR&gt;시작할때 턴은 흑 차례이고, 마우스 클릭할때마다 턴은 바뀝니다.(패스 판정후 둘곳이 없으면 다시 턴 바꿈)&lt;BR&gt;마우스로 클릭을 하면 둔곳에 지금 턴인 색깔의 돌로 이미지로 바꾸고,&lt;BR&gt;주위 8방향으로 검색으로 해서 돌아가는 돌을 계산해서 돌립니다.&lt;BR&gt;&lt;BR&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot; color=#0080ff&gt;* 이미지를 바꾸는 함수 - RawPutPiece 함수&lt;BR&gt;* 마우스 클릭한곳 및 돌아가는 돌 계산해서 칸 이미지 체인지 - FlipPieces 함수&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;모든 계산이 완료 되고&amp;nbsp;판 구성이 완료되면 현재의 64칸을 하나의 변수로 배열에 저장합니다.&lt;BR&gt;(빈칸은 0, 흑돌은 1, 흰돌은 2, 방금 둔 흑돌은 5, 방금둔 흰돌은 6, 이번수로&amp;nbsp;뒤집힌 흑돌은 7, 이번수로&amp;nbsp;뒤집힌 백돌은 8)&lt;BR&gt;0,0,0,0,0,0,1,2,0,0,0,0 이런식으로 64칸을 표시하고&amp;nbsp;마지막칸 다음에&amp;nbsp;지금 둔 차례(흑 0, 백 1)를 넣은후 이걸 하나의 변수로 저장하여&amp;nbsp;&lt;BR&gt;크기 60짜리의&amp;nbsp;배열에 넣습니다. (총 60수이므로)&lt;BR&gt;&lt;BR&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot; color=#0080ff&gt;*history 저장 변수 - boardhistory[] 배열 (크기 60)&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;이전수 보기를 했을땐 boardhistory 배열을 하나전으로 돌려서 &lt;BR&gt;(이번수가 boardhistory[10] 에 저장되는거였다면 boardhistory[9]로)&lt;BR&gt;그 배열에 저장되어 있는&amp;nbsp;64칸으로 판 구성을 바꿉니다.(이전수의 판 상황이므로)&lt;BR&gt;차례 역시&amp;nbsp;이전 배열(여기에선 boardhistory[9])의 마지막 값으로&amp;nbsp;바꿔줍니다.&lt;BR&gt;&lt;BR&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot; color=#0080ff&gt;*이전수 보기 함수 - returnmove 함수&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;글 작성 완료 버튼을 누르면&lt;BR&gt;이 boardhistory[] 배열이 db로 보내져서 하나의 기보가 올라가게 됩니다.&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;기본적인 알고리즘은 위와 같습니다.&lt;BR&gt;오델로판의 처음 상태에서 시작해서 두는대로 게임이 진행되고,&lt;BR&gt;이전수로 돌릴수도 있는 히스토리 기능이 포함되어 있습니다.&lt;BR&gt;&lt;BR&gt;소스는 다음과 같습니다. &lt;BR&gt;소스에는 othellogibo.js 와 othellogibo.htm 이렇게 두개의 소스가 있습니다.&lt;BR&gt;othellogibo.js엔 기능적인 소스가 다 포함되어 있고, othellogibo.htm에서는&amp;nbsp;오델로판을 출력해주는 역할을 합니다.&lt;BR&gt;소스가 상당히 깁니다 ^^;&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;&lt;FONT face=돋움 size=3&gt;othellogibo.js 소스&lt;/FONT&gt;&lt;/STRONG&gt;&lt;BR&gt;&lt;BR&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;var&amp;nbsp;EMPTY = 0;&amp;nbsp;&amp;nbsp;&lt;BR&gt;var&amp;nbsp;BLACK = 1;&amp;nbsp;&amp;nbsp;&lt;BR&gt;var&amp;nbsp;WHITE = 2;&amp;nbsp;&amp;nbsp;&lt;BR&gt;var&amp;nbsp;BLACKTRANS = 3;&amp;nbsp;&amp;nbsp;&lt;BR&gt;var&amp;nbsp;WHITETRANS = 4;&amp;nbsp;&amp;nbsp;&lt;BR&gt;var&amp;nbsp;BLACKL = 5;&lt;BR&gt;var&amp;nbsp;WHITEL = 6;&lt;BR&gt;var&amp;nbsp;&amp;nbsp; BLACKFLIP=7;&lt;BR&gt;var&amp;nbsp;&amp;nbsp; WHITEFLIP=8;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;var movenum = 0;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;var&amp;nbsp;piecewidth = 38;&lt;BR&gt;var&amp;nbsp;pieceheight = 38;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;var&amp;nbsp;width = 8;&lt;BR&gt;var&amp;nbsp;height = 8;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;var&amp;nbsp;showcursor = true;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;var&amp;nbsp;picture = new Array();&lt;BR&gt;var&amp;nbsp;board = new Array(width);&lt;BR&gt;var&amp;nbsp;boardset = new Array(width);&lt;BR&gt;var&amp;nbsp;boardhistory = new Array(61);&lt;BR&gt;var&amp;nbsp;turn = BLACK;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;var tempx;&lt;BR&gt;var tempy;&lt;BR&gt;var tempp;&lt;BR&gt;var tempplaymove;&lt;BR&gt;var tempx2;&lt;BR&gt;var tempy2;&lt;BR&gt;var tempp2;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;var lastlookup = 0;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&lt;FONT color=#008000&gt;//img name을 document.images[i] 의 i값으로 바꿔줌&lt;/FONT&gt;&lt;BR&gt;function lookup(name) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(i = lastlookup; i &amp;lt; document.images.length; i++)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(document.images[i].name == name) { lastlookup = i; return(i); }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(i = 0; i &amp;lt; lastlookup; i++)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(document.images[i].name == name) { lastlookup = i; return(i); }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return(-1);&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&lt;FONT color=#008000&gt;//piece 설정&lt;/FONT&gt;&lt;BR&gt;function piece(imagename) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.imagenum = lookup(imagename);&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&lt;FONT color=#008000&gt;//이미지 불러오기&lt;/FONT&gt;&lt;BR&gt;function LoadPieceImage(picnum, pictureURL) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; picture[picnum] = new Image();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; picture[picnum].src = pictureURL;&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&lt;FONT color=#008000&gt;//돌 이미지 체인지&lt;/FONT&gt;&lt;BR&gt;function SetPieceImage(x, y, src) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(document.images[board[x][y].imagenum].src != src) {&lt;BR&gt;&amp;nbsp;document.images[board[x][y].imagenum].src = src;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&lt;FONT color=#008000&gt;//판 초기화&lt;/FONT&gt;&lt;BR&gt;function InitializeBoard(color) {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(x = 0; x &amp;lt; width; x++){&lt;BR&gt;&amp;nbsp;board[x] = new Array (height);&lt;BR&gt;&amp;nbsp;boardset[x] = new Array (height);&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;for(x=0;x&amp;lt;61;x++)&lt;BR&gt;&amp;nbsp;&amp;nbsp;boardhistory[x] =&quot;&quot;;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; document.write(&apos;&amp;lt;TABLE CELLPADDING=&quot;0&quot; CELLSPACING=&quot;1&quot; BORDER=&quot;0&quot; COLS=&quot;&apos; + width + &apos;&quot; ROWS=&quot;&apos; + height + &apos;&quot; bgcolor = black&amp;gt;&apos;);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(y = 0; y &amp;lt; height; y++) {&lt;BR&gt;&amp;nbsp;document.write(&apos;&amp;lt;TR&amp;gt;&apos;);&lt;BR&gt;&amp;nbsp;for(x = 0; x &amp;lt; width; x++) {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if((x == 3 &amp;amp;&amp;amp; y == 3) || (x == 4 &amp;amp;&amp;amp; y == 4)) player = WHITE;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if((x == 3 &amp;amp;&amp;amp; y == 4) || (x == 4 &amp;amp;&amp;amp; y == 3)) player = BLACK;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else player = EMPTY;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; document.write(&apos;&amp;lt;TD BGCOLOR=&quot;&apos; + color + &apos;&quot; WIDTH=&quot;&apos; + piecewidth + &apos;&quot; HEIGHT=&quot;&apos; + pieceheight + &apos;&quot;&amp;gt;&amp;lt;A HREF=&quot;javascript:void(0);&quot; onClick=&quot;PutPiece(&apos; + x + &apos;, &apos; + y + &apos;)&quot; onMouseOver=&quot;CheckPutPiece(&apos; + x + &apos;, &apos; + y + &apos;)&quot; onMouseOut=&quot;RestorePiece(&apos; + x + &apos;, &apos; + y + &apos;)&quot; onfocus = blur();&amp;gt;&amp;lt;IMG NAME=&quot;c[&apos; + x + &apos;,&apos; + y + &apos;]&quot; SRC=&quot;&apos; + picture[player].src + &apos;&quot; BORDER=&quot;0&quot; HEIGHT=&quot;&apos; + pieceheight + &apos;&quot; WIDTH=&quot;&apos; + piecewidth + &apos;&quot;&amp;gt;&amp;lt;/A&amp;gt;&amp;lt;/TD&amp;gt;&apos;);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;board[x][y] = new piece(&apos;c[&apos; + x + &apos;,&apos; + y + &apos;]&apos;);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; boardset[x][y] = player;&lt;BR&gt;&amp;nbsp;&amp;nbsp;boardhistory[0] += player+&quot;,&quot;;&lt;BR&gt;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&amp;nbsp;document.writeln(&apos;&amp;lt;/TR&amp;gt;&apos;);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; document.write(&apos;&amp;lt;/TABLE&amp;gt;&amp;lt;div align = center&amp;gt;&amp;lt;A HREF=&quot;javascript:void(0);&quot; onClick=&quot;ResetBoard()&quot; onfocus = blur();&amp;gt;&amp;lt;font color = #f0f0f0&amp;gt;판 지우기&amp;lt;/a&amp;gt; | &amp;lt;A HREF=&quot;javascript:void(0);&quot; onClick=&quot;Returnmove()&quot; onfocus = blur();&amp;gt;&amp;lt;font color = #f0f0f0&amp;gt;◀ 이전으로&amp;lt;/font&amp;gt;&amp;lt;/A&amp;gt;&amp;lt;/div&amp;gt;&apos;);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&amp;nbsp;&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&lt;FONT color=#008000&gt;//판 리셋&lt;/FONT&gt;&lt;BR&gt;function ResetBoard() {&lt;BR&gt;&amp;nbsp;movenum = 0;&lt;BR&gt;&amp;nbsp;for(x=0;x&amp;lt;61;x++)&lt;BR&gt;&amp;nbsp;&amp;nbsp;boardhistory[x] =&quot;&quot;;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(y = 0; y &amp;lt; height; y++) {&lt;BR&gt;&amp;nbsp;for(x = 0; x &amp;lt; width; x++) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; boardset[x][y] = EMPTY;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetPieceImage(x, y, picture[EMPTY].src);&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;document.write.transcript.value = &quot;&quot;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RawPutPiece(3, 3, WHITE);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RawPutPiece(4, 4, WHITE);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RawPutPiece(3, 4, BLACK);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RawPutPiece(4, 3, BLACK);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;for(y = 0; y &amp;lt; height; y++) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;for(x = 0; x &amp;lt; width; x++) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; boardhistory[0] += boardset[x][y]+&apos;,&apos; ;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; turn = BLACK;&lt;BR&gt;&amp;nbsp;checknum();&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&lt;FONT color=#008000&gt;//돌아가는 돌 개수 계산&lt;/FONT&gt;&lt;BR&gt;function NumFlips(x, y, player) {&lt;BR&gt;&amp;nbsp;var playerl;&lt;BR&gt;&amp;nbsp;var playerflip;&lt;BR&gt;&amp;nbsp;if(player == WHITE) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;playerl = WHITEL;&lt;BR&gt;&amp;nbsp;&amp;nbsp;playerflip = WHITEFLIP;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;else{&lt;BR&gt;&amp;nbsp;&amp;nbsp;playerl = BLACKL;&lt;BR&gt;&amp;nbsp;&amp;nbsp;playerflip = BLACKFLIP;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var deltax, deltay, distance;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var posx, posy;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var count = 0;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(deltay = -1; deltay &amp;lt;= 1; deltay++) {&lt;BR&gt;&amp;nbsp;for(deltax = -1; deltax &amp;lt;= 1; deltax++) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(distance = 1;; distance++) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;posx = x + (distance * deltax);&lt;BR&gt;&amp;nbsp;&amp;nbsp;posy = y + (distance * deltay);&lt;BR&gt;&lt;FONT color=#008000&gt;&amp;nbsp;&amp;nbsp;// 판 밖으로 벗어나면 멈춤&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;if(posx &amp;lt; 0 || posx &amp;gt;= width || posy &amp;lt; 0 || posy &amp;gt;= height)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&lt;FONT color=#008000&gt;// 빈칸에 도달하면 멈춤&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;if(boardset[posx][posy] == EMPTY)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;// player랑 같은 색을 만나면 돌아가는 돌 계산&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;if((boardset[posx][posy] == player)||(boardset[posx][posy] == playerl)||(boardset[posx][posy] == playerflip)) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; count += distance - 1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return(count);&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&lt;FONT color=#008000&gt;//지정한 좌표에 지정한 돌의 색깔과 이미지 넣기&lt;BR&gt;&lt;/FONT&gt;function RawPutPiece(x, y, player) {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; boardset[x][y] = player;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetPieceImage(x, y, picture[player].src);&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&lt;FONT color=#008000&gt;//수 두기, 돌아가는 돌들 계산&lt;BR&gt;&lt;/FONT&gt;function FlipPieces(x, y, player) {&lt;BR&gt;&amp;nbsp;if(movenum == 0){&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;boardhistory[0] += 1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;document.write.transcript.value += boardhistory[0]+&apos;|&apos;;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;movenum++;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var deltax, deltay, distance;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var posx, posy;&lt;BR&gt;&amp;nbsp;for (u =0;u&amp;lt;width&amp;nbsp; ;u++ )&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;for(w=0;w&amp;lt;width;w++){&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(boardset[w][u] == WHITEFLIP) RawPutPiece(w, u, WHITE);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(boardset[w][u] == BLACKFLIP) RawPutPiece(w, u, BLACK);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(boardset[w][u] == WHITEL) RawPutPiece(w, u, WHITE);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(boardset[w][u] == BLACKL) RawPutPiece(w, u, BLACK);&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(player == 1) playmove = 5;&lt;BR&gt;&amp;nbsp;else playmove = 6;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RawPutPiece(x, y, player);&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;var checkt = 0;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&amp;nbsp;var u,w;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(deltay = -1; deltay &amp;lt;= 1; deltay++) {&lt;BR&gt;&amp;nbsp;for(deltax = -1; deltax &amp;lt;= 1; deltax++) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(distance = 1;; distance++) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;posx = x + (distance * deltax);&lt;BR&gt;&amp;nbsp;&amp;nbsp;posy = y + (distance * deltay);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt;// 판밖으로 벗어나면 멈춤&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;if(posx &amp;lt; 0 || posx &amp;gt;= width || posy &amp;lt; 0 || posy &amp;gt;= height)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&lt;FONT color=#008000&gt;&amp;nbsp;&amp;nbsp;// 빈캄에 도달하면 멈춤&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;if(boardset[posx][posy] == EMPTY)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&amp;nbsp;&lt;FONT color=#008000&gt;&amp;nbsp;// player랑 같은 색을 만나면 돌아가는 돌 계산&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;if((boardset[posx][posy] == player)) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(distance!=1){&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(checkt!=0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;checkt++;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;var flipplayer;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(player == WHITE) flipplayer = WHITEFLIP;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;else flipplayer = BLACKFLIP;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(distance--; distance &amp;gt; 0; distance--) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;posx = x + (distance * deltax);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;posy = y + (distance * deltay);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;RawPutPiece(posx, posy, player);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;boardset[posx][posy] = flipplayer;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RawPutPiece(x, y, playmove);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&amp;nbsp;for (u =0;u&amp;lt;width&amp;nbsp; ;u++ )&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;for(w=0;w&amp;lt;width;w++){&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;boardhistory[movenum] += boardset[w][u]+&quot;,&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&lt;FONT color=#008000&gt;//이전수 보여주기&lt;/FONT&gt;&lt;BR&gt;function Returnmove(){&lt;BR&gt;&amp;nbsp;if(movenum &amp;gt; 0){&lt;BR&gt;&amp;nbsp;document.write.transcript.value = document.write.transcript.value.replace(boardhistory[movenum]+&quot;|&quot;,&quot;&quot;);&lt;BR&gt;&amp;nbsp;boardhistory[movenum] =&apos;&apos;;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;movenum--;&lt;BR&gt;&amp;nbsp;var backmove=boardhistory[movenum].split(&quot;,&quot;);;&amp;nbsp;&lt;BR&gt;&amp;nbsp;var i,j;&lt;BR&gt;&amp;nbsp;var cut;&lt;BR&gt;&amp;nbsp;&amp;nbsp;for (i=0;i&amp;lt;width ;i++)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;for (j=0;j&amp;lt;width ;j++)&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;cut = eval(8*i+j);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;RawPutPiece(j, i,backmove[cut] );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(boardset[j][i]== BLACKFLIP) RawPutPiece(j, i,BLACK);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(boardset[j][i]== WHITEFLIP) RawPutPiece(j, i,WHITE);&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&amp;nbsp;if(movenum == 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;turn = BLACK;&lt;BR&gt;&amp;nbsp;else{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;turn = backmove[64];&lt;BR&gt;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&lt;FONT color=#008000&gt;//가능한 수가 있는지 체크&lt;/FONT&gt;&lt;BR&gt;function AnyMoves(player) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var x, y;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(y = 0; y &amp;lt; height; y++) {&lt;BR&gt;&amp;nbsp;for(x = 0; x &amp;lt; width; x++) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(boardset[x][y] != EMPTY) continue;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(NumFlips(x, y, player) &amp;gt; 0) return(true);&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return(false);&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&lt;FONT color=#008000&gt;//수를 둘수 있는곳인지 체크&lt;/FONT&gt;&lt;BR&gt;function CanPutPiece(x, y, player) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(turn != player)&lt;BR&gt;&amp;nbsp;return(false);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(boardset[x][y] != EMPTY)&lt;BR&gt;&amp;nbsp;return(false);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return(NumFlips(x, y, player) &amp;gt; 0);&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&lt;FONT color=#008000&gt;//마우스 포인터가 over 됐을때 수를 둘수 있는곳이면 TRANS 이미지를 보여줌&lt;/FONT&gt;&lt;BR&gt;function CheckPutPiece(x, y) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var over;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(! showcursor) return;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(! CanPutPiece(x, y, turn)) return;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(turn == WHITE) over = WHITETRANS;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else over = BLACKTRANS;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetPieceImage(x, y, picture[over].src);&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&lt;FONT color=#008000&gt;//마우스포인터가 out 됐을때 이미지 복구&lt;BR&gt;&lt;/FONT&gt;function RestorePiece(x, y) {&lt;BR&gt;&amp;nbsp;var backsrc;&lt;BR&gt;&amp;nbsp;if(boardset[x][y] == BLACKFLIP) backsrc = picture[BLACK].src;&lt;BR&gt;&amp;nbsp;else if(boardset[x][y] == WHITEFLIP) backsrc = picture[WHITE].src;&lt;BR&gt;&amp;nbsp;else backsrc = picture[boardset[x][y]].src&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetPieceImage(x, y, backsrc);&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&lt;FONT color=#008000&gt;//수 두기&lt;BR&gt;&lt;/FONT&gt;function PutPiece(x, y) {&lt;BR&gt;&amp;nbsp;&amp;nbsp; if(! CanPutPiece(x, y, turn)) return;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FlipPieces(x, y, turn);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DoneTurn();&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&lt;FONT color=#008000&gt;//상대 플레이어 지정&lt;/FONT&gt;&lt;BR&gt;function OtherPlayer(player) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(player == WHITE)&lt;BR&gt;&amp;nbsp;&amp;nbsp;player = BLACK;&lt;BR&gt;&amp;nbsp;else&lt;BR&gt;&amp;nbsp;&amp;nbsp;player = WHITE;&lt;BR&gt;&amp;nbsp;return(player);&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&lt;FONT color=#008000&gt;//턴 완료&lt;/FONT&gt;&lt;BR&gt;function DoneTurn() {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var moves = AnyMoves(turn);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; turn = OtherPlayer(turn);&lt;BR&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(! AnyMoves(turn)) {&lt;BR&gt;&amp;nbsp;if(! moves) return(GameOver());&lt;BR&gt;&amp;nbsp;turn = OtherPlayer(turn);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; checknum();&lt;BR&gt;&amp;nbsp;boardhistory[movenum]+= turn;&lt;BR&gt;&amp;nbsp;document.write.transcript.value += boardhistory[movenum]+&quot;|&quot;;&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&lt;FONT color=#008000&gt;//스코어 계산&lt;/FONT&gt;&lt;BR&gt;function checknum(){ &lt;BR&gt;&amp;nbsp;var x,y;&lt;BR&gt;&amp;nbsp;var blacknum = 0;&lt;BR&gt;&amp;nbsp;var whitenum = 0;&lt;BR&gt;&amp;nbsp;for(y=0;y&amp;lt;width ;y++){&lt;BR&gt;&amp;nbsp;&amp;nbsp;for(x=0;x&amp;lt;width;x++){&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if((boardset[x][y] == WHITE)||(boardset[x][y]==WHITEL)||(boardset[x][y]==WHITEFLIP))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;whitenum++;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;else if(boardset[x][y] ==EMPTY){}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;else blacknum++;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;document.write.winlose.value = blacknum +&apos; - &apos;+whitenum;&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&lt;FONT color=#008000&gt;//게임 종료&lt;/FONT&gt;&lt;BR&gt;function GameOver() {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;document.write.transcript.value += boardhistory[movenum]+&quot;|&quot;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; checknum();&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face=돋움&gt;&lt;STRONG&gt;&lt;FONT size=3&gt;othellogibo.htm 소스&lt;/FONT&gt;&lt;/STRONG&gt;&lt;BR&gt;&lt;BR&gt;&amp;lt;SCRIPT language=JavaScript1.2 &lt;BR&gt;src=&quot;othellogibo.js&quot;&amp;gt;&amp;lt;/SCRIPT&amp;gt;&lt;/FONT&gt;&lt;/P&gt;&lt;FONT face=돋움&gt;
&lt;P&gt;&lt;BR&gt;&amp;lt;SCRIPT language=JavaScript1.2&amp;gt;&lt;/P&gt;
&lt;P&gt;LoadPieceImage(EMPTY,&quot;images/blank.gif&quot;);&lt;BR&gt;LoadPieceImage(BLACK, &quot;images/black.gif&quot;);&lt;BR&gt;LoadPieceImage(WHITE,&quot;images/white.gif&quot;);&lt;BR&gt;LoadPieceImage(BLACKTRANS, &quot;images/black-trans.gif&quot;);&lt;BR&gt;LoadPieceImage(WHITETRANS, &quot;images/white-trans.gif&quot;);&lt;BR&gt;LoadPieceImage(BLACKL, &quot;images/blackl.gif&quot;);&lt;BR&gt;LoadPieceImage(WHITEL, &quot;images/whitel.gif&quot;);&lt;BR&gt;LoadPieceImage(BLACKFLIP, &quot;images/blackflip.gif&quot;);&lt;BR&gt;LoadPieceImage(WHITEFLIP, &quot;images/whiteflip.gif&quot;);&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;InitializeBoard(&quot;green&quot;);&lt;BR&gt;// --&amp;gt;&lt;BR&gt;&amp;lt;/SCRIPT&amp;gt;&lt;BR&gt;&amp;lt;body bgcolor = 292929&amp;gt;&lt;BR&gt;&amp;lt;form method=post name=write enctype=multipart/form-data&amp;gt;&lt;BR&gt;&amp;lt;input type=hidden name=transcript&amp;nbsp; size = 100 value=&quot;&quot;&amp;gt;&amp;lt;br&amp;gt;&lt;BR&gt;&amp;lt;input type=hidden name=&quot;winlose&quot; value=&quot;&quot; &amp;gt;&lt;BR&gt;&amp;lt;/form&amp;gt;&lt;BR&gt;&lt;BR&gt;------------------------------------------------------------&lt;BR&gt;&lt;BR&gt;위 두 소스를 저장하여 계정의 같은 폴더에 올리고 othellogibo.htm을 실행하면 실행이 됩니다.&lt;/FONT&gt;&lt;/P&gt;&lt;/div&gt;</content>
                  
   </entry>
   <entry>
      <title>기보게시판 관련 웹프로그래밍 질문입니다.</title>
      <id>http://othelloclub.com/29509</id>
      <published>2006-04-04T17:48:08+09:00</published>
      <updated>2008-03-13T12:57:18+09:00</updated>
      <link rel="alternate" type="text/html" href="http://othelloclub.com/29509"/>
      <link rel="replies" type="text/html" href="http://othelloclub.com/29509#comment"/>
      <author>
         <name>클럽장</name>
               </author>
            <content type="html">&lt;div class=&quot;xe_content&quot;&gt;예전에 gnop님 홈피에 있었던 기보 게시판을 구상해보고 있는데 정말 힘드네요..&lt;BR&gt;혹시&amp;nbsp;프로그래밍쪽에 대해서 잘 아시는 분이 계시면 답변 좀&amp;nbsp;해주셨으면 좋겠습니다.&lt;BR&gt;웹프로그래밍 관련인데요..&lt;BR&gt;&lt;BR&gt;만들고 싶은 기보 게시판은 이거입니다. 기보를 올리면,&lt;BR&gt;매 수마다 작성자가 설명을 써넣을수 있고, 유저들은 매 수에 코멘트를 달수 있는 기보 게시판인데요.&lt;BR&gt;&lt;BR&gt;일단 자바 스크립트와 php를 이용해서 구상해보려고 했는데,&lt;BR&gt;(실제로 예전에 gnop님이 자바 스크립트로 위 기보 게시판을 만드셨었죠..) &lt;BR&gt;기보를 저장했다가 뿌리는 부분을 어떻게 해야 할지 모르겠습니다.&lt;BR&gt;&lt;BR&gt;예를 들어 예전 gnop의 기보 게시판에서는&lt;BR&gt;글쓰기를 누르면 오델로 초기 상태의 판이 나타납니다.&lt;BR&gt;그래서 자신이 올리려는 기보 순서대로 판에다가 두면, 계속 둬집니다. &lt;BR&gt;그러다 끝까지 두고서, 글작성 버튼을 누르면&amp;nbsp;방금 둔 기보가 올라갑니다.&lt;BR&gt;&lt;BR&gt;이렇게 작성된 글은 한수당 글쓴 사람이 설명을 작성할수 있고, 한수당 유저들이 코멘트를 달수 있는 구조로 되있습니다.&lt;BR&gt;&lt;BR&gt;한수당 설명을 작성하고, 코멘트를 작성하는건 제가 어느정도 구현할수 있는 부분인데요(php&amp;nbsp;관련),&lt;BR&gt;문제는 위에서처럼 글 쓸때 기보대로 둔게 저장이 돼서 보여지는 부분입니다.&lt;BR&gt;이걸 어떻게 구현해야 할지 전혀 감이 안옵니다.&lt;BR&gt;&lt;BR&gt;두는 대로 저장이 되는건 분명히 자바 스크립트를 이용하여 배열에 저장을 하는것 같은데,&lt;BR&gt;배열에 어떤값을&amp;nbsp;어떤식으로 저장해야 할지도 잘 모르겠고..&lt;BR&gt;무엇보다 자바 스크립트의 변수는 php로 전달이 안되기 때문에, 저장했다고 해도&lt;BR&gt;이 저장된 자바의 변수를 php 변수로 넘겨주는 과정을 어떻게 해야 할지 모르겠습니다.&lt;BR&gt;(php 변수로 넘겨줘야 기보를 보여줄수 있기 때문에)&lt;BR&gt;&lt;BR&gt;php랑 자바 스크립트를 체계적으로 배운게 아니라 사이트 만들면서 막무가내로 배웠기 때문에&lt;BR&gt;참 어렵네요. 혹시나 위와 같은 기보 게시판을 만드려면 어떻게 해야 하는지 조금이라도 아시는분께서는&lt;BR&gt;조언을 해주시면 정말 감사드리겠습니다.&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;참고로 자바 스크립트로 구현된 오델로 프로그램은&lt;BR&gt;&lt;A href=&quot;http://othelloclub.com/othellojava/othello.htm&quot;&gt;http://othelloclub.com/othellojava/othello.htm&lt;/A&gt;&amp;nbsp;여기에 있습니다.&lt;BR&gt;자바스크립트 파일은 &lt;A href=&quot;http://othelloclub.com/othellojava/othello.js&quot;&gt;http://othelloclub.com/othellojava/othello.js&lt;/A&gt; 입니다.&lt;BR&gt;아싸리버시에 올라온 곰돌이 푸우 오델로를 약간 변형시켜 흑,백 다 사람이 둘수 있게 했습니다.&lt;BR&gt;이렇게 양쪽다 사람이 두는걸 첫수부터 끝수까지 저장해서 php로 뿌려줄수 있으면 좋겠는데,&lt;BR&gt;어떻게 해야 할지 정말 감이 안잡히네요.. &lt;BR&gt;오델로 프로그래밍은 자바 스크립트가 하고, &lt;BR&gt;게시판에서 뿌려주는건 php가 하기 때문에&amp;nbsp;자바스크립의 변수 -&amp;gt; php 변수가 되야 하는데&amp;nbsp;이 방법을 도통 모르겠으니..&lt;BR&gt;프로그래밍 쪽에 대해 조금이라도 아시는분들께서는 조언좀 부탁드립니다.&lt;/div&gt;</content>
                  
   </entry>
   <entry>
      <title>[re] 제브라 애플릿 사용법</title>
      <id>http://othelloclub.com/29424</id>
      <published>2006-04-05T00:35:12+09:00</published>
      <updated>2008-03-13T12:57:18+09:00</updated>
      <link rel="alternate" type="text/html" href="http://othelloclub.com/29424"/>
      <link rel="replies" type="text/html" href="http://othelloclub.com/29424#comment"/>
      <author>
         <name>클럽장</name>
               </author>
            <content type="html">&lt;div class=&quot;xe_content&quot;&gt;댓글이 길어지는거 같아서 답글로 씁니다..&lt;BR&gt;&lt;BR&gt;제브라 애플릿 같은 경우는 html 안에서 다음과 같이 사용합니다.&lt;BR&gt;&lt;BR&gt;&amp;lt;applet archive=&quot;OthelloBrowser.jar&quot; code=&quot;OthelloBrowser.class&quot; &lt;BR&gt;codebase=&quot;&lt;A href=&quot;http://othelloclub.com/wzebra&quot;&gt;http://othelloclub.com/wzebra&lt;/A&gt;&quot; width=&quot;279&quot; &lt;BR&gt;height=&quot;359&quot; align=&quot;left&quot;&amp;gt;&lt;BR&gt;&amp;lt;param name=&quot;game&quot; value=&apos;F5D6C5F4E3C6D3F6E6D7G4G3G5H4H6H3F7G6E7C3C4C7B6A6D8C8H7E8F8G8H5H8G7F3E2B5B4C2B3D2F2A5&apos;&amp;gt;&lt;BR&gt;&amp;lt;param name=&quot;board&quot; value=&quot;--------------------------------------------O#--------#O--------------------------------------------&quot;&amp;gt;&lt;BR&gt;&amp;lt;param name=&quot;atmove&quot; value=&quot;black&quot;&amp;gt;&lt;BR&gt;&amp;lt;/applet&amp;gt;&lt;BR&gt;&lt;BR&gt;이미 제작자가 만들어논 애플릿 파일 OthelloBrowser.jar과 OthelloBrowser.class 이 &lt;BR&gt;오델로클럽에 올라가져 잇구요, 그 파일안의 함수를 이용해서 html에서 출력합니다.&lt;BR&gt;&lt;BR&gt;위처럼 param name=&quot;game&quot;일경우 value에 기보좌표를 넣으면 html에서 제브라로 기보가 보여지게 됩니다.&lt;BR&gt;&lt;/div&gt;</content>
                  
   </entry>
   <entry>
      <title>[re] 역 탐지 방법!! 은 할 수 없지만 다른 방법</title>
      <id>http://othelloclub.com/29411</id>
      <published>2006-04-05T09:49:37+09:00</published>
      <updated>2008-03-13T12:57:17+09:00</updated>
      <link rel="alternate" type="text/html" href="http://othelloclub.com/29411"/>
      <link rel="replies" type="text/html" href="http://othelloclub.com/29411#comment"/>
      <author>
         <name>노동춘</name>
               </author>
            <content type="html">&lt;div class=&quot;xe_content&quot;&gt;배열(자리)을 기억했다&amp;nbsp;그 자리부터 &amp;nbsp;바꾸는 것이 좋지요.(어제 생각하신 방법)&lt;BR&gt;&lt;BR&gt;//다른 방법론&lt;BR&gt;역 탐지는 할수 없지만 &lt;BR&gt;배열로 순서는 기억하고 있어야 하지요!!&lt;BR&gt;&lt;BR&gt;이전 수는 처음부터 이전수까지 프로그램이 빠르게 보여주게끔 하는 방법은 어떨까요?&lt;BR&gt;스크립트가 늦게 보여주면 어쩔수 없지만 보여주는 부분을 빠르게 하면 ㅠㅠ&lt;BR&gt;늦게 보여주면&amp;nbsp;프로그램이 지저분해지나요?&lt;BR&gt;아님 연산을 한 후 마지막 결과(이전수까지)만 보여 지게 끔하는 방법도 좋겠네요. //&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;전 같은 결과가 나오는 프로그램은 이상하게 프로그램은&amp;nbsp;짧을수록 &lt;BR&gt;같은 모듈을을 여러번 사용할수록 사용좋다고 생각해서요!!&lt;BR&gt;그래야 소스를 보는 사람도 쉽게 이해 하게끔!!&lt;BR&gt;&lt;BR&gt;이상 생각난거 한번 적어 봤어요.&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;/div&gt;</content>
                  
   </entry>
   <entry>
      <title>zebra 소스코드 분석 및 오델로 게이트 웨이 블로그 번역 작업...</title>
      <id>http://othelloclub.com/29409</id>
      <published>2005-07-09T15:26:50+09:00</published>
      <updated>2008-03-13T12:57:17+09:00</updated>
      <link rel="alternate" type="text/html" href="http://othelloclub.com/29409"/>
      <link rel="replies" type="text/html" href="http://othelloclub.com/29409#comment"/>
      <author>
         <name>김경중</name>
               </author>
            <content type="html">&lt;div class=&quot;xe_content&quot;&gt;http://candy.yonsei.ac.kr/~uribyul/zebra.htm&lt;br /&gt;
http://candy.yonsei.ac.kr/~uribyul/gateway.htm&lt;/div&gt;</content>
                  
   </entry>
   <entry>
      <title>wzebra 소스코드 컴파일...</title>
      <id>http://othelloclub.com/29407</id>
      <published>2005-06-30T14:02:58+09:00</published>
      <updated>2008-03-13T12:57:17+09:00</updated>
      <link rel="alternate" type="text/html" href="http://othelloclub.com/29407"/>
      <link rel="replies" type="text/html" href="http://othelloclub.com/29407#comment"/>
      <author>
         <name>김경중</name>
               </author>
            <content type="html">&lt;div class=&quot;xe_content&quot;&gt;약간 기술적인 이야기가 될 것 같은데....&lt;br /&gt;
&lt;br /&gt;
오늘 컴파일을 해보았는데 (소스코드-&amp;gt;실행화일) &lt;br /&gt;
&lt;br /&gt;
일반 리눅스에서는 무슨 이유에서인지 컴파일 중에 에러가 났고 &lt;br /&gt;
&lt;br /&gt;
cygwin을 윈도우즈에 설치해서 컴파일 하니까 정상적으로 됨. &lt;br /&gt;
&lt;br /&gt;
우리가 일반적으로 쓰는 zebra 화면은 뜨지 않고 텍스트 인터페이스를 제공함. (좀 더 자세히 봐야 하겠지만 인터페이스 소스는 없는 듯) &lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;</content>
                  
   </entry>
   <entry>
      <title>Wzebra 소스코드 다운로드</title>
      <id>http://othelloclub.com/29405</id>
      <published>2005-06-03T19:54:50+09:00</published>
      <updated>2008-03-13T12:57:17+09:00</updated>
      <link rel="alternate" type="text/html" href="http://othelloclub.com/29405"/>
      <link rel="replies" type="text/html" href="http://othelloclub.com/29405#comment"/>
      <author>
         <name>김경중</name>
               </author>
            <content type="html">&lt;div class=&quot;xe_content&quot;&gt;http://radagast.se/othello/zebra.tar.gz&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;</content>
                  
   </entry>
   <entry>
      <title>제브라 오픈소스가 눈앞에 왔습니다.</title>
      <id>http://othelloclub.com/29396</id>
      <published>2004-11-19T00:11:00+09:00</published>
      <updated>2008-03-13T12:57:17+09:00</updated>
      <link rel="alternate" type="text/html" href="http://othelloclub.com/29396"/>
      <link rel="replies" type="text/html" href="http://othelloclub.com/29396#comment"/>
      <author>
         <name>노리</name>
               </author>
            <content type="html">&lt;div class=&quot;xe_content&quot;&gt;Subject:&amp;nbsp;&amp;nbsp;WZebra current and future development&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
ADVERTISEMENT&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
Hi all,&lt;br /&gt;
&lt;br /&gt;
As you&apos;ve noticed, I haven&apos;t done a lot of development on WZebra for&lt;br /&gt;
quite some time. There are two main reasons for this: (1) WZebra is&lt;br /&gt;
rather mature as Othello programs go, and more importantly (2) I don&apos;t&lt;br /&gt;
have the same drive to spend as much time on the project as I once did.&lt;br /&gt;
&lt;br /&gt;
My plans for the future of (W)Zebra are as follows:&lt;br /&gt;
&lt;br /&gt;
(1) I will release WZebra 4.2.2 late this year. It will contain at&lt;br /&gt;
least one new translation (German), maybe several. I&apos;ve fixed a few&lt;br /&gt;
buglets and will probably fix some more. I&apos;ll also try to implement&lt;br /&gt;
book merging.&lt;br /&gt;
&lt;br /&gt;
(2) We (me and Lars) have decided to release the Zebra+WZebra code under&lt;br /&gt;
the GPL. This will also happen some time later this year.&lt;br /&gt;
&lt;br /&gt;
(3) What happens next depends on if there are any helping hands&lt;br /&gt;
interested in continuing work on WZebra. I will help along to some&lt;br /&gt;
extent, and I can also organize releases and review kernel patches. I&lt;br /&gt;
haven&apos;t thought a great deal about how this should be organized -&lt;br /&gt;
contact me if you are willing to work on it. If there is no interest in&lt;br /&gt;
this I will probably work on WZebra at the pace I see fit (ranging from&lt;br /&gt;
hectic to glacial depending on my mood).&lt;br /&gt;
&lt;br /&gt;
To people interested in (3): There&apos;s quite a lot of code and you have to&lt;br /&gt;
know to program well in order to contribute to most modules of the code.&lt;br /&gt;
The kernel is in C and Pentium assembly (but you don&apos;t have to know&lt;br /&gt;
any assembly, assembly is only used in two performance-critical parts of&lt;br /&gt;
the code). The GUI is in C++ using the wxWidgets interface.&lt;br /&gt;
&lt;br /&gt;
There are many easy or moderately hard things to work on: Contributing a&lt;br /&gt;
new translation is trivial. Changing e.g. the Thor interface is rather&lt;br /&gt;
easy because it&apos;s a very isolated change. Rewriting the program to play&lt;br /&gt;
anti-10x10 is a very large effort.&lt;br /&gt;
&lt;br /&gt;
/ Gunnar &lt;br /&gt;
&lt;/div&gt;</content>
                  
   </entry>
</feed> 
