【问题标题】:computercraft variable in if statmentif 语句中的计算机技术变量
【发布时间】:2018-07-21 22:28:03
【问题描述】:

我有一个小问题我是 Lua 和 ComputerCraft 的新手。所以我认为我的问题是我太愚蠢了,无法在 if 语句中编写变量更改,我将把我的代码发布下来,希望你能帮助我解决这个问题 thx

mon = peripheral.wrap("top")
modem = peripheral.wrap("right")
mon.clear()
mon.setCursorPos(1,2)
mon.blit("Pulverizer","0000000000","dddddddddd")
redstone.setOutput("right", true)
Pulverizer = true
mon.setCursorPos(1,4)
mon.write("Furnice","0000000","ddddddd")
redstone.setOutput("left", true)
local Furnice = true
mon.setCursorPos(1,6)
mon.write("Injection Chamber","00000000000000000","ddddddddddddddddd")
local Injection_Chamber = true
redstone.setOutput("top",true)
mon.setCursorPos(1,8)
mon.write("Metalurgig InFuser","000000000000000000","dddddddddddddddddd")
local Metalurgig_InFuser = true
redstone.setOutput("bottom", true)
while true do
  event,side,x,y = os.pullEvent("monitor_touch")


  if x > 1 and x < 11 and y == 2 and Pulverizer == true then
    mon.setCursorPos(1,2)
    mon.clearLine()
    mon.blit("Pulverizer","0000000000","eeeeeeeeee")
    redstone.setOutput("right", false)
    Pulverizer = false

 elseif x > 1 and x < 11 and y == 2 and Pulverizer == false then
   mon.setCoursorPos(1,2)
   mon.clearLine()
   mon.blit("Pulverizer","0000000000","dddddddddd")
   redstone.setOutput("right", true)
   Pulverizer = true
  end
end

Pastebin 的链接:link to code

所以问题出在这部分代码

if x > 1 and x < 11 and y == 2 and Pulverizer == true then
mon.setCursorPos(1,2)
mon.clearLine()
mon.blit("Pulverizer","0000000000","eeeeeeeeee")
redstone.setOutput("right", false)
Pulverizer = false

Pulverizer 变量不想从 true 更改为 false,因此此代码现在无法激活

   elseif x > 1 and x < 11 and y == 2 and Pulverizer == false then
   mon.setCoursorPos(1,2)
   mon.clearLine()
   mon.blit("Pulverizer","0000000000","dddddddddd")
   redstone.setOutput("right", true)
   Pulverizer = true

我不知道为什么 这里还有一个来自游戏内镜头的视频链接,你可以在视频中看到它变成红色但不再变成绿色了

https://youtu.be/R4dpN-egnwY

【问题讨论】:

  • 我们需要知道会发生什么,以及您希望发生什么,
  • 我更新了它,也许它现在更清楚应该发生什么它基本上应该将变量 Pulverizer 从 true 更改为 false,elseif 语句可以被激活,但这不会发生它发生了什么基本上是一个切换按钮,当我单击计算机监视器上的按钮时它应该切换@ratchetfreak a
  • 我看了视频,发现帧率很低。在最后一个 end 之前添加一个 sleep(0.2) 并查看它是否有任何改变。可能发生的情况是 Pulverizer 切换得太快以至于无法在屏幕上看到。这一点尤其重要,因为您是在多人游戏中进行的。

标签: lua computercraft


【解决方案1】:

不确定这是否能解决您的问题,但值得尝试调试一下。 只是为了良好的实践,我建议在第 7 行定义 Pulverizer 时,使用 local Pulverizer = true 将其设置为本地。可能不会有所作为,但这是一个很好的做法。根据我的经验,避免使用首字母大写的变量也是一种很好的做法。

其次,尝试将您的 if 块重新加工成 2 个块,如下所示:

if x > 1 and x < 11 and y == 2 then
  --Put some output message here or something so that you can see that it's entered this block of code and detected the cursor properly
    mon.setCursorPos(1,2)
    mon.clearLine()
  if Pulverizer == true then
    --Put another output message here so that you can see that Pulverizer is being evaluated as true
    mon.blit("Pulverizer","0000000000","eeeeeeeeee")
  elseif Pulverizer == false then
    --Put one last output message here so that if Pulverizer is being evaluated as false you'll know
    mon.blit("Pulverizer","0000000000","dddddddddd")
  end
Pulverizer = not Pulverizer
redstone.setOutput("right", Pulverizer)
end

如果您在我放置 cmets(灰色行)的位置插入调试消息,那么它应该可以帮助您缩小问题范围,因为您可以看到正在输入哪些 if 块,哪些没有。另一个好主意是在你执行Pulverizer = truePulverizer = false 之后立即输入一些代码,这将显示Pulverizer 的值。

我对 Computercraft 的特定语法不是很熟悉,所以我不确定您是否可以在聊天中显示消息或仅在显示器上显示消息以进行调试,但您明白了。每当您遇到无法缩小范围的问题时,请尝试在代码中放置调试消息,以便您可以准确地看到正在发生的事情并从那里开始工作。如果您发现更多信息,请随时发表评论,我会回来查看是否可以提供更多帮助。

希望对您有所帮助,周末愉快!

【讨论】:

  • 另外,if 块中的一些代码基本相同。 mon.setCoursorPos(1,2)mon.clearLine() 可以在边界检查下移动,而 redstone.setOutput("right", true)redstone.setOutput("right", false) 可以以 redstone.setOutput("right", Pulverizer) 的形式移动到两个 end 关键字之间,因为它与 @ 共享相同的布尔值987654334@.
  • 好吧,现在我只是觉得自己很愚蠢,不知道为什么我没有早点提出这些建议。您的建议已添加到帖子中。我还添加了一条线来反转 Pulverizer。如果我们真的在优化,我更愿意对 if 块使用三元比较来处理类似的单行内容。
  • 是的,我们可以使用三元比较。 mon.blit("Pulverizer", "0000000000", Pulverizer and "eeeeeeeeee" or "dddddddddd")。或者我们可以使用if Pulverizer then mon.blit("Pulverizer", "0000000000", "eeeeeeeeee") else mon.blit("Pulverizer", "0000000000", "dddddddddd") end。但这应该在否定Pulverizer之后出现。