오랜만에 오목포스팅 드디어 끝이다.
5번만에 끝나니 좀 아쉬워, 좀 더 우려먹으려고 했는데.

이번에 추가한 건   흑,백추가(이게 전부  ㅡ,.ㅡ)

1. 돌 5개 확인 함수 변경하기.
예전엔 돌 하나로도 잘 놀았지만 이젠 흑,백이 추가됐으니 인자 하나를 더 전달해 주어야 해요.
int check(x,y)함수를 변경해줍니다.
[code]
int check(x,y,turn)
{
    int px,py;
    int count;
    //가로
    px=x;
    py=y;
    count=0;   

    while(px>1 && board[px-2][y] == turn)px-=2;
    while(px<=36 && board[px][y] == turn)
    {
        count++;
        px+=2;
    }

    if(count==5)
    {
        return 1;
    }

    //세로
    px=x;
    py=y;
    count=0;

    while(py>0 && board[x][py-1]==turn)py--;
    while(py<=18 && board[x][py++]==turn)count++;

    if(count==5)
    {
        return 1;
    }

    //대각선 ↘
    px=x;
    py=y;
    count=0;

    while(px > 0 && py > 0 && board[px-2][py-1]==turn)
    {
        px-=2;
        py--;
    }

    while(px<=36 && py<=18 && board[px][py++] == turn)
    {
        px+=2;
        count++;
    }
    if(count==5)
    {
        return 1;
    }

    //대각선 ↙
    px=x;
    py=y;
    count=0;

    while(px < 36 && py > 0 && board[px+2][py-1]==turn)
    {
        px+=2;
        py--;
    }

    while(px>=0 && py<=18 && board[px][py++] == turn)
    {
        px-=2;
        count++;
    }
    if(count==5)
    {
        return 1;
    }
    return 0;
}
[/code]

2.문자열 "흑","백"도 추가, 흑돌,백돌도 추가
[code]
int turn=1;
char who[3][3]={"","흑","백"};
char stone[3][3]={"","○","●"};
[/code]

3.case ENTER: 부분도 수정
[code]
case ENTER :
        if(board[x][y] == 0)
        {
            board[x][y]=turn;
            gotoxy(x,y);
            puts(stone[turn]);
            if(check(x,y,turn))
            {
                system("CLS");
                printf("%s 승리",who[turn]);
                system("PAUSE");
                exit(0);
            }
            turn++;
            if(turn==3)
                       turn=1;
        }  
        break;
[/code]


4.마지막 오목소스
[code]
#include <stdio.h>
#include <windows.h>
#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77
#define ENTER 13

int x=0,y=0;
int oldx=0,oldy=0;
int board[38][19];
int turn=1;
char who[3][3]={"","흑","백"};
char stone[3][3]={"","○","●"};

void gotoxy(int, int);
void draw();
void move();
int knock(int,int);
int check(int,int,int);

int main()
{
    draw();
    while(1)
    {
        move();
    }


    system("PAUSE");   
    return 0;
}

void gotoxy(int x, int y)
{
    COORD XY = {x, y};
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), XY);
}

void draw()
{       
    char a[39][39]=
    {
        "┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐",
        "├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤",
        "└┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┘"
    };
    int count;
    printf("%s\n",a[0]);
    for(count=0;count<17;count++)
        printf("%s\n",a[1]);
    printf("%s",a[2]);
}

