better movement
このコミットが含まれているのは:
コミット
4954c8f4c8
80
uttt.c
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;
|
||||
|
|
読み込み中…
新しいイシューから参照