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