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

Pascal打砖块游戏graph单元调用后图形窗口全黑无显示问题求助

问题根因

1. 文件读取逻辑完全错误

  • MiseEnPlaceMur过程中判断文件结束使用了无参数的eof,默认检测的是控制台标准输入的结束状态,而非你打开的关卡文件f,循环逻辑完全不符合预期
  • 关卡文件的写入逻辑是每个数字单独占一行,读取时你仅在进入过程时执行了一次read(f, s),仅读取了第一个数字,没有遍历整个文件的30个数值
  • 数组下标i的自增逻辑写在了while循环外部,只会执行1次,无法遍历整个砖块数组
  • 你默认每行有多个数字,用for j:= 1 to length(s)遍历,但实际每行只有1个数字,这个循环只能执行1次,后续的每5个砖块换行的判断逻辑完全不会触发

2. 砖块坐标计算错误

  • 第一个砖块宽度是45像素(x从200到245),但后续你写的是x2 := x2 + 10,后续砖块宽度仅10像素,坐标偏移完全错误,砖块要么重叠要么超出可视区域,无法被观察到

3. 图形模式下的控制台输出冲突

  • DessinerBrique过程中调用了writeln输出调试信息,在BGI图形模式下输出控制台内容会干扰图形画面刷新,导致绘制内容不显示

修复方案

1. 修正MiseEnPlaceMur过程逻辑

首先修改过程的参数定义,添加计数器替代原来的j循环,正确读取文件每一行内容:

procedure MiseEnPlaceMur(m : Integer; var f : Text; var res : r); 
var 
    count : Integer;
    x1, y1, x2, y2 : Integer;
    s : String;
begin
    count := 0;
    x1 := 200;
    x2 := 245;
    y1 := 0;
    y2 := 25;
    assign(f, 'Niveau '+IntToStr(m)+'.txt'); // 直接内部打开文件更稳妥,避免外部操作异常
    reset(f);

    while not eof(f) do // 明确判断关卡文件f的结束状态
    begin
        readln(f, s); // 每次读一行,获取当前砖块的生命值
        count := count + 1;
        res[count div 5 + 1][count mod 5 + 1] := StrToInt(s[1]);
        DessinerBrique(count div 5 + 1, count mod 5 + 1, res, x1, y1, x2, y2);
        
        // 坐标偏移
        x1 := x2;
        x2 := x2 + 45; // 统一砖块宽度为45像素

        // 每5个砖块换一行
        if count mod 5 = 0 then 
        begin
            x1 := 200;
            x2 := 245;
            y1 := y2;
            y2 := y1 + 25;
        end;
    end;
    close(f);
end;

2. 删除图形模式下的控制台输出

修改DessinerBrique过程,删掉writeln调试语句:

procedure DessinerBrique(i, j : Integer; res : r; x1, y1, x2, y2 : Integer);
begin
    // 删掉这行调试输出,避免干扰图形渲染
    // writeln(x1, ',', y1, ' ', x2, ',', y2, '-', res[i][j]);
    setcolor(15);
    rectangle(x1, y1, x2, y2);

    if res[i][j]= 1 then
    begin
        setfillstyle(1,1);
        floodfill((x1+x2)div 2,(y1+y2)div 2,15); 
    end
    else if res[i][j] = 2 then
    begin
        setfillstyle(1, 2);
        floodfill((x1 + x2) div 2, (y1 + y2) div 2, 15); 
    end
    else if res[i][j]= 3 then
    begin
        setfillstyle(1,4);
        floodfill((x1 + x2) div 2, (y1 + y2) div 2, 15); 
    end;
end;

3. 可选优化

可以删掉主程序里调用remplissageDoc之后的文件操作,因为修改后的MiseEnPlaceMur已经内部处理了文件的打开关闭,避免重复操作文件导致异常。

修复完成后重新编译运行,即可正常显示彩色砖块墙。


内容的提问来源于stack exchange,提问作者TheRealBilly

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:36:03