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;