mvaddch()不会打印到控制台

时间:2012-01-10 23:58:00

标签: c fork pipe ncurses

我正在尝试为简单的游戏机1vs1编写客户端。比赛:1名球员必须抓住对方;每个玩家都由一个字符#$表示。为了管理数据,我使用了3个过程:

  1. 进程A.进程A从服务器获取敌人的位置,并将其写入管道;
  2. 进程B.进程B从键盘获取输入,更新播放器的位置,将其写入管道;
  3. 进程C.进程C读取管道并显示带有两个字符的地图,每个字符代表一个玩家。
  4. 现在,要显示流程C中的字符,我使用mvaddch()提供的<curses.h>。我的问题似乎不起作用,但是如果我在进程B中使用mvaddch(),它就可以工作......“我可以绘制一条由连续x组成的蛇”。

     ...
      initscr();
    noecho();
    curs_set(0);
    
    role = position.c;
    
    if ( pipe(filedes) == -1)   {perror("pipe() fallita");  exit(0);    }
        // process A is creaded now
    switch ( pid_nemico = fork() ) {
        case -1:    perror("fork() fallita");   exit(0);
        case 0:     close(filedes[0]);
                while (1) {
                    while ( recv(sock, &position, sizeof(struct pos), 0) < 1 )
                    write(filedes[1], &position, sizeof(struct pos));   }   // position rappresenta la posizione del nemico
        default:    break ;         }                       // che viene mandata dal server
        //process B is created now, and within mvaddch works
    switch ( pid = fork() ) {
        case -1:    perror("fork() fallita");   exit(0);
        case 0:     close(filedes[0]);
                char c;
                while (1) {
                    switch(c=getch()) {
                        case SU:    if(position.y>0) {  position.y-=1;
                                    write(filedes[1], &position, sizeof(struct pos));
                                    send(sock, &position, sizeof(struct pos), 0);   } break;
    
                        case GIU:   if(position.y<MAXY-1){  position.y+=1; 
                                    write(filedes[1], &position, sizeof(struct pos));
                                    send(sock, &position, sizeof(struct pos), 0);   } break;
    
                        case SINISTRA:  if(position.x>0){   position.x-=1;
                                    write(filedes[1], &position, sizeof(struct pos));
                                    send(sock, &position, sizeof(struct pos), 0);   } break;
    
                        case DESTRA:    if(position.x<MAXX-1){  position.x+=1;
                                    write(filedes[1], &position, sizeof(struct pos));
                                    send(sock, &position, sizeof(struct pos), 0);   } break;
                        default: break; }
                        }
        default:    break ;         }
        // And this is the remaining Process, process C, where mvaddch does not work
    close(filedes[1]);
    struct pos pos_guardia = {'#', 0, 0};
    struct pos pos_ladro = {'$', 0, 0};
    read(filedes[0], &position, sizeof(struct pos));
    
        while ((position.c == '#') || (position.c == '$')) {
            switch (position.c) {
                case '#':   printf("%d\n",mvaddch(pos_guardia.y, pos_guardia.x, ' ')    );
                        mvaddch(position.y, position.x, '#');
                        pos_guardia.x = position.x;
                        pos_guardia.y = position.y;
                        break;
                case '$':   printf("%d\n",mvaddch(pos_ladro.y, pos_ladro.x, ' ')        );
                        mvaddch(position.y, position.x, '$');
                        pos_ladro.x = position.x;
                        pos_ladro.y = position.y;
                        break;
                case 'G':   if (role == '#') {  printf("Hai vinto la Partita");
                         }else{         printf("Hai perso la Partita"); }
                        break;
                case 'L':   if (role == '$') {  printf("Hai vinto la Partita");
                         }else{         printf("Hai perso la Partita"); }
                        break;
                default:    printf("Pacchetto ricevuto non interpretato");  }
            read(filedes[0], &position, sizeof(struct pos));    }
    kill(pid_nemico);
    kill(pid);
    printf("\n-----------------------------\n");
    }
    

1 个答案:

答案 0 :(得分:3)

由于您从未refresh()显示,因此字符无法移动。

curses库仅在您使用refresh()时向屏幕发送更新。