mvaddch不会覆盖屏幕上的字符

时间:2012-01-11 09:48:38

标签: c fork curses

我为控制台游戏编写了一个客户端,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");
}

1 个答案:

答案 0 :(得分:1)

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

不幸的是,如果没有提到颜色,那就像你正在做的那样。

您应该确保不使用-1坐标; mvaddch()可能不会被错误检查,并且会踩到界外,知道谁知道损坏。不要冒风险。 (考虑使用0, 0作为旧位置;如果你在空白处写一个空白就没关系。唯一重要的是另一个玩家不在你写空白的地方。)

请注意,只有一个进程正在进行绘制。如果您有两个进程尝试这样做,您将在某些时候丢失一个或其他图像。这就是为什么很难在终端屏幕的右上角添加时钟的原因之一。你似乎有两个进程试图写入屏幕。

样式方面,您需要使用更多功能。也就是说,不同的进程应该将它们的代码放在一个单独的函数中,这样就可以更容易地看到它们正在做什么。将紧密的大括号}堆叠在一条线上并不是很好的风格。