]> git.lizzy.rs Git - ttfe.git/commitdiff
Immediate and invisible input
authorElias Fleckenstein <eliasfleckenstein@web.de>
Mon, 7 Jun 2021 12:53:30 +0000 (14:53 +0200)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Mon, 7 Jun 2021 12:53:30 +0000 (14:53 +0200)
main.c
main.h

diff --git a/main.c b/main.c
index a572dde7708f95be322093dbc1dc02d95781b4f8..58c4a0deb0996e5f007c8aed1cb3350d5bc56f3e 100644 (file)
--- a/main.c
+++ b/main.c
@@ -40,50 +40,51 @@ void init_board(board *b) {
 
 void game_start() {
        printf("\e[?1049h");
+       struct termios oldtio, newtio;
+       tcgetattr(STDIN_FILENO, &oldtio);
+       newtio = oldtio;
+       newtio.c_lflag &= ~(ICANON | ECHO);
+       tcsetattr(STDIN_FILENO, TCSANOW, &newtio);
        board *b = new_board();
        game_loop(b);
        print_score(b);
        free_board(b);
        printf("\e[?1049l");
+       tcsetattr(STDIN_FILENO, TCSANOW, &oldtio);
+}
+
+enum direction get_input()
+{
+       switch(fgetc(stdin)) {
+               case 'a':
+                       return west;
+               case 's':
+                       return south;
+               case 'w':
+                       return north;
+               case 'd':
+                       return east;
+               case 'q':
+                       return quit;
+               default:
+                       return get_input();
+       }
 }
 
 void game_loop(board *b) {
-       char c[16];
-       int d;
-       bool r = true;
        while(move_possible_any(b)) {
                place_new_piece(b);
                print_board(b);
-               INPUT:
-               printf("Make a move:\n");
-               fgets(c, sizeof(c), stdin);
-               switch(c[0]) {
-                       case 'a':
-                               d = west;
-                               break;
-                       case 's':
-                               d = south;
-                               break;
-                       case 'w':
-                               d = north;
-                               break;
-                       case 'd':
-                               d = east;
-                               break;
-                       case 'q':
-                               r = false;
+               while(true) {
+                       enum direction d = get_input();
+
+                       if (d == quit) {
+                               return;
+                       } else if(move_possible(b, d)) {
+                               make_move(b, d);
                                break;
-                       default:
-                               printf("Invalid move: %c\n", c[0]);
-                               goto INPUT;
-               }
-               if(!r)
-                       return;
-               if(!move_possible(b, d)) {
-                       printf("Move not possible: %c\n", c[0]);
-                       goto INPUT;
+                       }
                }
-               make_move(b, d);
        }
 }
 
diff --git a/main.h b/main.h
index 76a50d7714f84468545131ab4ff3369f62cfa9c4..90689900755caea6f0b3fc2a23027e4d6b527295 100644 (file)
--- a/main.h
+++ b/main.h
@@ -6,6 +6,8 @@
 #include <stdbool.h>
 #include <assert.h>
 #include <time.h>
+#include <unistd.h>
+#include <termios.h>
 
 typedef struct board board;
 typedef unsigned int uint;
@@ -16,6 +18,7 @@ enum direction {
        south,
        west,
        east,
+       quit,
 };
 
 struct board {