better movement

このコミットが含まれているのは:
woosh 2023-11-13 02:52:21 +00:00
コミット 4954c8f4c8
1個のファイルの変更60行の追加20行の削除

80
uttt.c
ファイルの表示

@ -128,15 +128,32 @@ void ut_draw(const struct ut_state *state)
7 * r + 1, 7 * c + 1,
state->boards[r][c],
state->playBoard == -1 || state->playBoard == 3 * r + c);
mvaddstr(21, 0, "Select move with arrow keys or mouse.");
refresh();
//refresh();
}
int ut_click(int *r, int *c)
int ut_click(const struct ut_state *state, int *r, int *c)
{
#define P(r, c, d) ((state->playBoard == -1 || state->playBoard == 3 * (r / 3) + (c / 3)) && \
(state->boards[r / 3][c / 3] == '\0' || d % 3 == 1))
MEVENT event;
mvaddstr(21, 0, "Select move with arrow keys or mouse.");
if(state->playBoard == -1)
{
*r = 3 * (*r / 3) + 1;
*c = 3 * (*c / 3) + 1;
}
else
{
*r = 3 * (state->playBoard / 3) + 1;
*c = 3 * (state->playBoard % 3) + 1;
}
for(;;)
{
/*if(state->boards[*r / 3][*c / 3] != '\0')
{
*r = 3 * (*r / 3) + 1;
*c = 3 * (*c / 3) + 1;
}*/
move((7 * (*r / 3) + 1) + (2 * (*r % 3)),
(7 * (*c / 3) + 1) + (2 * (*c % 3)));
refresh();
@ -157,24 +174,48 @@ int ut_click(int *r, int *c)
return 0;
}
break;
case 'k': /* FALLTHROUGH */
case 'w': /* FALLTHROUGH */
case KEY_UP:
*r = (((*r - 1) % 9) + 9) % 9;
//*r = (((*r - 1) % 9) + 9) % 9;
for(int i = 0; i < 9 + 1; i++)
{
*r = (*r + 9 - 1) % 9;
if(P(*r, *c, *r)) {break;}
}
break;
case 'h': /* FALLTHROUGH */
case 'a': /* FALLTHROUGH */
case KEY_LEFT:
*c = (((*c - 1) % 9) + 9) % 9;
//*c = (((*c - 1) % 9) + 9) % 9;
for(int i = 0; i < 9 + 1; i++)
{
*c = (*c + 9 - 1) % 9;
if(P(*r, *c, *c)) {break;}
}
break;
case 'j': /* FALLTHROUGH */
case 's': /* FALLTHROUGH */
case KEY_DOWN:
*r = (*r + 1) % 9;
//*r = (*r + 1) % 9;
for(int i = 0; i < 9 + 1; i++)
{
*r = (*r + 1) % 9;
if(P(*r, *c, *r)) {break;}
}
break;
case 'l': /* FALLTHROUGH */
case 'd': /* FALLTHROUGH */
case KEY_RIGHT:
*c = (*c + 1) % 9;
//*c = (*c + 1) % 9;
for(int i = 0; i < 9 + 1; i++)
{
*c = (*c + 1) % 9;
if(P(*r, *c, *c)) {break;}
}
break;
case ' ': /* FALLTHROUGH */
case '\n': /* FALLTHROUGH */
case '\r': /* FALLTHROUGH */
case KEY_ENTER:
return 0;
case ERR: /* FALLTHROUGH */
@ -182,6 +223,7 @@ int ut_click(int *r, int *c)
break;
}
}
#undef P
}
void ut_show(const struct ut_state *state) {
@ -266,7 +308,7 @@ int main(int *argc, char **argv) {
signal(SIGINT, finish);
initscr();
keypad(stdscr, TRUE);
//nonl();
nonl(); // \r instead of \r\n
cbreak();
noecho();
mousemask(BUTTON1_CLICKED, NULL);
@ -274,32 +316,30 @@ int main(int *argc, char **argv) {
struct ut_state state = ut_initial;
while (true) {
int r, c, err;
//ut_show(&state);
erase();
ut_draw(&state);
//bool ok = getpos(&state, &y, &x);
//if (!ok) {continue;}
err = ut_click(&r, &c);
if (err) {continue;}
err = ut_move(&state, &state, r, c);
if (err) {continue;}
char w = ut_winner((char *)state.boards, 0, 3);
if(w)
{
if(w == ' ')
{
mvaddstr(22, 0, "Draw!");
mvaddstr(21, 0, "Draw!");
}
else
{
mvaddch(22, 0, w);
mvaddstr(22, 1, " Wins!");
mvaddch(21, 0, w);
mvaddstr(21, 1, " Wins!");
}
mvaddstr(23, 0, "Press any key to exit.");
mvaddstr(22, 0, "Press any key to exit.");
refresh();
mousemask(0, NULL);
getch();
break;
}
err = ut_click(&state, &r, &c);
if (err) {continue;}
err = ut_move(&state, &state, r, c);
if (err) {continue;}
}
finish(0);
return 0;