0

私は Lua にまったく慣れていませんが、基本をしっかりと把握していると感じています。最近コンピュータークラフトで、原子炉がオンになっているかどうかを表示する独自のモニターを設計しようとしました。これは私が思いついたものです:

function screen()
  monitor = peripheral.wrap("top")
  monitor.clear()
  monitor.setCursorPos(1,1)
  monitor.setTextColor(colors.white)
  monitor.write("Reactor 1: ")
  monitor.setCursorPos(1,3)
  monitor.write("Reactor 2: ")
  monitor.setCursorPos(1,5)
  monitor.write("Reactor 3: ")
  monitor.setCursorPos(1,7)
  monitor.write("Reactor 4: ")
  monitor.setCursorPos(1,9)
  monitor.write("Reactor 5: ")
  monitor.setCursorPos(1,11)
  monitor.write("Reactor 6: ")
end

function test(color,cursor1,cursor2)
while true do
  if colors.test(rs.getBundledInput("right"), color) == true then
    monitor.setCursorPos(cursor1,cursor2)
    monitor.setTextColor(colors.green)
    monitor.write("Active  ")
  elseif colors.test(rs.getBundledInput("right"), color) == false then
    monitor.setCursorPos(cursor1,cursor2)
    monitor.setTextColor(colors.red)
    monitor.write("Inactive")
  end
  sleep(0.1)
end
sleep(0.1)
end
sleep(0.1)

function status()
  screen()
  test(colors.red,12,1)
  test(colors.orange,12,3)
  test(colors.yellow,12,5)
  test(colors.green,12,7)
  test(colors.blue,12,9)
  test(colors.purple,12,11)
  sleep(0.1)
end

status()

残念ながら、これは私に望ましい結果をもたらしませんでした。各リアクターの名前とそれがアクティブかどうかを表示する代わりに、すべてのリアクター名を表示し、最初のリアクターがアクティブかどうかのみを表示しました。他の 5 基の原子炉には、名前の横に空白がありました。

この画像は、モニターで何が起こっているかを示しています

これは私が回避策として思いついたものです。それは機能しますが、最初のものよりもはるかに長くなります:

function test(color,cursor1,cursor2)
while true do
  if colors.test(rs.getBundledInput("right"), color) == true then
    monitor.setCursorPos(cursor1,cursor2)
    monitor.setTextColor(colors.green)
    monitor.write("Active  ")
  elseif colors.test(rs.getBundledInput("right"), color) == false then
    monitor.setCursorPos(cursor1,cursor2)
    monitor.setTextColor(colors.red)
    monitor.write("Inactive")
  end
  sleep(0.1)
end
sleep(0.1)
end
sleep(0.1)

function status()
  screen()
  test(colors.red,12,1)
  test(colors.orange,12,3)
  test(colors.yellow,12,5)
  test(colors.green,12,7)
  test(colors.blue,12,9)
  test(colors.purple,12,11)
  sleep(0.1)
end

status()


function screen()
  monitor = peripheral.wrap("top")
    monitor.clear()
    monitor.setCursorPos(1,1)
    monitor.setTextColor(colors.white)
    monitor.write("Reactor 1: ")
    monitor.setCursorPos(1,3)
    monitor.write("Reactor 2: ")
    monitor.setCursorPos(1,5)
    monitor.write("Reactor 3: ")
    monitor.setCursorPos(1,7)
    monitor.write("Reactor 4: ")
    monitor.setCursorPos(1,9)
    monitor.write("Reactor 5: ")
    monitor.setCursorPos(1,11)
    monitor.write("Reactor 6: ")
end

