2019年7月4日木曜日

スロットを管理して最大値までの床

床を作るプログラムです。その3 、今回のプログラムは、チェストから燃料とブロックを補給して床を貼っていきます。タートルは横方向に2ブロック分ブロックを設置したら燃料とブロックを補給にチェストに向かいます。
タートルのスロット変更が上手くいかなかったので、範囲は無限にはできませんでした。
最大範囲は縦が256(4の倍数)
横が無限?(2の倍数)となっています。

当然ブロックが足りなくなりますが、採掘用のタートルに丸石を掘ってもらうことを想定しています。今回のタートルの動きをは、露天掘りプログラムにも応用できます。

64x54の床貼りプログラム、最大256まで対応


ラージチェストをブロックで埋め尽くしたら上図のようになります

今回のプログラムの考え方

設置するだけのブロックをチェストから補充
設置のループで使用するタートルのスロットを変更
スタート位置に戻るための「local COUNT=」の定義

256x256のサイズの丸石の設置です
タートルの横にラージチェストを2か所配置
タートルのインベントリは空の状態です


タートルの隣は木炭


もう一つを丸石で埋め尽くします


まずは燃料補給と丸石を補給


タートルは縦方向にブロックを設置しながら進み、折り返してブロックを設置しながら戻ってきます

横に2ブロック分設置するごとに燃料とブロックの補給を行います


丸石の補充をしていないので3456ブロックで止まりました
256x256=65536の丸石が必要となります
採掘タートルに丸石を補充させる予定です



--####コンフィグ####

local VERTICAL=64--縦のサイズ、デフォルト64、最大256、4の倍数
local SIDE=54--横のサイズ、デフォルト54、最大54、2の倍数
local COUNT=0--横に進んだブロック数

--####関数FORWARDPLACE####

function FORWARDPLACE()--関数FORWARDPLACEの定義


--奇数列を進みながらブロックを設置
for A=1,4 do--ループAは、ループBを4回まで実行
  turtle.select(A)--スロットは、ループAを選択
  for B=1,VERTICAL/4 do--ループBは、1~縦のサイズの4分の1まで実行
      turtle.placeDown()--下にブロックを設置
      turtle.forward()--前に行く
  end--ループBの終わり
end--ループAの終わり

--列を移動する
turtle.turnRight()--右を向く

if turtle.forward() then--もしも前に行くのに成功したら
      COUNT=COUNT+2--COUNTに+2
end--もしもの終わり

turtle.turnRight()--右を向く

--偶数列を戻りながらブロックを設置
  for C=1,4 do--ループCは、ループDを4回まで実行
    turtle.select(C+4)--スロットは、ループC+4を選択
    for D=1,VERTICAL/4 do--ループDは、1~縦のサイズ4分の1まで実行
      turtle.forward()--前に行く
      turtle.placeDown()--下にブロックを設置
      end--ループDの終わり
  end--ループCの終わり

  return COUNT--戻り値COUNTの+2を反映

end--関数のFORWARDPLACEの終わり

--####メインの処理####

--タートルが動き出すための燃料の補給
turtle.turnLeft()--左を向く
turtle.select(9)--スロット9を選択
turtle.suck(1)--燃料をチェストから1補給
turtle.refuel()--タートルに燃料を補給
turtle.up()--上に行く

--チェストから燃料とブロックを補給
for E=1,SIDE/2 do--ループEは、1~SIDEの2分の1まで実行

--チェストから燃料を補給
  turtle.select(9)--スロット9を選択
  turtle.forward()--前に行く
  turtle.suckDown(10)--チェストから燃料を10補給
  turtle.refuel()--タートルに燃料を補給
  turtle.forward()--前に行く
  turtle.forward()--前に行く

--チェストからスロット8までブロックを補給
for F=1,8 do--ループFは、1~8回まで実行
  turtle.select(F)--スロットは、ループFを選択
  turtle.suckDown(VERTICAL/4)--チェストからVERTICALの4分の1を補給
end--ループFの終わり

--スタート位置に戻る
  turtle.turnRight()--右を向く
  turtle.turnRight()--右を向く
  turtle.forward()--前に行く
  turtle.forward()--前に行く
  turtle.forward()--前に行く

--次のブロック設置場所まで進む
  for G=1,COUNT do--ループGは、1~COUNTまで実行
    turtle.forward()--前に行く
  end--ループGの終わり

  turtle.turnLeft()--左を向く

  FORWARDPLACE()--関数FORWARDPLACEの実行

  turtle.turnRight()--右を向く

--スタート位置まで戻る
  for E=1,COUNT-1 do--ループCは、1~COUNT-1まで実行
    turtle.forward()--前に行く
  end--ループEの終わり

end--ループCの終わり

turtle.turnRight()--右を向く




プログラムの内容(縦12で説明です)

タートルのスタート位置は、1

燃料の補給

メインのループの開始

  燃料のチェストで燃料の補給(タートルスロット9)
  ブロックのチェストでブロックを補給
  スロット1から8まで(local VERTICAL=の4分の1の数)
  
  タートルのスタート位置の、1に戻る
  
  ブロックの設置に移動(2回目以降)

  行きのブロックの設置   
    1・2・3のブロックの設置(スロット1)
    4・5・6のブロックの設置(スロット2)
    7・8・9のブロックの設置(スロット3)
    10・11.・12のブロックの設置(スロット4)
  
  2番目の列に13の位置に移動(COUNT+2)
  
  戻りのブロックの設置   
    13・14・15のブロックの設置(スロット5)
    16・17・18のブロックの設置(スロット6)
    19・20・21のブロックの設置(スロット7)
    22・23・24のブロックの設置(スロット8)
  
  タートルのスタート位置の、1に戻る

ループの終わり

右を向く

1段目の4スロットを行きのブロック設置に使用します
2段目の4スロットを戻りのブロック設置に使用します
スロット9以降を燃料で使いますがスロットに残らないようにします
(木炭、石炭1個で80ブロック進めます、またタートル内に燃料は蓄積されます)

プログラムのルール

  • ブロックのスロットは8までを使用します
  • スロット9~16は、念のために燃料で使用します
  • タートルの燃料が満タンで不具合が起こる可能性がります
  • 溶岩バケツはバケツが残るので使用できません
  • 範囲設定は縦(最大256で4の倍数)横(2の倍数で無限)
  • 任意の設定文字は大文字で設定しています


範囲を固定でプログラムを考えるとタートルの各動作の終わった位置のわかりやすいので、プログラムの作成は、かなり楽になるんですが、脱初心者を目指したいので範囲を可変式でプログラムを考えています。

おまけ
ローマ字が世界最強の英語だと思っているんですが、とりあえず調べました。

英語のサイズ関係の表記

  • 大きさ=Size
  • 縦(奥行)=Depth
  • 横(幅)=Width
  • 横(幅)=Breadth
  • 高さ=Height
  • 深さ=Depth
  • 長さ=Length
  • 垂直(直立)=Vertcal
  • 側面=Side
  • 体積=Volume
  • 直径=Diameter
  • 円周=使うことがない

縦(奥行)と深さが同じ「Depth」・・・
これからはこれで統一します

縦(奥行)=Length
横(幅)=Width
高さ=Height
深さ=Depth

関連サイト

0 件のコメント:

コメントを投稿