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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:57:15