【发布时间】:2012-01-11 09:48:38
【问题描述】:
我为主机游戏 1vs1 编写了一个客户端。在游戏中,一个玩家必须抓住另一个玩家,每个玩家都被一个字符表示,打印在控制台上。我使用 mvaddch() 删除旧位置,并在控制台上打印新位置。 我的代码生成2个进程:
- 进程A:从键盘获取输入并更新屏幕上的位置;
- 进程B:从服务器获取输入并更新敌人在屏幕上的位置;
我的问题是敌人的旧位置没有被删除(用''覆盖),因此进程B在屏幕上生成了一条字符蛇。过程 A 工作良好。
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");
}
【问题讨论】:
-
您的流程模型不起作用 - 每个项目中的 curses 可能会尝试以相对运动从它认为的位置移动光标,而不考虑其他流程中完成的运动,或者转义序列和两者的输出可能会交错。