I8  board  [9];
I64 board_x[9] = {150, 250, 350, 150, 250, 350, 150, 250, 350};
I64 board_y[9] = {150, 150, 150, 250, 250, 250, 350, 350, 350};

U0 DrawX(CDC *dc, I64 x, I64 y)
{
    dc->thick = 5;
    GrLine3(dc, x - 20, y - 20, 0, x + 20, y + 20, 0);
    GrLine3(dc, x + 20, y - 20, 0, x - 20, y + 20, 0);
}

U0 DrawO(CDC *dc, I64 x, I64 y)
{
    dc->thick = 5;
    GrCircle3(dc, x, y, 0, 25);
}

U0 DrawBoard(I64 player)
{
    I64  i;
    CDC *dc = DCAlias;

    DCFill;
    dc->thick = 5;
    GrLine3(dc, 200, 100, 0, 200, 400, 0);
    GrLine3(dc, 300, 100, 0, 300, 400, 0);
    GrLine3(dc, 100, 200, 0, 400, 200, 0);
    GrLine3(dc, 100, 300, 0, 400, 300, 0);
    for (i = 0; i < 9; i++)
        switch (board[i])
        {
            case 1:
                DrawX(dc, board_x[i], board_y[i]);
                break;

            case 2:
                DrawO(dc, board_x[i], board_y[i]);
                break;

        }
    //mouse.pos.x, mouse.pos.y are mouse x, y.
    //mouse.lb  is mouse left button
    if (player == 1)
        DrawX(dc, mouse.pos.x - Fs->pix_left, mouse.pos.y - Fs->pix_top);
    else
        DrawO(dc, mouse.pos.x - Fs->pix_left, mouse.pos.y - Fs->pix_top);
    DCDel(dc);
}

U0 TakeTurn(I64 player)
{
    I64 i, x = 0, y = 0;

    while (!(100 <= x < 400) || !(100 <= y < 400) || board[i])
    {
        if (player == 1)
            Beep;
        else
            Beep(74);
        while (!mouse.lb)
        {
            DrawBoard(player);
            Refresh;
        }
        while (mouse.lb)
        {
            DrawBoard(player);
            Refresh;
        }
        x = mouse.pos.x - Fs->pix_left;
        y = mouse.pos.y - Fs->pix_top;
        i = (x - 100) / 100 + (y - 100) / 100 * 3;
    }
    board[i] = player;
}

Bool CheckWinner(I64 player)
{
    if (    player == board[0] == board[1] == board[2] ||
            player == board[3] == board[4] == board[5] ||
            player == board[6] == board[7] == board[8] ||
            player == board[0] == board[3] == board[6] ||
            player == board[1] == board[4] == board[7] ||
            player == board[2] == board[5] == board[8] ||
            player == board[0] == board[4] == board[8] ||
            player == board[2] == board[4] == board[6])
        return TRUE;
    else
        return FALSE;
}

U0 DoGame()
{
    I64 moves = 0;

    MemSet(board, 0, sizeof(board));
    while (TRUE)
    {
        TakeTurn(1);
        if (CheckWinner(1))
        {
            Beep;
            Beep;
            Beep;
            break;
        }
        if (++moves == 9)
            break;

        TakeTurn(2);
        if (CheckWinner(2))
        {
            Beep(74);
            Beep(74);
            Beep(74);
            break;
        }
        if (++moves == 9)
            break;
    }
}

U0 TicTacToe()
{
    WinMax;     //Maximize window
    DocClear; //Clear window text.
    "$GREEN$CTRL-ALT-c$FG$ to exit.\n";
    try
        while (TRUE)
            DoGame;
    catch
        PutExcept;
    DCFill;
}

TicTacToe;