void move()
{
    char input=0;
    input=getch();

    switch(input)
    {
    case UP :
        if(y>0)
        {
            y-=1;
            oldy=y+1;
            gotoxy(x,y);
            puts("⊙");
            if(knock(x,oldy))
            {
                gotoxy(x,oldy);
                if(oldy==18)
                {
                    if(x==0)
                    {
                        puts("└");
                    }
                    if(x==36)
                    {
                        puts("┘");
                    }
                    else if(x!=0&&x!=36)
                    {
                        puts("┴");
                    }
                }
                else if(x==0)
                {
                    puts("├");
                }
                else if(x==36)
                {
                    puts("┤");
                }
                else
                {
                    puts("┼");
                }
            }

        }
        break;

    case DOWN :
        if(y<18)
        {
            y+=1;
            oldy=y-1;
            gotoxy(x,y);
            puts("⊙");
            if(knock(x,oldy))
            {
                gotoxy(x,oldy);
                if(oldy==0)
                {
                    if(x==0)
                    {
                        puts("┌");
                    }
                    if(x==36)
                    {
                        puts("┐");
                    }
                    else if(x!=0&&x!=36)
                    {
                        puts("┬");
                    }
                }
                else if(x==0)
                {
                    puts("├");
                }
                else if(x==36)
                {
                    puts("┤");
                }
                else
                {
                    puts("┼");
                }
            }

        }
        break;

    case LEFT :
        if(x>0)
        {
            x-=2;
            oldx=x+2;
            gotoxy(x,y);
            puts("⊙");
            if(knock(oldx,y))
            {
                gotoxy(oldx,y);
                if(oldx==36)
                {
                    if(y==0)
                    {
                        puts("┐");
                    }
                    if(y==18)
                    {
                        puts("┘");
                    }
                    else if(y!=0&&y!=36)
                    {
                        puts("┤");
                    }
                }
                else if(y==18)
                {
                    puts("┴");
                }
                else if(y==0)
                {
                    puts("┬");
                }
                else
                {
                    puts("┼");
                }
            }

        }
        break;

    case RIGHT :
        if(x<36)
        {
            x+=2;
            oldx=x-2;
            gotoxy(x,y);
            puts("⊙");
            if(knock(oldx,y))
            {
                gotoxy(oldx,y);
                if(oldx==0)
                {
                    if(y==0)
                    {
                        puts("┌");
                    }
                    if(y==18)
                    {
                        puts("└");
                    }
                    else if(y!=0&&y!=36)
                    {
                        puts("├");
                    }
                }
                else if(y==18)
                {
                    puts("┴");
                }
                else if(y==0)
                {
                    puts("┬");
                }
                else
                {
                    puts("┼");
                }
            }

        }
        break;
    case ENTER :
        if(board[x][y] == 0)
        {
            board[x][y]=turn;
            gotoxy(x,y);
            puts(stone[turn]);
            if(check(x,y,turn))
            {
                system("CLS");
                printf("%s 승리",who[turn]);
                system("PAUSE");
                exit(0);
            }
            turn++;
            if(turn==3)
                turn=1;
        }  
        break;
    }
}
int knock(x,y)
{
    gotoxy(x,y);
    puts(stone[board[x][y]]);
    if(board[x][y]!=0)
        return 0;

    else
        return 1;
}
int check(x,y,turn)
{
    int px,py;
    int count;
    //가로
    px=x;
    py=y;
    count=0;   

    while(px>1 && board[px-2][y] == turn)px-=2;
    while(px<=36 && board[px][y] == turn)
    {
        count++;
        px+=2;
    }

    if(count==5)
    {
        return 1;
    }

    //세로
    px=x;
    py=y;
    count=0;

    while(py>0 && board[x][py-1]==turn)py--;
    while(py<=18 && board[x][py++]==turn)count++;

    if(count==5)
    {
        return 1;
    }

    //대각선 ↘
    px=x;
    py=y;
    count=0;

    while(px > 0 && py > 0 && board[px-2][py-1]==turn)
    {
        px-=2;
        py--;
    }

    while(px<=36 && py<=18 && board[px][py++] == turn)
    {
        px+=2;
        count++;
    }
    if(count==5)
    {
        return 1;
    }

    //대각선 ↙
    px=x;
    py=y;
    count=0;

    while(px < 36 && py > 0 && board[px+2][py-1]==turn)
    {
        px+=2;
        py--;
    }

    while(px>=0 && py<=18 && board[px][py++] == turn)
    {
        px-=2;
        count++;
    }
    if(count==5)
    {
        return 1;
    }
    return 0;
}
[/code]
사용자 삽입 이미지

이걸로 끝.
부족한 점이나 질문 있으시면 아래 리플로 ㄱㄱ

이 글이 유익하다면 (굽신굽신) ->

