unifying board drawing WIP

このコミットが含まれているのは:
woosh 2023-11-15 04:07:38 +00:00
コミット bc7c229792
1個のファイルの変更69行の追加21行の削除

90
uttt.c
ファイルの表示

@ -135,9 +135,10 @@ int ut_move(struct ut_state *new_state, const struct ut_state *old_state, int ro
return 0;
}
void ut_drawBoard(const char *tiles, int offset, int stride, int iy, int ix, char winner, bool highlight)
// TODO highlight last placed
void ut_drawBoard(void (*mvch)(void*, int, int, char), void *arg, const char *tiles, int offset, int stride, int iy, int ix, char winner, bool highlight)
{
// 5x5 board display
// 7x7 board display
/*
* X|X|X
* -+-+-
@ -145,32 +146,79 @@ void ut_drawBoard(const char *tiles, int offset, int stride, int iy, int ix, cha
* -+-+-
* X|X|X
*/
for(int r = 0; r < 3; r++)
for(int r = 0; r < 3; r++) // tiles
for(int c = 0; c < 3; c++)
mvaddch(iy + 2 * r, ix + 2 * c, T(r, c) != '\0' ? T(r, c) : ' ');
mvch(arg, iy + 2 * r, ix + 2 * c, T(r, c) != '\0' ? T(r, c) : ' ');
//char info = winner != '\0' ? winner : highlight ? '*' : ' ';
for(int r = 0; r < 3; r++)
for(int r = 0; r < 3; r++) // |
for(int c = 0; c < 2; c++)
mvaddch(iy + 2 * r, ix + 2 * c + 1, winner != '\0' ? winner : '|');
for(int r = 0; r < 2; r++)
mvch(arg, iy + 2 * r, ix + 2 * c + 1, winner != '\0' ? winner : '|');
for(int r = 0; r < 2; r++) // -
for(int c = 0; c < 3; c++)
mvaddch(iy + 2 * r + 1, ix + 2 * c, winner != '\0' ? winner : '-');
for(int r = 0; r < 2; r++)
mvch(arg, iy + 2 * r + 1, ix + 2 * c, winner != '\0' ? winner : '-');
for(int r = 0; r < 2; r++) // +
for(int c = 0; c < 2; c++)
mvaddch(iy + 2 * r + 1, ix + 2 * c + 1, winner != '\0' ? winner : highlight ? '*' : '+');
mvch(arg, iy + 2 * r + 1, ix + 2 * c + 1, winner != '\0' ? winner : highlight ? '*' : '+');
for(int r = 0; r < 7; r++) // | boundary
for(int c = 0; c < 2; c++)
mvch(arg, iy + r, ix + 6 * c, ' ');
for(int r = 0; r < 2; r++) // - boundary
for(int c = 0; c < 7; c++)
mvch(arg, iy + 6 * r, ix + c, ' ');
}
void ut_draw(const struct ut_state *state)
void ut_drawTiles(void (*mvch)(void*, int, int, char), void *arg, const struct ut_state *state)
{
for(int r = 0; r < 3; r++)
for(int c = 0; c < 3; c++)
ut_drawBoard((char *)state->tiles,
27 * r + 3 * c, 9,
7 * r + 1, 7 * c + 1,
state->boards[r][c],
state->playBoard == -1 || state->playBoard == 3 * r + c);
//refresh();
ut_drawBoard(mvch, arg, (char *)state->tiles,
27 * r + 3 * c, 9,
7 * r + 1, 7 * c + 1,
state->boards[r][c],
state->playBoard == -1 || state->playBoard == 3 * r + c);
}
void ut_drawBoards(void (*mvch)(void*, int, int, char), void *arg, const struct ut_state *state)
{
ut_drawBoard(mvch, arg, (char *)state->boards,
0, 3,
0, 0,
'\0', false);
}
void ut_cursmvch(void *arg, int y, int x, char c)
{
mvaddch(/*curs_line + */y, x, c);
}
#define DTILES_Y 21
#define DTILES_X 21
void ut_tmvch(void *arg, int y, int x, char c)
{
((char (*)[DTILES_X])arg)[y][x] = c;
}
#define DBOARDS_Y 7
#define DBOARDS_X 7
void ut_bmvch(void *arg, int y, int x, char c)
{
((char (*)[DBOARDS_X])arg)[y][x] = c;
}
void ut_cursdraw(const struct ut_state *state)
{
ut_cursprintf(fd, "Turn: %c Play board: %d\n", (int)state->player, state->playBoard);
ut_drawTiles(ut_cursmvch, NULL, state);
//ut_drawBoards(ut_cursmvch, NULL, state);
}
void ut_sockdraw(const struct ut_state *state, int fd)
{
ut_dprintf(fd, "| Turn: %c Play board: %d\n", (int)state->player, state->playBoard);
char dtiles[DTILES_Y][DTILES_X];
ut_drawTiles(ut_tmvch, dtiles, state);
for(int r = 0; r < DTILES_Y; r++)
{
ut_dprintf(fd, "| %.*s\n", DTILES_X, dtiles[r]);
}
}
int ut_click(const struct ut_state *state, int *r, int *c)
{
@ -264,8 +312,8 @@ int ut_click(const struct ut_state *state, int *r, int *c)
#undef P
}
int info_line; // set this to 21 and reset it on erase TODO
void ut_info(const char *str, int n)
int curs_line; // set this to 21 and reset it on erase TODO - use this as an offset rather
void ut_cursprint(const char *str, int n)
{
mvaddnstr(info_line, 0, str, n);
// info_line++; // depends on str not containing newlines
@ -389,7 +437,7 @@ int ut_cursprintf(const char *restrict format, ...)
int n = vsnprintf(line, MAX_LINE, format, ap);
va_end(ap);
if(n < 0 || n > MAX_LINE - 1) {return -1;}
ut_info(line, n);
ut_cursprint(line, n);
return n;
}