function test()
local monitor = peripheral.wrap("top")
  while true do
    if colors.test(rs.getBundledInput("right"), colors.red) == true then
      monitor.setCursorPos(12,1)
      monitor.setTextColor(colors.green)
      monitor.write("Active  ")
    elseif colors.test(rs.getBundledInput("right"), colors.red) == false then
      monitor.setCursorPos(12,1)
      monitor.setTextColor(colors.red)
      monitor.write("Inactive")
    end
    if colors.test(rs.getBundledInput("right"), colors.orange) == true then
      monitor.setCursorPos(12,3)
      monitor.setTextColor(colors.green)
      monitor.write("Active  ")
    elseif colors.test(rs.getBundledInput("right"), colors.orange) == false then
      monitor.setCursorPos(12,3)
      monitor.setTextColor(colors.red)
      monitor.write("Inactive")
    end
    if colors.test(rs.getBundledInput("right"), colors.yellow) == true then
      monitor.setCursorPos(12,5)
      monitor.setTextColor(colors.green)
      monitor.write("Active  ")
    elseif colors.test(rs.getBundledInput("right"), colors.yellow) == false then
      monitor.setCursorPos(12,5)
      monitor.setTextColor(colors.red)
      monitor.write("Inactive")
    end
    if colors.test(rs.getBundledInput("right"), colors.green) == true then
      monitor.setCursorPos(12,7)
      monitor.setTextColor(colors.green)
      monitor.write("Active  ")
    elseif colors.test(rs.getBundledInput("right"), colors.green) == false then
      monitor.setCursorPos(12,7)
      monitor.setTextColor(colors.red)
      monitor.write("Inactive")
    end
    if colors.test(rs.getBundledInput("right"), colors.blue) == true then
      monitor.setCursorPos(12,9)
      monitor.setTextColor(colors.green)
      monitor.write("Active  ")
    elseif colors.test(rs.getBundledInput("right"), colors.blue) == false then
      monitor.setCursorPos(12,9)
      monitor.setTextColor(colors.red)
      monitor.write("Inactive")
    end
    if colors.test(rs.getBundledInput("right"), colors.purple) == true then
      monitor.setCursorPos(12,11)
      monitor.setTextColor(colors.green)
      monitor.write("Active  ")
    elseif colors.test(rs.getBundledInput("right"), colors.purple) == false then
      monitor.setCursorPos(12,11)
      monitor.setTextColor(colors.red)
      monitor.write("Inactive")
    end
  sleep(0.1)
end
sleep(0.1)
end
sleep(0.1)

function run()
  screen()
  test()
end

run()

他のシステムにも同様のコードを実装したいと考えていますが、可能であれば、2 番目のコードよりも 1 番目のコードと同様に実装したいと考えています。

私はまだコーディングにかなり慣れていないので、これが明らかなエラーまたはばかげたエラーである場合は、心からお詫び申し上げます。私は、コードを見て、さまざまなことを試すことで、一種のことを学びました。私の問題について何か助けていただければ幸いです。

また、何かを合理化または簡素化するための提案も大歓迎です! ありがとうございました!!

4

1 に答える 1

0

まず第一に、「while true do」を使用した関数テストのコードの最初のブロックで、ループをエスケープする方法がないため(「break」を使用する場合を除く)、常にチェックする方法を正確に知っています。最初のものをチェックし、他のものをチェックするために逃げることはできません。

これを試してください(テストされていません):

local monitor = peripheral.wrap( "top" )
monitor.clear()

function screen()
  monitor.setTextColor( colors.white )
  for i = 1, 6 do
    monitor.setCursorPos( 1, i*2-1 )
    monitor.write( "Reactor " .. i .. ": " )
  end
end

function test( color, x, y )
  if colors.test( rs.getBundledInput( "right" ), color ) then
    monitor.setCursorPos( x, y )
    monitor.setTextColor( colors.green )
    monitor.write("Active  ")
  else
    monitor.setCursorPos( x, y )
    monitor.setTextColor( colors.red )
    monitor.write( "Inactive" )
  end
end

local rscolors = {
  colors.red = 1,
  colors.orange = 3,
  colors.yellow = 5,
  colors.green = 7,
  colors.blue = 9,
  colors.purple = 11
}

while true do
  for k, v in pairs( rscolors ) do
    test( k, 12, v )
  end
  sleep( 0.1 )
end

PS: Direwolf20は、ビデオで説明する原子炉プログラムを既に実行しています。

  • ボタン (XBbMUYNn)
  • 原子炉 (4qNyaPav)
于 2016-06-14T00:00:22.827 に答える