Я пытаюсь написать клиент для простой игровой консоли 1vs1. Игра: 1 игрок должен поймать другого; каждый игрок представлен символом #
и $
. Для управления данными я использую 3 процесса:
- Процесс А. Процесс А получает позицию противника с сервера и записывает ее в трубу;
- Процесс B. Процесс B получает ввод с клавиатуры, обновляет позицию игрока, записывает его на канал;
- Процесс 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");
}