mvaddch () не печатает на консоль - PullRequest
0 голосов
/ 11 января 2012

Я пытаюсь написать клиент для простой игровой консоли 1vs1. Игра: 1 игрок должен поймать другого; каждый игрок представлен символом # и $. Для управления данными я использую 3 процесса:

  1. Процесс А. Процесс А получает позицию противника с сервера и записывает ее в трубу;
  2. Процесс B. Процесс B получает ввод с клавиатуры, обновляет позицию игрока, записывает его на канал;
  3. Процесс C. Процесс C читает канал и отображает карту с двумя персонажами, каждый из которых представляет игрока.

Теперь, чтобы отобразить символы в процессе C, я использую mvaddch(), предоставленный из <curses.h>. Моя проблема, кажется, не работает, но если я использую mvaddch() в процессе B, он работает ... "и я могу нарисовать змею, состоящую из последовательных х".

 ...
  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 Ответ

3 голосов
/ 11 января 2012

Поскольку вы никогда не refresh() отображаете, у повода нет повода для перемещения.

Библиотека curses отправляет обновления на экран только при использовании refresh().

...