Sablog Models/자작자작

환타 오목 게임 재구성. (3)

어­리 2009. 6. 13. 23:20
일단 지난 번에 제가 바꿔 놓은 코드에 좀 문제가 있습니다.
누가 이겼는지 안 나오더군요.. 잘 되더니 왜 그러지;;

뭐 좀 바꿨더니 다시 됩니다만.
/* five_in_a_row.h
 * by ZFanta & UNique
 */
#ifndef FIVE_IN_A_ROW
#define FIVE_IN_A_ROW


#include "tool.h"

#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77
#define ENTER 13
#define ESC 27

#define BOARD_SIZE 19

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

int check(int x, int y, int turn)
{
    int px, py;
    int count;

    // 가로로 오목이 있는지 검사
    px = x;
    py = y;
    count = 0;

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

    if(count == 5)
        return 1;


    // 세로로 오목이 있는지 검사
    px = x;
    py = y;
    count = 0;

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

    if(count == 5)
        return 1;


    // 좌상우하로 오목이 있는지 검사
    px = x;
    py = y;
    count = 0;

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

    if(count == 5)
        return 1;


    // 우상좌하로 오목이 있는지 검사
    px = x;
    py = y;
    count = 0;

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

    if(count == 5)
        return 1;

    return 0;
}

int knock(int x, int y)
{
    if(board[x][y] != 0)
    {
        gotoxy(x * 2, y);
        puts(stone[board[x][y]]);
        return 0;
    }
    else
        return 1;
}

void board_write(int x, int y)
{
    x *= 2;
    gotoxy(x, y);
    if (x == 0)
    {
        if (y == 0)
            puts("┌");
        else if (y == (BOARD_SIZE - 1))
            puts("└");
        else
            puts("├");
    }
    else if (x == (BOARD_SIZE - 1) * 2)
    {
        if (y == 0)
            puts("┐");
        else if (y == (BOARD_SIZE - 1))
            puts("┘");
        else
            puts("┤");
    }
    else
    {
        if (y == 0)
            puts("┬");
        else if (y == (BOARD_SIZE - 1))
            puts("┴");
        else
            puts("┼");
    }
}

void draw()
{        
    int i, j;
    for (i = 0; i < BOARD_SIZE; i++)
        for (j = 0; j < BOARD_SIZE; j++)
            board_write(i, j);
}

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

    switch(input)
    {
    case UP :
        if(y > 0)
        {
            oldy = y--;
            gotoxy(x * 2, y);
            puts("⊙");
            if(knock(x, oldy))
                board_write(x, oldy);
        }
        return 1;
        break;

    case DOWN :
        if(y < BOARD_SIZE - 1)
        {
            oldy = y++;
            gotoxy(x * 2, y);
            puts("⊙");
            if(knock(x, oldy))
                board_write(x, oldy);
        }
        return 1;
        break;

    case LEFT :
        if(x > 0)
        {
            oldx = x--;
            gotoxy(x * 2, y);
            puts("⊙");
            if(knock(oldx, y))
                board_write(oldx, y);
        }
        return 1;
        break;

    case RIGHT :
        if(x < BOARD_SIZE - 1)
        {
            oldx = x++;
            gotoxy(x * 2, y);
            puts("⊙");
            if(knock(oldx, y))
                board_write(oldx, y);

        }
        return 1;
        break;

    case ENTER :
        if(board[x][y] == 0)
        { 
            board[x][y] = turn;
            gotoxy(x * 2, y);
            puts(stone[turn]);
            if(check(x, y, turn))
            {
                return 0;
            }
            turn++;
            if(turn == 3)
                turn = 1;
        }
        return 1;
        break;
    }
    return 1;
}

int five_in_a_row()
{
    /* If user wants to re-match, returns 0; or not, returns 1.
     * (only if one game successfully ended)
     */
    int i, j;
    system("CLS");
    draw();
    for (i = 0; i < BOARD_SIZE; i++)
        for (j = 0; j < BOARD_SIZE; j++)
            board[i][j] = 0;
    while (move());
    system("CLS");
    printf("%s 승리.\n계속하려면 아무 키나 누르십시오(종료 Esc):", who[turn]);
    if (getch() == ESC)
        return 1;
    else
        return 0;
}


