mvaddch не перезаписывает символ на экране - PullRequest
1 голос
/ 11 января 2012

Я пишу клиент для консольной игры, 1vs1.В игре один игрок должен поймать другого, и каждый игрок представлен символом, напечатанным на консоли.Я использую mvaddch (), чтобы удалить старую позицию и распечатать новую позицию на консоли.Мой код генерирует 2 процесса:

  • Процесс A: получает данные с клавиатуры и обновляет позицию на экране;
  • Процесс B: получает данные с сервера иобновить позицию противника на экране;

Моя проблема в том, что старая позиция врага не удаляется (перезаписывается с помощью ''), поэтому процесс B генерирует змею символов на экране,Процесс А работает хорошо.

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

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

Если вы не хотите, чтобы весь след показывался, вы должны вести учет предыдущей позиции каждого персонажа (игрока) и договориться о том, чтобы написать пробел в старой позиции и правильную отметку в новой позиции. Если вы чувствуете себя модно, вы можете использовать цветной бланк, один цвет для каждого игрока, чтобы вы могли видеть, где они были, даже если текущие позиции помечены по-разному.

К сожалению, без упоминания окраски это похоже на то, что вы делаете.

Вы должны убедиться, что вы не используете -1 координаты; mvaddch(), вероятно, не проверен на ошибку и будет вытащен за пределы, делая то, кто знает, какой урон. Не рискуй этим. (Подумайте об использовании 0, 0 в качестве старой позиции; не имеет значения, если вы пишете пробел поверх пробела. Единственное, что имеет значение, это то, что другой игрок не там, где вы пишете пробел.)

Обратите внимание, что крайне важно, чтобы только один процесс делал рисунок. Если у вас есть два процесса, пытающихся сделать это, вы потеряете одно или другое изображение в течение некоторого времени. Это одна из причин, почему трудно добавить часы, скажем, в верхний правый угол экрана терминала. Похоже, у вас есть два процесса, пытающихся записать на экран.

По стилю, вам нужно использовать больше функций. То есть каждый процесс должен иметь свой код в отдельной функции, чтобы было легче увидеть, что он делает. Наложение тесных скобок } на глубину в три строки тоже не очень хороший стиль.

...