-2

シンプルなトンネルマイニングタートルを作ろうとしています。マイニング中のカメの情報を表示してみました。たとえば、進行状況と燃料消費量です。

実際のトンネルをマイニングし、情報を表示するプロセス/機能は同時に実行する必要がありますが、現時点では実際には実行していません。

並列 API を使用しようとしていますが、思いどおりに動作しません。

これまでのコードは次のとおりです。

--Starting Conditions--
HeightQuestion = true
WidthQuestion = true
LengthQuestion = true
BlocksToMine =0
EstBlocksDone =0
BlocksDone =0
BlocksToDo =0
screen = 0


function FuncFuel()
    if turtle.getFuelLevel() < 10 then
        turtle.refuel()
        print("fuel level: " .. turtle.getFuelLevel() ..  "/".. turtle.getFuelLimit())
    else
        print("fuel level: " .. turtle.getFuelLevel().. "/".. turtle.getFuelLimit())
    end 
end

function FuncHeight()
    while (HeightQuestion == true) do -- Height Question
        print("Height of tunnel?")
        IniHeight = tonumber(read())
        if IniHeight == nil then
            print( "Please answer with a number." )
        elseif IniHeight >= 2 then
            HeightQuestion = false
        elseif IniHeight == 1 then
            print( "The tunnel Height must be larger than one." )
        elseif IniHeight == 0 then
            print( "The tunnel Height can't be infinite." )
        else
            print( "The tunnel Height must be positive." )
        end
    end
    Height=IniHeight
 end

function FuncWidth()
    while (WidthQuestion == true) do -- Width Question
        print("Width of tunnel?")
        IniWidth = tonumber(read())
        if IniWidth == nil then
            print( "Please answer with a number." )
        elseif IniWidth > 0 then
            WidthQuestion = false
        elseif IniWidth == 0 then
            print( "The tunnel Width can't be infinite." )
        else
            print( "The tunnel Width must be positive." )
        end 
    end
    Width=IniWidth
end

function FuncLength()
    while (LengthQuestion == true) do -- Length Question
        print("Length of tunnel?")
        IniLength = tonumber(read())
        if IniLength == nil then
            print( "Please answer with a number." )
        elseif IniLength > 0 then
            LengthQuestion = false
        elseif IniLength == 0 then
            LengthQuestion = false
            InfiniteLength = true
            TorchesQuestion = false
            TorchSpacingQuestion = false
        else
            print( "The tunnel Length must be positive." )
        end
    end
    Length=IniLength
end

function FuncDig()
    while turtle.detect()==true do
        turtle.dig()
        BlocksDone = BlocksDone+1
        sleep(0.5)
    end
end

function FuncDigUp()
    while turtle.detectUp()==true do
        turtle.digUp()
        BlocksDone = BlocksDone+1
        sleep(0.5)
    end
end

function FuncDigDown()
    while turtle.detectDown()==true do
        turtle.digDown()
        BlocksDone = BlocksDone+1
        sleep(0.5)
    end
end

function FuncRight()
    turtle.turnRight()
    FuncDig()
    turtle.forward()
    turtle.turnLeft()
end

function FuncLeft()
    turtle.turnLeft()
    FuncDig()
    turtle.forward()
    turtle.turnRight()
end

function FuncUp()
    FuncDigUp()
    turtle.up()
end

function FuncDown()
    FuncDigDown()
    turtle.down()
end

function FuncForward()
    FuncDig()
    turtle.forward()
end



function SetMineScreen()
    BlocksToMine = IniHeight*IniWidth*IniLength
    BlocksToDo = BlocksToMine-BlocksDone
    PercentageDone= EstBlocksDone*100/BlocksToMine
    if turtle.getFuelLevel() < 10 then
        turtle.refuel(1)
    end
    term.clear()
    print("    ----------MineBot----------    \n")
    print("    ---------ACTIVATED---------    \n")
    print("    Total Amount To Do: " .. BlocksToMine .. "\n")
    print("    Total Amount Done: " .. BlocksDone ..  "\n")
    print("    Estimated Done: " .. EstBlocksDone ..  "\n")
    print("    Progress : " .. PercentageDone .. "\n")
    print("    Fuel Level: " .. turtle.getFuelLevel() .. "/" .. turtle.getFuelLimit() .. "\n")
    print("    <-- previous      Next-->")
end

function MineScreenProcess()
    while true do
        SetMineScreen()
        sleep(0.5)
    end
end

function FuncTunnel()
    FuncFuel()
    Width = Width - 1
    Height = Height - 1 
    for i=1, Length do
        for i=1,Height do
            FuncUp()    
        end
        for i=1, Height / 2 do
            for i=1,Width do
                FuncDig()
                FuncRight() 
                EstBlocksDone = EstBlocksDone+1
            end
            FuncDig()
            EstBlocksDone = EstBlocksDone+1
            FuncDown()
            for i=1, Width do               
                FuncDig()
                EstBlocksDone = EstBlocksDone+1
                FuncLeft()  
            end
            FuncDig()
            EstBlocksDone = EstBlocksDone+1
            FuncDown()
        end
        if Height % 2 == 0 then
            for i=1,Width do
                FuncDig()
                EstBlocksDone = EstBlocksDone+1
                FuncRight()     
            end
            FuncDig()
            EstBlocksDone = EstBlocksDone+1
            for i=1, Width do               
                FuncDig()
                FuncLeft()  
            end
            FuncDig()
            EstBlocksDone = EstBlocksDone+1
        elseif Height % 2 == 1 then
            for i=1,Width do
                FuncDig()
                EstBlocksDone = EstBlocksDone+1
                FuncRight()     
            end
            FuncDig()
            EstBlocksDone = EstBlocksDone+1
            FuncDown()
            for i=1, Width do               
                FuncDig()
                FuncLeft()  
                EstBlocksDone = EstBlocksDone+1
            end
            FuncDig()
            EstBlocksDone = EstBlocksDone+1
        end
        FuncForward()
    end
    turtle.turnRight()  
    turtle.turnRight()  
    for i=1, Length do
        turtle.forward()
    end
    turtle.turnRight()  
    turtle.turnRight()  
end


FuncHeight()
FuncWidth()
FuncLength()

parallel.waitForAll(MineScreenProcess(), FuncTunnel())
--FuncDig()
4

5 に答える 5

1

ジョンがすでに言ったように

並列では、Yield 呼び出しを使用して、異なるスレッドを実行できるようにする必要があります。

これは、Computercraft API のほぼすべての関数で行われます。電話する必要はありませんcoroutine.yield()

MineScreenProcessあなたの関数とが正常に動作していると仮定するとFuncTunnel(私はそれらのコードをチェックしていませんでした)、parallel.waitForAll(...)最後に呼び出しているか、スクリプトを実行して実行を開始しています。それはすべて問題なく、必要です。しかし、あなたの主張は間違っています。

parallel.waitForAll(...)want は実行したい関数への「ポインタ」です。関数のポインタを引数として渡していません。関数の結果を渡しています。

変更してみることができます:

parallel.waitForAll(MineScreenProcess(), FuncTunnel())

に:

parallel.waitForAll(MineScreenProcess, FuncTunnel)
于 2015-12-04T11:05:15.603 に答える
-1

ComputerCraft で真の並列処理を行うことはできません。コルーチンは疑似並列処理を可能にしますが、それはあなたが得る限りです。

于 2016-01-11T22:31:26.837 に答える