You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 08:15:04