ComputerCraft监视器打印新行未更新原有行问题求解
问题原因
两种写法的核心区别是y变量是否被永久修改:
- 调用
mon_1.setCursorPos(x, y+1)时,仅临时计算光标位置,y本身的数值不会变化,每次循环都会回到固定起始位置覆盖旧内容,所以可以正常更新行 - 调用
y = y+1 mon_1.setCursorPos(x, y)时,首先存在Lua语法问题:同一行书写多条语句必须用分号分隔,正确写法为y = y+1; mon_1.setCursorPos(x, y);其次这种写法会在每次循环、每打印一行时永久累加y的值,光标只会持续向下移动,永远不会回到之前打印过的行位置,自然无法更新旧内容,只会不停在新行打印,最终还会超出监视器显示边界。
修复步骤
- 主循环每次执行打印逻辑前,将
y重置为固定的初始行号,禁止y无限累加 - 每次写入新内容前清空对应行的残留字符,避免新内容长度短于旧内容时出现显示乱码
- 主循环开头清空监视器屏幕,避免旧内容残留
- 把开机时仅执行一次的能量打印逻辑移入主循环,保证数据实时更新
修正后的完整代码
--Define some colors color_fuel = 16 color_ok = 2243 color_error = 224455 color_blank = 0 color_active = 2240 --Tables reactors={} max_energy={} produced={} percent_capacity={} --Globals x = 1 start_y = 1 -- 固定打印起始行,避免坐标无限累加 i = 0 --Lamps lamp_1 = peripheral.wrap("colorful_lamp_0") lamp_2 = peripheral.wrap("colorful_lamp_1") lamp_3 = peripheral.wrap("colorful_lamp_2") --Monitors mon_1 = peripheral.wrap("monitor_3") mon_w, mon_h = mon_1.getSize() -- 获取监视器尺寸用于清行 --Cap banks cap_1 = peripheral.wrap("capacitor_bank_2") --Helper functions function flash_fuel_lamp() lamp_2.setLampColor(color_blank) sleep(0.01) lamp_2.setLampColor(color_error) for i = 10,1,-1 do lamp_1.setLampColor(color_fuel) sleep(1) lamp_1.setLampColor(color_blank) sleep(1) end lamp_1.setLampColor(color_fuel) end function clear_lamps() lamp_1.setLampColor(color_blank) lamp_2.setLampColor(color_blank) lamp_3.setLampColor(color_blank) end -- 清除指定行残留内容的工具函数 function clear_line(y_pos) mon_1.setCursorPos(1, y_pos) mon_1.write(string.rep(" ", mon_w)) end --Boot Sequence --Set lamps to black and clear screen clear_lamps() mon_1.clear() --Turn on the reactors and set the status light to green for k,v in pairs(peripheral.getNames()) do if(string.find(v, "BigReactors")) then reactors[i] = peripheral.wrap(v) i = i + 1 end end for k,v in pairs(reactors) do v.setActive(true) end lamp_2.setLampColor(color_ok) lamp_3.setLampColor(color_active) --Main loop while true do --Check the fuel level if(redstone.getAnalogInput("bottom") == 0) then lamp_3.setLampColor(color_blank) for k,v in pairs(reactors) do v.setActive(false) end flash_fuel_lamp() end for k,v in pairs(reactors) do if(v.getActive() == false) then lamp_3.setLampColor(color_blank) end --Calculate the energies max_energy[k] = v.getEnergyStored() produced[k] = v.getEnergyProducedLastTick() percent_capacity[k] = (max_energy[k] / produced[k]) * 100 end max_energy_cap = cap_1.getMaxEnergyStored() energy_stored = cap_1.getEnergyStored() percent_capacity_cap = (energy_stored / max_energy_cap) * 100 -- 每次打印前重置y坐标到初始位置 local y = start_y mon_1.clear() -- 打印反应堆最大能量数据 for key,value in pairs(max_energy) do clear_line(y) mon_1.setCursorPos(x, y) mon_1.write("Reactor " .. key .. " Max Energy: " .. value) y = y + 1 end -- 打印容量、电容实时数据 for key,value in pairs(percent_capacity) do for k,v in pairs(reactors) do clear_line(y) mon_1.setCursorPos(x, y) mon_1.write("Reactor " .. k .. " Percent Capacity: " .. value) y = y + 1 clear_line(y) mon_1.setCursorPos(x, y) mon_1.write("Capacitor output per tick: " .. cap_1.getAverageOutputPerTick()) y = y + 1 clear_line(y) mon_1.setCursorPos(x, y) mon_1.write("Capacitor input per tick: " .. cap_1.getAverageInputPerTick()) y = y + 1 end end sleep(0.01) end
内容的提问来源于stack exchange,提问作者Connor Tozer
相关产品推荐
相关产品推荐

