#c #printf #carriage-return
#c #printf #возврат каретки
Вопрос:
Я студент, в настоящее время разрабатываю версию «Отелло» для университетского проекта.
В основном она доработана, поэтому я ищу то, что могу улучшить. Один из них заключается в том, чтобы плата (которая печатается в стандартном режиме) просто заменяла предыдущую при каждом воспроизведении, гарантируя, что терминал не перемещается.
Ниже приведена самая последняя попытка сделать это:
char c = ' ';
fflush(stdout);
contaPecas(e, pecas);
printf("nr* X-%d |SCORE| O-%d * nrnr 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.nr", 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 amp;amp; verificaValida(i,j,turno) == 1)
c = '.';
else if (opcao == 2 amp;amp; (*turno)->N != 0 amp;amp; i == sugestao->y amp;amp; 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.nr");
break;
case 1:
printf(" | L<ficheiro>para ler um jogo de ficheiro.nr");
break;
case 2:
printf(" | E <ficheiro> escrever em ficheiro estado do jogo.nr");
break;
case 3:
printf(" | J<L,C>jogar peça atual na posição (l,c).nr");
break;
case 4:
printf(" | S para imprimir um ponto ‘.’nas posições com jogada válida.nr");
break;
case 5:
printf(" | H para sugestão de jogada. Deve ser colocado um ‘?’no sitio sugerido.nr");
break;
case 6:
printf(" | U para desfazer a última jogada(Undo).nr");
break;
case 7:
printf(" | Q para sair do jogo.nr");
break;
}
}
if (e.peca == 0) printf("nr");
else if (e.peca == VALOR_X) printf("Turn: Xnrnr");
else printf("Turn: Onrnr");
if (opcao == 2 amp;amp; (*turno)->N != 0)
printf("A melhor jogada é %d %d.nr", sugestao->y 1, sugestao->x 1);
}
Я ожидал, что с помощью fflush (стандартный вывод) он сотрет предыдущие отпечатки, а с помощью ‘ r’ он просто напишет в том же месте, что и раньше, но он продолжает писать под тем, что уже было написано, и заставляет терминал двигаться. Есть какие-нибудь идеи о том, что я мог бы сделать, чтобы исправить это?
Комментарии:
1. Одно из основных улучшений, которое вы можете сделать, это всегда писать код на английском языке с английскими именами переменных и функций.
2. Вам также может быть интересно позвонить
system("clear");
, чтобы очистить текущий терминал3. @Lundin Обычно я бы так и сделал, но было специально предложено, чтобы мы работали с шаблоном на португальском языке, поэтому я решил оставить остальное на португальском. Для меня это тоже выглядит очень неправильно!
Ответ №1:
Даже при использовании r
стандартных функций ( scanf
, fgets
…) считывается до stdin
Returnнажатия клавиши a, в этих случаях курсор всегда опускается ( n
переходит) на следующую строку консоли.
Вам нужно использовать какую-то специализированную библиотеку, вы можете проверить ncurses
на unix или console API в Windows.
Другим вариантом (если вы используете терминал, совместимый с vt100) является использование консольных кодов:
#define gotoxy(x,y) printf("33[%d;%dH", (x), (y))
( man console_codes
для получения дополнительной информации)
Комментарии:
1. Я бы не рекомендовал использовать conio, это устаревшее дерьмо DOS. В Windows используйте консольный API напрямую.
2. @Lundin, ты имеешь в виду, что Turbo C устарел? вы правы, отредактировано 😉
3. Не сбивайте мой Borland Turbo C / C для DOS. Я получил его в 89-м, и тогда он был хорош. Даже пришел с тасмом… Это было всего пару лет назад. Должно быть, все еще хорошо, верно? Он даже использовал математический сопроцессор 8087 на моей плате 386!
4. @DavidC.Rankin да! Правила Turbo C i.ebayimg.com/images/g/Jx8AAOSwgzBcM1cO/s-l500.jpg
5. Да, в моем ящике все еще полно дискет 360k и 1.2m 5.25 (и у меня все еще есть пара дисков, которые их читают….
:)