基于fork实现的微型太空游戏用户控制飞船无法发射子弹问题排查
问题排查与修复方案
导致子弹无法发射的核心错误
在Spaceship函数的射击分支中,创建子弹子进程后错误关闭了管道写端:
if(pidP==0) { flash(); mvprintw(apos.y+1,apos.x,"-"); refresh(); close(pipeout); // 本行是错误根源,关闭后Proiettile无法向管道传输坐标数据 Proiettile(pipeout,apos.x,apos.y); }
管道写端关闭后,Proiettile函数中的write操作会直接失败,子弹坐标无法传递给负责统一绘图的Area进程,自然不会显示子弹。
直接修复方案:删除close(pipeout);这行代码即可解决子弹无法发射的问题。
其他关联问题修复建议
- 多进程操作curses不安全:curses的内部状态存储在进程独立地址空间中,子弹子进程直接调用
mvprintw、refresh修改绘图状态不会同步到其他进程,建议删除所有子进程中的绘图代码,所有绘图逻辑统一放到Area进程处理。 - 子弹退出逻辑优化:
Proiettile函数中用kill(pidP,1)终止自身不如直接调用exit(0)规范,且退出前可以主动发送一个空格字符到管道,清空屏幕边缘残留的子弹符号:
if(proiettile.x + deltax > MAXX){ proiettile.c = ' '; write(pipeout,&proiettile,sizeof(proiettile)); exit(0); }
- 多子弹支持优化:当前
Area函数仅用一个proiettile结构体存储子弹坐标,发射多发子弹时新数据会覆盖旧数据,只能显示最后一发子弹,建议用数组或链表存储所有存活子弹的坐标。 - 输入阻塞问题修复:当前
getch为默认阻塞模式,用户不按键时敌方飞船也会停止移动,可在main函数中添加非阻塞配置:
initscr(); noecho(); timeout(0); // 新增本行,设置getch为非阻塞模式 curs_set(0);
内容的提问来源于stack exchange,提问作者Zeld
相关产品推荐
相关产品推荐

