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
相关产品推荐
相关产品推荐