#endif
그나저나 제 VC++에서 갑자기 system(CLS)가 안 먹습니다. 하하하하하....

멋지군요-_-

이번에는 계획을 멋대로 벗어나서 함수를 하나 더 만들어 보겠습니다.
void load(int x, int y)
{
	gotoxy(x * 2, y);
	puts("⊙");
}

그러면 소스를 이따구로 바꿀 수 있겠죠.
/* five_in_a_row.h
 * by ZFanta & UNique
 */
#ifndef FIVE_IN_A_ROW
#define FIVE_IN_A_ROW


#include "tool.h"

#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77
#define ENTER 13
#define ESC 27

#define BOARD_SIZE 19

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

int check(int x, int y, int turn)
{
    int px, py;
    int count;

    // 가로로 오목이 있는지 검사
    px = x;
    py = y;
    count = 0;

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

    if(count == 5)
        return 1;


    // 세로로 오목이 있는지 검사
    px = x;
    py = y;
    count = 0;

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

    if(count == 5)
        return 1;


    // 좌상우하로 오목이 있는지 검사
    px = x;
    py = y;
    count = 0;

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

    if(count == 5)
        return 1;


    // 우상좌하로 오목이 있는지 검사
    px = x;
    py = y;
    count = 0;

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

    if(count == 5)
        return 1;

    return 0;
}

int knock(int x, int y)
{
    if(board[x][y] != 0)
    {
        gotoxy(x * 2, y);
        puts(stone[board[x][y]]);
        return 0;
    }
    else
        return 1;
}

void load(int x, int y)
{
    gotoxy(x * 2, y);
    puts("⊙");
}

void board_write(int x, int y)
{
    x *= 2;
    gotoxy(x, y);
    if (x == 0)
    {
        if (y == 0)
            puts("┌");
        else if (y == (BOARD_SIZE - 1))
            puts("└");
        else
            puts("├");
    }
    else if (x == (BOARD_SIZE - 1) * 2)
    {
        if (y == 0)
            puts("┐");
        else if (y == (BOARD_SIZE - 1))
            puts("┘");
        else
            puts("┤");
    }
    else
    {
        if (y == 0)
            puts("┬");
        else if (y == (BOARD_SIZE - 1))
            puts("┴");
        else
            puts("┼");
    }
}

void draw()
{        
    int i, j;
    for (i = 0; i < BOARD_SIZE; i++)
        for (j = 0; j < BOARD_SIZE; j++)
            board_write(i, j);
}

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

    switch(input)
    {
    case UP :
        if(y > 0)
        {
            oldy = y--;
            load(x, y);
            if(knock(x, oldy))
                board_write(x, oldy);
        }
        return 1;
        break;

    case DOWN :
        if(y < BOARD_SIZE - 1)
        {
            oldy = y++;
            load(x, y);
            if(knock(x, oldy))
                board_write(x, oldy);
        }
        return 1;
        break;

    case LEFT :
        if(x > 0)
        {
            oldx = x--;
            load(x, y);
            if(knock(oldx, y))
                board_write(oldx, y);
        }
        return 1;
        break;

    case RIGHT :
        if(x < BOARD_SIZE - 1)
        {
            oldx = x++;
            load(x, y);
            if(knock(oldx, y))
                board_write(oldx, y);

        }
        return 1;
        break;

    case ENTER :
        if(board[x][y] == 0)
        { 
            board[x][y] = turn;
            gotoxy(x * 2, y);
            puts(stone[turn]);
            if(check(x, y, turn))
            {
                return 0;
            }
            turn++;
            if(turn == 3)
                turn = 1;
        }
        return 1;
        break;
    }
    return 1;
}

int five_in_a_row()
{
    /* If user wants to re-match, returns 0; or not, returns 1.
     * (only if one game successfully ended)
     */
    int i, j;
    system("CLS");
    draw();
    for (i = 0; i < BOARD_SIZE; i++)
        for (j = 0; j < BOARD_SIZE; j++)
            board[i][j] = 0;
    load(x, y);
    while (move());
    system("CLS");
    printf("%s 승리.\n계속하려면 아무 키나 누르십시오(종료 Esc):", who[turn]);
    if (getch() == ESC)
        return 1;
    else
        return 0;
}


#endif

커서가 처음부터 뜹니다.