Trackback Address >> http://zfanta.com/trackback/333 관련글 쓰기

  1. BlogIcon bluenlive 2008/02/14 16:09  address  modify / delete  reply

    오홋! 드디어 최종버전이 출시된 것입니까?
    수고하셨습니다. 대단대단...

    •  address  modify / delete 2008/02/14 16:19 BlogIcon 환타

      한번 번외편으로 컴퓨터랑 1:1하는 모드도 만들어보려고 하는 데 엄청 어렵네요. 흐흐흐, 1년 안에는 인공지능까지 만들어야 하는데.....
      다 만들고 나니 벌써 개학 ㅇㅅㅇ

    •  address  modify / delete 2008/02/14 16:25 BlogIcon bluenlive

      자, 가중치를 적용해보는 겁니다. ㅋㅋㅋ
      이론이야 쉽지만, 중요한 것은 님의 코드처럼 "실제 만들어진 코드"죠. 수고하셨습니다.
      그럼, 전 컨닝... ^^;;;

  2. BlogIcon 정기 2008/02/14 23:30  address  modify / delete  reply

    중복되는 코드가 많아요..
    함수로 빼내세요.

    그리고 저걸 클래스화 시켜서 OOP로 구현해보시면 좋은 공부가 될 겁니다.

    ※중복되는 코드가 많으면, 그만큼 코드의 용량이 커지고, 심한 경우 캐시의 용량보다 커지면 캐시 미스로 인한 성능 하락의 요인이 매우 심합니다.
    물론 저 오목 루틴 정도야 몇 바이트 안되기 때문에 상관없지만, 나중에 큰 프로그램 만들 때 매우 중요합니다.

    그리고 중요한 것.

    가독성이 매우 나쁩니다..


    x+=2;
    oldx=x-2;

    이거 그냥
    oldx = x;
    x += 2;

    이게 나을 겁니다. 쓸데없는 연산은 안하게 해야죠..

    •  address  modify / delete 2008/02/15 12:32 BlogIcon 환타

      정기님 오랜만에 뵙네요.
      고맙습니다.
      전에 방명록에 글 써주신 게 백업실수로 다 지워져서 어떡하죠 ㅡ,.ㅜ
      이번엔 번외편을 많이 올려야겠어요.(역시......)
      2일전 "열혈강의 C++"구입해서 공부하고 있는데 재밌네요. 으흐흐

  3. BlogIcon Mr.번뜩맨 2008/02/19 08:38  address  modify / delete  reply

    우와..컴퓨터 언어를 사용할 줄 아시는군요..왠지 호기심이 자주 당깁니다.. 자주 오겠습니다..ㅋㅋ^^

  4. 학생 2008/03/10 18:29  address  modify / delete  reply

    int board[38][19]; 여기서 왜 x값이 2배인지를 잘모르겠어요;;;
    그리고 승패의 확인하는 함수int check 여기에서도 x가 모두 2배씩인지 잘모르겠어요';
    ////
    그리고 char who[3][3] , char stone[3][3] 이거 두개가 모두 3x3배열인지두요;; 그냥 [3]배열로 쓰면 안돼는건가용? 궁금궁금~ ㅎㅎ;char a[39][39] 이것두 비슷하게 ;;; 왜그런지;;;쓰는건 a[0]a[1]a[2]이거뿐인데;; 왜 크게 쓰는지 모르겠어요;;

    •  address  modify / delete 2008/03/10 18:37 BlogIcon  환타

      x값이 2배인 이유는 ┌,└,├,⊙ 등 문자들이 a,b,c,1,2,3같은 문자들보다 가로길이가 2배 더 깁니다.
      그래서 커서를 이동할 때 가로 2칸씩 옮겨가면서 위 문자들을 출력해야 깨짐없이 나온답니다. ㅎㅎ

      char who[3][3]
      문자열은 배열에 하나씩 저장됩니다.
      만약 cat을 저장하려면 char a[0]=c, char a[1]=a, char a[2]=t, char a[3]=\0 이렇게 됩니다.
      널문자까지 4개의 배열을 선언해야하죠. 한글은 영어와 달리 한 글자에 2바이트니까 널문자까지 배열을 3개 선언해야합니다. 그리고 "","흑",'백" 이렇게 3개가 있으니 [3][3]으로 선언해야하죠.
      써놓고보니 어렵네요ㅇㅅㅇ.
      문자열 공부를 좀만 하시면 금방 이해 되실거여요. 제소스는 워낙 지저분하니 ㅜㅜ

  5. 학생 2008/03/10 18:50  address  modify / delete  reply

    거의 1주일 가량... 책이랑 이거랑 계속 보니깐 소스는 거의 대충.. 이해는 가게 됐어요 ㅎㅎ//
    감사해용ㅎㅎ// 질문에도 대답 다 해주시고 ㅎㅎ////
    나중에 또 모르는거 있으면 질문할께요 ㅎㅎ/
    일딴// 문자열좀 책좀 봐야겠고.. ㅎㅎ.... 완료하면 이젠.. 바둑돌 곗수를 세는거를 집어넣어봐야징 ㅎㅎ///
    학교에서 4년전에 한번 배우고;; 한번도 안쓰다가... 할려니깐 정말 몰라서 미치느줄 알았어요 ㅋㅋ/
    저번주에 첨시작했을때 printf도 먼지 몰라서 쩔쩔매다가 ㅎㅎ/
    이거 소스 보면서 책보면서 이런식으로 공부하니깐 어느정도 보면은 이해할수는 있는것 같아요 ㅎㅎ.
    감사해용 ㅎㅎㅎ/