2012-01-10 175 views
0

我正在嘗試編寫一個簡單的遊戲控制檯,1vs1的客戶端。遊戲:一個玩家必須抓住另一個;每個玩家都用char,#$表示。爲了管理這些數據,我使用了3個進程:mvaddch()不打印到控制檯

  1. 進程A.進程A從服務器獲取敵人的位置,並將其寫入管道;處理B:處理B從鍵盤獲取輸入,更新播放器的位置,將其寫入管道;
  2. 過程C過程C讀取管道並用兩個字符顯示地圖,每個字符代表一個玩家。

現在,要顯示過程C中的字符,我使用從<curses.h>提供的mvaddch()。我的問題似乎不起作用,但如果我在流程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"); 
} 

回答

2

因爲你永遠不refresh()顯示,有沒有機會爲人物移動。

當您使用refresh()時,curses庫僅向屏幕發送更新。

+0

謝謝,現在我改變了我的代碼後這個答案。我的新客戶只使用2個進程,並且mvaddch()有一個新問題:當敵人移動時,我的客戶端不會刪除舊的位置,並且我還有另一個字符蛇。不管怎樣,我爲這個問題創造了一個新的問題。 – optimusfrenk 2012-01-11 09:31:30