床を作るプログラムです。コンフィグで縦と横のサイズを変更できることが特徴です。プログラミング未経験者ですが、コツをつかめば何とかなりそうなMODなのでは、マイクラ経験者はプログラムが好きなのでは・・・
前回の「地面にブロックを敷き詰める」は、渦巻き状に床を貼るプログラムでしたが、今回は折り返しながら床を貼っていきます。利点は終了時のタートルの位置がわかることです。当然この上に豆腐建築をタートルに作ってもらうことを想定したら、終わりがグダグダにならないこのプログラムの方が有利となります。
縦32x横(2x12)=総ブロック数768
タートルの動きは遅いんですが、それがいい!いつまでも眺めていられます。
ビルドクラフトのクアーリーの動きや、工業MODでアイテムの流れていく様子を眺めてニヤニヤするような気分と同じです。
アイテムスロットは1から12までがブロック、16に燃料
全てのスロットをブロックで使うと最大32x32=1024となります
1から12まで12個のブロックを設置します
turtle.select(16)--スロット16を選ぶ(スロット16に燃料を入れています)
turtle.refuel()--燃料を補給
turtle.select(1)--スロット1を選ぶ(スロット1から15にブロックを入れています)
turtle.up()--1段上に上がる
turtle.placeDown()--下にブロックを置く
turtle.forward()--前に行く
turtle.placeDown()--下にブロックを置く
turtle.forward()--前に行く
turtle.placeDown()--下にブロックを置く
turtle.turnRight()--右を向く
turtle.forward()--前に行く
turtle.turnRight()--右を向く
turtle.placeDown()--下にブロックを置く
turtle.forward()--前に行く
turtle.placeDown()--下にブロックを置く
turtle.forward()--前に行く
turtle.placeDown()--下にブロックを置く
turtle.turnLeft()--左を向く
turtle.forward()--前に行く
turtle.turnLeft()--左を向く
turtle.placeDown()--下にブロックを置く
turtle.forward()--前に行く
turtle.placeDown()--下にブロックを置く
turtle.forward()--前に行く
turtle.placeDown()--下にブロックを置く
turtle.turnRight()--右を向く
turtle.forward()--前に行く
turtle.turnRight()--右を向く
turtle.placeDown()--下にブロックを置く
turtle.forward()--前に行く
turtle.placeDown()--下にブロックを置く
turtle.forward()--前に行く
turtle.placeDown()--下にブロックを置く
 
これだけの項目が必要となります、さらにブロックを増やすととても長いプログラムになります。そこで繰り返しの処理を簡略化して、さらに関数化することで、プログラムを読みやすくします。
プログラムを考えるときは、専用のエディターよりもエクセルの方が断然やりやすいです。セルのコピー、ペーストがビジュアルエディターのように使えます。
繰り返しの動作を探して for 文で、ループカウンターの定義
for␣変数名=開始値,終了値␣do
  処理内容
end
1の目のブロックを置いた後の「前に行く、2のブロックを置く」この動作をループカウンターを定義して2,3のブロックを置くようにします。変数名は「A」とします。
turtle.placeDown()
--1のブロックを置く
turtle.forward()
--2に移動
turtle.placeDown()
--2のブロックを置く
turtle.forward()
--3に移動
turtle.placeDown()
--3のブロックを置く
    ↓
turtle.placeDown()
--1にブロックを置く
for A=1,2 do--変数「A」は、1から2回まで実行
    turtle.forward()--前に行く
    turtle.placeDown()--下にブロックを置く
end--変数「A」の定義はここまで
1のブロックを置いた後、「A」の処理で2,3のブロックを置きます
プログラム1
turtle.select(16)
  
turtle.refuel()
  
  
turtle.select(1)
  
  
turtle.up()
  
  
turtle.placeDown()
  
for A=1,2 do  
    turtle.forward() 
    turtle.placeDown() 
end  
  
turtle.turnRight()
  
turtle.forward()
  
turtle.turnRight()
  
  
turtle.placeDown()
  
for A=1,2 do  
    turtle.forward() 
    turtle.placeDown() 
end  
  
turtle.turnLeft()
  
turtle.forward()
  
turtle.turnLeft()
  
  
turtle.placeDown()
  
for A=1,2 do  
    turtle.forward() 
    turtle.placeDown() 
end  
  
turtle.turnRight()
  
turtle.forward()
  
