【问题标题】:mvaddch does not overwrites a character on the screenmvaddch 不会覆盖屏幕上的字符
【发布时间】:2012-01-11 09:48:38
【问题描述】:

我为主机游戏 1vs1 编写了一个客户端。在游戏中,一个玩家必须抓住另一个玩家,每个玩家都被一个字符表示,打印在控制台上。我使用 mvaddch() 删除旧位置,并在控制台上打印新位置。 我的代码生成2个进程:

  • 进程A:从键盘获取输入并更新屏幕上的位置;
  • 进程B:从服务器获取输入并更新敌人在屏幕上的位置;

我的问题是敌人的旧位置没有被删除(用''覆盖),因此进程B在屏幕上生成了一条字符蛇。过程 A 工作良好。

  initscr();
noecho();
curs_set(0);
  //process A is created now
switch ( pid = fork() ) {
    case -1:    perror("fork() fallita");   exit(0);
    case 0:     {char c;    struct pos old_position = {welcome_position.c, welcome_position.x, welcome_position.y};
                    struct pos position = {welcome_position.c, welcome_position.x, welcome_position.y};
                    mvaddch(position.y, position.x, position.c);
            while (1) {
                switch(c=getch()) {
                    case SU:    if(position.y>0) {  position.y-=1; } break;
                    case GIU:   if(position.y<MAXY-1){  position.y+=1; } break;
                    case SINISTRA:  if(position.x>0){   position.x-=1; } break;
                    case DESTRA:    if(position.x<MAXX-1){  position.x+=1; } break;
                    default: break;     }
                if ((position.x != old_position.x) || (position.y != old_position.y)) { 
                    send(sock, &position, sizeof(struct pos), 0);
                    mvaddch(old_position.y, old_position.x, ' ');
                    mvaddch(position.y, position.x, position.c);
                    refresh();
                    old_position.x = position.x;
                    old_position.y = position.y; }}     }   
    default:    break ;         }                   
   // Process B is here
struct pos position; 
struct pos old_position={' ', -1,-1};
    while (1) {
        while ( recv(sock, &position, sizeof(struct pos), 0) < 1 )
            mvaddch(old_position.y, old_position.x, ' '); // THE PROBLEM
            mvaddch(position.y, position.x, position.c); // Works => snake
            refresh();
            old_position.x = position.x;
            old_position.y = position.y;}   
endwin();
kill(pid);
printf("\n-----------------------------\n");
}

【问题讨论】:

  • 您的流程模型不起作用 - 每个项目中的 curses 可能会尝试以相对运动从它认为的位置移动光标,而不考虑其他流程中完成的运动,或者转义序列和两者的输出可能会交错。

标签: c fork curses


【解决方案1】:

如果您不想显示整个轨迹,则必须记录每个角色(玩家)的先前位置,并安排在旧位置写空白,在新位置写正确的标记。如果您喜欢,可以使用彩色空白,每个玩家使用一种颜色,这样您就可以看到每个玩家的位置,即使当前位置标记不同。

不幸的是,没有提到颜色,这看起来就像你在做什么。

您应该确保不使用-1 坐标; mvaddch() 可能没有经过错误检查,并且会踩踏出界,谁知道会造成什么损害。不要冒险。 (考虑使用0, 0 作为旧位置;如果你在空格上写一个空格也没关系。唯一重要的是另一个玩家不在你写空格的位置。)

请注意,只有一个进程在进行绘图是至关重要的。如果您有两个进程试图这样做,您有时会丢失一个或其他图像。这就是为什么很难在终端屏幕的右上角添加时钟的原因之一。您似乎确实有两个进程试图写入屏幕。

风格方面,您需要使用更多功能。也就是说,不同的进程应该各自将它们的代码放在一个单独的函数中,以便更容易看到它们在做什么。将右大括号 } 在一行上堆叠三个深度也不是很好的风格。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    相关资源
    最近更新 更多