The show_board() function works as follows: First, it gets the dimensions of the board's dragarea. Next it draws two verticle lines through points 1/3 and 2/3 through the dragarea. Finally it draws two ghorizontal lines 1/3 and 2/3 through the dragarea.
The show_status() function "erases" any old status messages by filling the status field with the status window's color. Then a status string is drawn into the status field.
[...]
#define GAME_DRAG "Game"
#define STATUS "Status"
#define X_WIN "X won!"
#define O_WIN "O won!"
#define TIE "Tie game."
#define X_MOVE "X's turn."
#define O_MOVE "O's turn."
typedef enum {X, O, PNONE} PlayerType;
#define NO_MOVE 9
#define MAX_MOVES 9
PlayerType board[3][3];
PlayerType winner = PNONE;
bool x_turn = TRUE;
int move_count = 0, last_move = NO_MOVE;
[...]
/* --- Prototypes - display functions --- */
void show_board();
void show_status();
/* */
[...]
bool redraw_func()
{
GSredrawnamedwindow("root");
GSredrawnamedwindow(GAME_WIND);
GSredrawnamedwindow(STATUS_WIND);
show_board();
show_status();
return TRUE;
}
[...]
void show_board()
{
int x, y, wd, ht;
GSgetdragareaspecs(GAME_WIND, GAME_DRAG, &x, &y, &wd, &ht, NULL, NULL);
GSsetcurrentnamedwindow(GAME_WIND);
GSsetlinesize(5);
GSsetcolor(GSconvertcolor("black"));
GSwdrawline(x+(wd/3), y, x+(wd/3), y+ht);
GSwdrawline(x+(2*wd/3), y, x+(2*wd/3), y+ht);
GSwdrawline(x, y+(ht/3), x+wd, y+(ht/3));
GSwdrawline(x, y+(2*ht/3), x+wd, y+(2*ht/3));
}
void show_status()
{
int x, y, wd, ht;
GSColor col;
BigString msg;
GSgetfieldrect(STATUS, &x, &y, &wd, &ht, &col);
GSsetcurrentnamedwindow(STATUS_WIND);
GSsetcolor(col);
GSwfillrect(x, y, wd, ht);
if (winner != PNONE)
sprintf(msg, "%s", (winner == X)? X_WIN : O_WIN);
else if (move_count == MAX_MOVES)
sprintf(msg, "%s", TIE);
else
sprintf(msg, "%s", x_turn? X_MOVE : O_MOVE);
GSsetfont(LARGE);
GSsetcolor(GSconvertcolor("black"));
GSwwriteclippedmsg(x, y, wd, ht, x, y+((ht-SMALL)/2), msg);
}
[...]