我是一名正在为大学项目开发奥赛罗版本的学生。
它大部分已经完成,所以我正在寻找可以改进的东西。其中之一是制作电路板(打印到标准输出)只需用每次播放替换前一个电路板,确保终端不移动。
以下是最近这样做的尝试:
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'表示它会像以前一样在同一个地方写入,但它会继续写入已经写好的内容并使终端移动。关于我能做些什么来解决这个问题的任何想法?
即使使用\r
,标准函数(scanf
,fgets
......)从stdin
读取,直到按下Return,在这些情况下,光标总是向下(消耗\n
)到控制台的下一行。
您需要使用一些专用库,您可以在unix上检查ncurses
或在Windows中检查控制台API。
另一个选项(如果您在vt100兼容终端下)使用控制台代码:
#define gotoxy(x,y) printf("\033[%d;%dH", (x), (y))
(man console_codes
获取更多信息)