last move indicator and board line start detection

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

40
uttt.c
ファイルの表示

@ -176,7 +176,6 @@ int ut_dprintf(int fd, const char *restrict format, ...)
return n;
}
// 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)
{
// 7x7 board display
@ -209,7 +208,7 @@ void ut_drawBoard(void (*mvch)(void*, int, int, char), void *arg, const char *ti
}
#define DTILES_Y 21
#define DTILES_X 21
void ut_drawTiles(void (*mvch)(void*, int, int, char), void *arg, const struct ut_state *state, bool numbers)
void ut_drawTiles(void (*mvch)(void*, int, int, char), void *arg, const struct ut_state *state, bool numbers, int lr, int lc)
{
for(int r = 0; r < 3; r++)
for(int c = 0; c < 3; c++)
@ -227,6 +226,10 @@ void ut_drawTiles(void (*mvch)(void*, int, int, char), void *arg, const struct u
for(int r = 0; r < 3; r++)
mvch(arg, 7 * b + 2 * r + 1, 0, '0' + 3 * b + r);
}
if(lr >= 0 && lr < 9 && lc >= 0 && lc < 9)
mvch(arg, 7 * (lr / 3) + 2 * (lr % 3) + 1,
7 * (lc / 3) + 2 * (lc % 3) + 1,
state->tiles[lr][lc] == 'X' ? '%' : '0');
}
#define DBOARDS_Y 7
#define DBOARDS_X 7
@ -240,12 +243,21 @@ void ut_drawBoards(void (*mvch)(void*, int, int, char), void *arg, const struct
void ut_cursmvchc(void *arg, int y, int x, char c)
{
if(has_colors())
bool colorized;
if(colorized = has_colors())
{
color_set(c == 'X' ? 1 : c == 'O' ? 2 : 0, NULL);
color_set((c == 'X' || c == '%') ? 1 :
(c == 'O' || c == '0') ? 2 : 0, NULL);
}
bool bold;
if(c == '%' || c == '0')
{
bold = true;
attr_on(A_BOLD, NULL);
}
mvaddch(curs_line + y, x, c);
if(has_colors()) {color_set(0, NULL);}
if(bold) {attr_off(A_BOLD, NULL);}
if(colorized) {color_set(0, NULL);}
}
void ut_tmvch(void *arg, int y, int x, char c)
{
@ -256,24 +268,20 @@ void ut_bmvch(void *arg, int y, int x, char c)
((char (*)[DBOARDS_X])arg)[y][x] = c;
}
#define DTILES_LINE 1
int dtiles_line;
void ut_cursdraw(const struct ut_state *state)
{
ut_cursprintf("Turn: %c Play board: %d\n", (int)state->player, state->playBoard);
ut_drawTiles(ut_cursmvchc, NULL, state, false);
dtiles_line = curs_line;
ut_drawTiles(ut_cursmvchc, NULL, state, false, -1, -1); // TODO some kind of move history to know the last move
curs_line += DTILES_Y;
//ut_drawBoards(ut_cursmvchc, NULL, state);
if(has_colors())
{
// TODO set bold on last played character
}
}
void ut_sockdraw(const struct ut_state *state, int fd)
{
ut_dprintf(fd, "Turn: %c\nPlay board: %s\n", (int)state->player, PLAY_BOARDS[(state->playBoard + 10) % 10]);
char dtiles[DTILES_Y][DTILES_X];
ut_drawTiles(ut_tmvch, dtiles, state, true);
ut_drawTiles(ut_tmvch, dtiles, state, true, -1, -1);
for(int r = 0; r < DTILES_Y; r++)
{
ut_dprintf(fd, "%.*s\n", DTILES_X, dtiles[r]);
@ -332,7 +340,7 @@ int ut_cursgetpos(const struct ut_state *state, int *r, int *c)
*r = 3 * (*r / 3) + 1;
*c = 3 * (*c / 3) + 1;
}*/
move(DTILES_LINE + (7 * (*r / 3) + 1) + (2 * (*r % 3)),
move(dtiles_line + (7 * (*r / 3) + 1) + (2 * (*r % 3)),
(7 * (*c / 3) + 1) + (2 * (*c % 3)));
refresh();
switch(getch())
@ -340,7 +348,7 @@ int ut_cursgetpos(const struct ut_state *state, int *r, int *c)
case KEY_MOUSE:
if(getmouse(&event) == OK && (event.bstate & BUTTON1_CLICKED))
{
event.y -= DTILES_LINE;
event.y -= dtiles_line;
if(event.y < 0 || event.y >= 21) {break;}
if(event.x < 0 || event.x >= 21) {break;}
*r = (event.y % 7 - 1) / 2 + 3 * (event.y / 7);
@ -669,13 +677,13 @@ void begin(void)
nonl(); // \r instead of \r\n
cbreak();
noecho();
mousemask(BUTTON1_CLICKED, NULL);
if (has_colors())
{
start_color();
init_pair(1, COLOR_RED, COLOR_BLACK);
init_pair(2, COLOR_BLUE, COLOR_BLACK);
}
mousemask(BUTTON1_CLICKED, NULL);
}
int main(int argc, char **argv) {