Как напечатать несколько строк на стандартный вывод, перезаписывая то, что было напечатано раньше? - PullRequest
0 голосов
/ 18 апреля 2019

Я студент, в настоящее время разрабатываю версию Othello для университетского проекта.

Это в основном доработано, поэтому я ищу вещи, которые можно улучшить. Одним из них является то, что доска (которая выводится на стандартный вывод) просто заменяет предыдущую при каждой игре, гарантируя, что терминал не двигается.

Ниже приведена самая последняя попытка сделать это:

char c = ' ';
fflush(stdout);
contaPecas(e, pecas);
printf("\n\r* X-%d |SCORE| O-%d *   \n\r\n\r  1 2 3 4 5 6 7 8  "" | N <peça>para novo jogo "
       "em que o primeiro a jogar é o jogador com peça.\n\r", pecas->x, pecas->y);

for (int i = 0; i < 8; i++) {
    for (int j = 0; j < 8; j++) {
        if (j == 0)
            printf("%d ", i+1);

        if (opcao == 1 && verificaValida(i,j,turno) == 1)
            c = '.';
        else if (opcao == 2 && (*turno)->N != 0 && i == sugestao->y && j == sugestao->x)
            c = '?';
        else
            switch (e.grelha[i][j]) {
                case VALOR_O:
                    c = 'O';
                    break;
                case VALOR_X:
                    c = 'X';
                    break;
                case VAZIA:
                    c = '-';
                    break;
            }
        printf("%c ", c);
    }

    switch (i) {
            case 0:
                printf("  | A para novo jogo contra bot. O jogador comeca com peça X.\n\r");
                break;
            case 1:
                printf("  | L<ficheiro>para ler um jogo de ficheiro.\n\r");
                break;
            case 2:
                printf("  | E <ficheiro> escrever em ficheiro estado do jogo.\n\r");
                break;
            case 3:
                printf("  | J<L,C>jogar peça atual na posição (l,c).\n\r");
                break;
            case 4:
                printf("  | S para imprimir um ponto ‘.’nas posições com jogada válida.\n\r");
                break;
            case 5:
                printf("  | H para sugestão de jogada. Deve ser colocado um ‘?’no sitio sugerido.\n\r");
                break;
            case 6:
                printf("  | U para desfazer a última jogada(Undo).\n\r");
                break;
            case 7:
                printf("  | Q para sair do jogo.\n\r");
                break;
        }
    }
if (e.peca == 0) printf("\n\r");
else if (e.peca == VALOR_X) printf("Turn: X\n\r\n\r");
else printf("Turn: O\n\r\n\r");

if (opcao == 2 && (*turno)->N != 0)
    printf("A melhor jogada é %d %d.\n\r", sugestao->y+1, sugestao->x+1);

}

Я ожидал, что с помощью fflush (stdout) он сотрет предыдущие отпечатки, а с помощью '\ r' он просто напишет в том же месте, что и раньше, но он продолжает писать в соответствии с уже написанным и создает терминал переехать. Любые идеи о том, что я мог бы сделать, чтобы это исправить?

1 Ответ

2 голосов
/ 18 апреля 2019

Даже при использовании \r стандартные функции (scanf, fgets ...) считывают от stdin до нажатия Return , в этих случаях курсор всегда опускается ( потребляет \n) до следующей строки консоли.

Вам нужно использовать какую-то специализированную библиотеку, вы можете проверить ncurses в Unix или в консоли API в Windows.

Другой вариант (если вы находитесь под терминалом, совместимым с vt100) использует коды консоли:

#define gotoxy(x,y) printf("\033[%d;%dH", (x), (y))

(man console_codes для получения дополнительной информации)

...