gpt4 book ai didi

c - 使用系统 ("/bin/stty raw"时的奇怪输出行为)

转载 作者:太空宇宙 更新时间:2023-11-04 06:12:08 27 4
gpt4 key购买 nike

在我的程序中,显示了一个 5x20 的点域。一名带有“#”符号的球员也在场上。您可以使用 w、a、s 和 d 移动玩家。如果我使用缓冲输入,一切都很好。但是用户不想每次都按回车键。所以我使用了命令

system("/bin/stty raw")

现在的问题是输出行为很奇怪。字段的行现在没有正确显示。我试图自己找出错误,浪费了很多时间。谷歌似乎也没有对此行为的适当解释。

你能告诉我为什么程序表现如此奇怪,以及如何解决这个问题吗?

#include <stdio.h>

#define FIELD_VERTIKAL 5
#define FIELD_HORIZONTAL 20
#define PLAYER_SYMBOL '#'

void print_field(char field[FIELD_VERTIKAL][FIELD_HORIZONTAL])
{
// reset display
for (int i = 0; i < 20; i++)
putchar('\n');

// display field
for (int i = 0; i < FIELD_VERTIKAL; i++)
{
for (int j = 0; j < FIELD_HORIZONTAL; j++)
putchar(field[i][j]);
putchar('\n');
}
}

void draw_field(char field[FIELD_VERTIKAL][FIELD_HORIZONTAL],
int pos_vertikal, int pos_horizontal)
{
for (int i = 0; i < FIELD_VERTIKAL; i++)
for (int j = 0; j < FIELD_HORIZONTAL; j++)
field[i][j] = '.';
field[pos_vertikal][pos_horizontal] = '#';
}

int main()
{
// create field and initialize it
char field[FIELD_VERTIKAL][FIELD_HORIZONTAL];

// position of player
int pos_vertikal = 0;
int pos_horizontal = 0;

// initialize field
draw_field(field, pos_vertikal, pos_horizontal);

system("/bin/stty raw");
print_field(field);
char input;
while ((input = getchar()) != EOF)
{
// move player
if (input == 'w')
{
pos_vertikal--;
}
else if (input == 'a')
{
pos_horizontal--;
}
else if (input == 's')
{
pos_vertikal++;
}
else if (input == 'd')
{
pos_horizontal++;
}

// place player and display field
draw_field(field, pos_vertikal, pos_horizontal);
print_field(field);
}
}

最佳答案

Terminals是非常复杂的设备(今天的 terminal emulators 正试图模仿它们,类似于 VT100 ;当然这些模拟器是 operating-system 特定的)。阅读 TTY demystified页面和termios(3) .还要注意 ANSI escape codes .

并且 stty raw 并没有做您梦寐以求的事情(它与 line discipline 相关)。另见 stty(1)pty(7) .

如果你想编写一个面向终端文本的应用程序,请使用一些库,例如 ncurses .因此,扔掉您的代码,花几天时间阅读文档,然后从头开始重新编写代码。

或许您可以考虑制作一些图形应用程序来代替您的游戏,例如通过使用一些工具包,例如 GTKlibSDL .

附言。你不提,但我猜你用的是某种Linux系统。

关于c - 使用系统 ("/bin/stty raw"时的奇怪输出行为),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54002944/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com