turtle.turnRight()
  
  
turtle.placeDown()
  
for A=1,2 do  
    turtle.forward() 
    turtle.placeDown() 
end  
↑ここまで
ブロック設置数を多くしたときに繰り返しの動作をループカウンターを定義することで、プログラムの簡略化ができます。
例:6ブロックの設置
turtle.forward()
turtle.placeDown()
turtle.forward()
turtle.placeDown()
turtle.forward()
turtle.placeDown()
turtle.forward()
turtle.placeDown()
turtle.forward()
turtle.placeDown()
turtle.forward()
turtle.placeDown()
for 文でループカウンターとする
for A=1,6 do
--終了値を「6」とします
    turtle.forward()
    turtle.placeDown()
end
ブロック設置を関数として定義してより分かりやすく
a の列、b の列、 c の列、d の列のブロックを設置する処理を関数で定義します。
function␣定義名()
  処理内容
end
1のブロックを置く動作とループカウンター「A」を関数「OKU()」で定義します
turtle.placeDown()
for A=1,2 do
    turtle.forward()
    turtle.placeDown()
end
   ↓
function OKU()--関数名「OKU()」
    turtle.placeDown()
    for A=1,2 do
        turtle.forward()
        turtle.placeDown()
    end
end--関数「OKU()」の定義はここまで
それぞれの列のブロックを置く処理を関数「OKU()」とすることで簡略化できます
プログラム2
function OKU() 
    turtle.placeDown()
    for A=1,2 do
        turtle.forward()
        turtle.turnRight()
    end
end
turtle.select(16)
turtle.refuel()
turtle.select(1)
turtle.up()
OKU()
turtle.turnRight()
turtle.forward()
turtle.turnRight()
OKU()
turtle.turnLeft()
turtle.forward()
turtle.turnLeft()
OKU()
turtle.turnRight()
turtle.forward()
turtle.turnRight()
OKU()
↑ここまで
列の移動を関数として定義してより分かりやすく
右を向く、前に行く、右を向く、この動作を関数 MIG() で定義します
turtle.turnRight()
--右を向く
turtle.forward()
--前に行く
turtle.turnRight()
--右を向く
   ↓
function MIGI()
--関数名「MIGI()」
    turtle.turnRight()
    turtle.forward()
    turtle.turnRight()
end
--関数「MIGI()」の定義はここまで
左を向く、前に行く、左を向く、この動作を関数 HIDARI() で定義します
turtle.turnLeft()
--左を向く
turtle.forward()
--前に行く
turtle.turnLeft()
--左を向く
   ↓
function HIDARI()
--関数名 HIDARI()
    turtle.turnLeft()
    turtle.forward()
    turtle.turnLeft()
end
--関数「HIDARI()」の定義はここまで
プログラム3
function OKU()
  
    turtle.placeDown()
 
    for A=1,2 do
 
        turtle.forward()
        turtle.placeDown()
    end
 
end
  
  
function MIGI()  
    turtle.turnRight() 
    turtle.forward() 
    turtle.turnRight() 
end  
  
function HIDARI()  
    turtle.turnLeft() 
    turtle.forward() 
    turtle.turnLeft() 
end  
  
turtle.select(16)
  
turtle.refuel()
  
  
turtle.select(1)
  
  
turtle.up()
  
  
OKU()
  
MIGI()  
OKU()
  
HIDARI()  
  
OKU()
  
MIGI()  
OKU()
  
列を abcd= (ab)x2
このように考えて横のブロック数のループカウンターを定義します。そのためには、最後に関数 HIDARI() を付け加え、13の位置に移動することが必要となります。余分な動きとなりますが、これがあるのとないのでは、プログラムが大きく変わってきます。
OKU()
MIGI()
OKU()
HIDARI()
OKU()
MIGI()
OKU()
HIDARI()
a 列にブロックを置き、右回りで b 列に移動、b 列にブロック置き、左回りで c 列に移動、この動作をループカウンターを定義して「ab」「cd」のブロックを置くようにします。変数名は「B」とします。
for B=1,2 do
--変数「B」は、1から2回まで実行
    OKU()
--a 列のブロックを置く
    MIGI()
--右回りで b 列に移動
    OKU()
--b 列のブロックを置く
    HIDARI()
