오델로 프로그래밍
제브라 애플릿 같은 경우는 html 안에서 다음과 같이 사용합니다.
<applet archive="OthelloBrowser.jar" code="OthelloBrowser.class"
codebase="http://othelloclub.com/wzebra" width="279"
height="359" align="left">
<param name="game" value='F5D6C5F4E3C6D3F6E6D7G4G3G5H4H6H3F7G6E7C3C4C7B6A6D8C8H7E8F8G8H5H8G7F3E2B5B4C2B3D2F2A5'>
<param name="board" value="--------------------------------------------O#--------#O--------------------------------------------">
<param name="atmove" value="black">
</applet>
이미 제작자가 만들어논 애플릿 파일 OthelloBrowser.jar과 OthelloBrowser.class 이
오델로클럽에 올라가져 잇구요, 그 파일안의 함수를 이용해서 html에서 출력합니다.
위처럼 param name="game"일경우 value에 기보좌표를 넣으면 html에서 제브라로 기보가 보여지게 됩니다.

현재 역시 기보게시판에 가보시면 알겠지만 글 작성할때 기보 좌표 쓰는 란에 기보 좌표만 적으면
그걸 php변수로 저장하여 저 value값에 자동으로 들어가서 보여지게 해놨거든요..
제가 잘 못 이해 했나요? ㅠㅠ
즉 지금은 기보 게시판에 기보를 올리려면 제브라 같은곳에서 기보좌표를 뽑아내서 적어야 하는데..
제브라를 잘 못다루시는 분들은 그게 힘드니 예전 gnop님 게시판처럼 하나하나 클릭해서 기보를 올릴수 있게 하는게 첫번째의 목표구요..
보여지는것 역시 지금처럼 통째로 보여지는게 아니라
매수마다 설명을 달수 있고 매수마다 각각 코멘트를 달수 있게..
이게 지금 제브라 애플릿으로는 불가능하거든요..
이 두가지를 다 구현하고 싶어서요 ^^;
이게 첫수부터 마지막 수까지 그대로 이잖아요.. 유저 댓글 역시 첫수부터 마지막 수까지 변하지 않고..
제가 구현하고자 하는건 기보 보기에서 다음수를 누르면 우측에 다음수에 대한 설명이 나오고
유저들의 댓글 역시 다음수에 대한 댓글이 나오도록 하는거거든요...
이렇게 하려면 제브라 같은 자바 애플릿으로는 안되고,
자바 스크립트를 이용해서 매수마다 페이지가 바뀌도록 하면서 구현을 해야 하는데
역시 문제는 이전수를 보여주는거겠네요..
그렇다면 자바 스크립트 소스를 개선해야 하는데요.
역으로 돌려 놓는 알고리즘이 필요해요
또한 2차 배열 필요해요.(8곱하기8곱하기2)
한개는 놓는 순서하고 한개는 돌의 색이 먼지 기억해야 함.
혹시 오델로 프로그램 작성 해보셨나요?
돌 바꾸는 부분만 이해 하면 쉽게 구현 할 것 같기도 하네요
그래도 소스는 대충 이해 할수 있어요.. 알고리즘으로 말씀하시면 대충 구현가능하구요..
제가 올린 자바 스크립트 소스는 거의 다 이해했구요
아 이걸 어떻게 설명하지... 주석을 달아 드릴께요
혹시 c아세요?
BOOL COthelloDlg::LegalMove(int y, int x, int nType, BOOL bFlip)
{ //돌을 바꿀수 있는지 또는 바꿀수 없는지 채크 하고 바꿀수 있음 바꾼다.
int i, j; //서브 프로그램에서만 사용
BOOL bLegal = FALSE; //막 처음 바꿀수 없다라고 가정하고 들어간다.
int nStepCount; // 클릭한 곳부터 얼마큼 떨어져 있는가 확인한다.
int nOtherType = GetOtherType(nType); //지금 돌의 색깔 지정
int nNext = GetNext(nType); //다음 돌의 색깔 지정
if(m_nGame[y][x] != EMPTY) return FALSE; //클릭한 곳이 비워있지 않으면 리턴값은 바꿀수 없다.
// 여덟 방향 주위를 살펴봄
for(int xdir=-1 ; xdir<2 ; xdir++)
for(int ydir=-1 ; ydir<2 ; ydir++)
{
nStepCount = 0;
// 양쪽으로 포위할 수 있는 상대방 말이 있는지 봄
do
{
nStepCount++;
i = x+nStepCount*xdir;
j = y+nStepCount*ydir;
} while ( i>0 && i<9 && j>0 && j<9 && m_nGame[j][i] == nOtherType); //클릭한 곳이 비어 있지만 곁에 있는 모든 돌이 같은 색일경우 다음으로 넘어간다.
if(i>0 && i<9 && j>0 && j<9 && nStepCount>1 && m_nGame[j][i]==nType) //클릭한 곳이 비어 있고 곁에 있는 돌이 다를 경우 다음을 실행한다.
{
bLegal = TRUE; // 리턴값 바꿀수 있다.
if(bFlip)
{
// 말 바꾸기
for(int k=1 ; k<nStepCount ; k++)
m_nGame[y+ydir*k][x+xdir*k] = ACTIVATE;
SetTimer(CHANGESTONE, CHANGESTONESPEED, NULL); //실제로 바꾼것을 보여 주는 부분
}
}
}
return bLegal;
}
근데 이 소스는 수를 뒀을때 돌 돌아가는 함수 아닌가요? 8방향으로 검색해서 돌리는?
네에 맞아요 잠시만요 ㅠㅠ
function FlipPieces(x, y, player) {
var deltax, deltay, distance;
var posx, posy;
var count = 0;
// put a piece down at the desired location
RawPutPiece(x, y, player);
for(deltay = -1; deltay <= 1; deltay++) {
for(deltax = -1; deltax <= 1; deltax++) {
for(distance = 1;; distance++) {
posx = x + (distance * deltax);
posy = y + (distance * deltay);
// stop if we go off the board
if(posx < 0 || posx >= width || posy < 0 || posy >= height)
break;
// stop when we reach an empty square
if(board[posx][posy].player == EMPTY)
break;
if(board[posx][posy].player == player) {
// backtrack, flipping pieces
for(distance--; distance > 0; distance--) {
posx = x + (distance * deltax);
posy = y + (distance * deltay);
RawPutPiece(posx, posy, player);
}
break;
}
}
}
}
return(count);
}
위의 부분이 스크립트에서는 이렇게 되었군요.
이 부분을 역으로 바꿀수 있게 고쳐 주면 될 것 갔습니다.
1. 바꿀 부분이 클릭한 곳(논 장소, 둘 장소)이 있는지 채크 하고 (있음 바꾸어 준다 =프로그램 실행, 없음 나온다=프로그램 정지)
2. 어느 부분 까지 바꾸어 놓앗는지 채크해서 바꾸어 나온다.
즉 자신의 색이 어느 깊이 까지 갔는지 채크한다. 그리고 다른 색으로 바꾸어 준다.
3. 마지막으로 클릭한 곳은 비워둔다.
그리고 자신의 색깔이 나올때 까지 찾아 들어간다.
옆이 다른 색이면 종료한다.
옆이 같은 색이면 찾아 들어 간곳 앞에서 부터 바꾸어 나온다.
맨 마지막으로 둔 곳을 비운다.
지금 수정하겠습니다.
function FlipPieces(x, y, player) {
var deltax, deltay, distance;
var posx, posy;
var count = 0;
var otherplayer = OtherPlayer(player);//추가요
// put a piece down at the desired location
RawPutPiece(x, y, player);
for(deltay = -1; deltay <= 1; deltay++) {
for(deltax = -1; deltax <= 1; deltax++) {
for(distance = 1;; distance++) {
posx = x + (distance * deltax);
posy = y + (distance * deltay);
// stop if we go off the board
if(posx < 0 || posx >= width || posy < 0 || posy >= height)
break;
// stop when we reach an empty square
if(board[posx][posy].player == EMPTY)
break;
if(board[posx][posy].player != player) { //이부분이 바낌 그리고
// backtrack, flipping pieces
for(distance--; distance > 0; distance--) {
posx = x + (distance * deltax);
posy = y + (distance * deltay);
RawPutPiece(posx, posy, otherplayer); //이부분이 바낌 player가 아니고 다른 색깔 이야야 하는데 ㅠㅠ
borad[x][y] == EMPTY ;
//마지막으로 x, y자를 비워줌
}
break;
}
}
}
}
return(count);
}
function OtherPlayer(player) {
return((player == WHITE)? BLACK: WHITE);
}
// 채크 하는건 만지지 않습니다. 역이라 다 똑 같습니다.
거의 맞게 수정한것 같습니다.
if(board[posx][posy].player != player) { //이부분이 바낌 그리고 0이 아니여야만 함
이부분 말하시는 거죠? 짐 고민 중
if(board[posx][posy].player != EMPTY) //이부분 바낌
break;
요부분이요.. 이말대로면 없어질 돌 옆의 칸이 빈칸이 아니면 프로그램을 나간단 소리니
빈칸일때만 계속 탐색을 한다는 얘기잖아요?
그리고 자신의 색깔이 나올때 까지 찾아 들어간다.
옆이 다른 색이면 종료한다.
옆이 같은 색이면 찾아 들어 간곳 앞에서 부터 바꾸어 나온다.
맨 마지막으로 둔 곳을 비운다.
여기에서 0표는 ▲을 말해요 이것을 보고 설명한 거에요
이전수를 누를때 역탐색이 되는거기 때문에 OXXX 상태에서의 역탐색이 아니라 OOOOO 이상태에서의 역탐색이 되는거 아닌가요?
즉.. 이전수라는건 OOOOO 이 상황에서 이전수를 눌렀을때 OXXX 가 되야 하는거므로
저 소스대로는 안되는거 아닌가요?
엥 그것도 아닌것 같네 ㅠ.ㅜ
몇번째 수에서 뒤집히기 시작한 좌표를 저장해두면 역탐색이 가능하지 않을까요?
그리고 돌이 비워있는 곳까지 또는 상대바의 돌이 있는 곳 찾아 들어간다.
옆이 논 자리에서 바로 다른 색이면 종료하고, 바로 옆이 같은 색이여도 종료한다.
비워 있는 곳까지 들어간 곳 앞에서 부터 바꾸어 나온다.
맨 마지막으로 둔 곳을 비운다
이러면 말 이 되지요?
▲ 이게 (1,2) 니까 OXXX -> OOOOO 로 갈때 (1,2)를 저장해두면 나중에
역복구 할때 1,2까지 뒤집어라 하면 되지 않을까요?
변수 = '1,2 | 1,5 | 1,6' 이런식으로 저장하면 첫번째 수에서 최후에 돌아간 돌은 (1,2) 두번째 수에서 최후에 돌아간 돌은 (1,5) 이런식으로 복구가 가능하니까요..
php에서 '|' 를 기준으로 짤라서 각각의 변수로 저장시킬수 잇으니까요
하지만 바끼는 부분이 여러 곳이면 |로 구분하고 &로 같이 해줘야 하겟네요
말로 하자면 맨 마지막 0으로 표시된 곳을 시작점으로 한다.
그리고 돌이 비워있는 곳까지 또는 상대방의 돌이 있는 곳 찾아 들어간다.
옆이 논 자리에서 바로 다른 색이면 종료하고, 바로 옆이 같은 색(2개만 존재)이여도 종료한다.
비워 있는 곳까지 들어간 곳 또는 상대방의 돌 앞에서 부터 바꾸어 나온다.
맨 마지막으로 둔 곳을 비운다
이러면 말 이 되지요? 다시 수정 ㅠㅠ
근데 위 말대로 해서 OOOOO -> OXXX 로 복구가 가능한가요?
▲ 여기가 시작점이고.. 옆이 바로 같은 돌이기 때문에 종료되는거 아닌가요?
왜냐하면 아무런 저장된 정보 없이 OOOOO 이것만 가지고서는
OXXX O 이거에서 됐는지 OOXX O 이거에서 됐는지 OOOX O 이거에서 됐는지 구분이 불가능하거든요..
도저히 생각할 엄두가 안나서 기보게시판 만드는건 포기하려고 했었거든요..
오류님이랑 계속 얘기를 하다가 저 방법을 생각하게 됐네요 ^^
완전 돌팅 다 댔네요. 저희 글로만 홈페이지 용량 다 차지 하지 안았나 걱정대네요 ㅋㅋ.
근데 정말 오류님하고 얘기한게 큰 도움이 됐네요.
오류님이 말씀하신 저 역탐지 방식이 어디서부터 바꼈는지 구분을 못하는 문제가 있는거 같아서
그걸 해결하는 방법을 생각하다가 최후로 뒤집힌곳을 저장하는 방법이 생각났거든요..
오늘 얻은거를 토대로 짬날때 새 기보게시판을 한번 만들어봐야겠네요 ^^






H6G3H3C1F1E2E1D1C2G1A5F7B5B1C5B3C7D7C6E7
G2B8A2B6A6H7G8B7H8G7A8A7B2A4A3A1C8D8E8F8H2H1>
이렇게 넣는군요 맞지요?
그럼 이 값을 위의 스크립트로 저장하게끔해서 제브라 애플릿으로 불러 드리는 방법은 안댈까요?