--左回りで c 列に移動
end
--変数「B」の定義はここまで
プログラム4
function OKU()
   
    turtle.placeDown()
  
    for A=1,2 do
  
        turtle.forward()
 
        turtle.placeDown()
 
    end
  
end
   
   
function MIGI()
   
    turtle.turnRight()
  
    turtle.forward()
  
    turtle.turnRight()
  
end
   
   
function HIDARI()
   
    turtle.turnLeft()
  
    turtle.forward()
  
    turtle.turnLeft()
  
end
   
   
turtle.select(16)
   
turtle.refuel()
   
   
turtle.select(1)
   
   
turtle.up()
   
   
for B=1,2 do   
    OKU()  
    MIGI()  
    OKU()  
    HIDARI()  
end   
↑ここまで
アイテムスロットを最大限活用してより大きなサイズに対応
アイテムスロットを a 列と b 列のブロック設置後にスロットを変更します。
for 文の「B」という変数を turtle.select(B) とすることで1回目の処理でスロット1、2回目の処理でスロット2、3回目で3、4回目で4とスロットを切り替えていきます。
for B=1,2 do
    
turtle.select(B)--ループの回数で変数「B」の数は増えていきます
    OKU()
    MIGI()
    OKU()
    HIDARI()
end
コンフィグを設置して縦と横のサイズを自由に変更
local 変数=数値
ループカウンター「A」の終了値に「TATE」の定義をいれます
local TATE=3--縦のブロック数をTATEと定義
function OKU()
    turtle.placeDown()
--ひとつ目のブロックを置く
    for A=1,TATE-1 do--ひとつ目は置いてあるので縦の列はTATE-1
        turtle.forward()
        turtle.placeDown()
    end
end
ループカウンター「B」の終了値に「YOKO」の定義をいれます
local YOKO=2--横のブロック数をYOKOと定義
for B=1,YOKO/2 do--1回の処理で2列分なのでYOKO/2
turtle.select(B)
    OKU()
    MIGI()
    OKU()
    HIDARI()
end
完成したプログラムでタートルを動かす
スロット1,2にブロックを入れ、スロット16に燃料(溶岩バケツ)を入れます
edit␣プログラム名、エンター
※.lua は拡張子なので入力しなくてOKです
プログラム中の文字化けは、説明文です。「--」で始まる文字は無効となります。
完成したプログラム
コンフィグ(local)の数値を入力することで縦と横のサイズを変更できます
--##コンフィグ##--
local TATE=3--縦方向のブロック数「TATE」を定義
local YOKO=4--横方向のブロック数「YOKO」を定義
--##1列のブロックを置く関数##--
function OKU()--関数名「OKU()」を定義
    turtle.placeDown()--先頭のブロックを置く
    for A=1,TATE-1 do--変数「A」は、1から終了値「TATE-1」まで実行
        turtle.forward()--前に行く
        turtle.placeDown()--ブロックを下に置く
    end--ループ「A」は、ここまで
end--関数「OKU()」は、ここまで
--##右回りで隣の列に移動する関数##--
function MIGI()--関数名「MIGI()」を定義
    turtle.turnRight()--右を向く
    turtle.forward()--前に行く
    turtle.turnRight()--右を向く
end--関数「MIGI()」は、ここまで
--##左回りで隣の列に移動する関数##--
function HIDARI()--関数名「HIDARI()」を定義
    turtle.turnLeft()--左を向く
    turtle.forward()--前に行く
    turtle.turnLeft()--左を向く
end--関数「HIDARI()」は、ここまで
--##メインの処理##--
turtle.select(16)--スロット16を選択
turtle.refuel()--燃料補給
turtle.select(1)--スロット1を選択
turtle.up()--上に上昇
for B=1,YOKO/2 do--変数「B」は、1から終了値「YUKO/2」まで実行
    turtle.select(B)--スロット「B」を選択、ループ回数毎に1,2,3,4…と増える
    OKU()--1列のブロックを置く関数
    MIGI()--右回りで隣の列に移動する関数
    OKU()--1列のブロックを置く関数
    HIDARI()--左回りで隣の列に移動する関数
end--ループ「B」は、ここまで
 
↑ここまで
タートルを実際に動かしてみます
3x4のブロックを設置、最後に方向転換をして次の列に移動
成功です
説明がグダグダで上手くいってないような気がしますが・・・
考えて実践のループが大事だと思います。
for A=1,∞ do
    考えて
    実践
end
関連サイト