コンピュータクラフトを極める その1

イメージ
Computer Craft は、プログラムを組み、採掘、整地、植林、建築などをタートルを動かして自動化していく究極のマイクラMODです。様々なプログラムを組み複数台のタートルに連携をさせていけば、大掛かりな自動システムも可能となります。

プログラム経験がないので、もっと効率よいプログラムもあるかもしれませんが、素人なりのひらめきで乗り切っていきたいと思います。


コンピュータークラフト 簡単なプログラム
Computer Craft のプログラムのチュートリアル。タートルの単純な作業の簡単なループプログラムです。地面に6ブロック設置、上にブロック積み上げていく、最高256段の階段を作って降りるなどの簡単なプログラムです。


コンピュータークラフト 豆腐建築
Computer Craft は、マイクラのワールドでプログラムを組んでタートルを動かすという一番とっつきにくいMODだといえますが、四角を積み上げていく豆腐建築プログラムは、初心者でも簡単にでき、達成感があるプログラムなので、導入編としては最適です。


コンピュータークラフト 外部エディタ Sublime Text
Computer Craft のプログラムの編集をマイクラのゲーム内で行うには、かなり無理があります。画面が小さいのでプログラム全体が見えない、日本語のプログラムの説明が記述できない、コピーペーストができないなどとても不便です。一文字違っただけで動かないのがプログラムです。書きやすさと読みやすさ、他の人が作ったプログラムの導入を考えたら外部エディタをお勧めします。


コンピュータークラフト Sublime Text 3 日本語化 無料で使えて高機能なプログラミングエディター SublimeText3「サブライムテキスト」のツールバーやプルダウンメニューを日本語化する方法です。このエディターは、メニューが多いんで多機能だと思われますが、残念ながらすべて英語です。プラグインを導入して日本語化します。難易度はかなり高めです。


コンピュータークラフト 地面にブロックを敷き詰める
Computer Craft でプログラム経験のない初心者が、どれだけのことができるかをやっていきたいと思います。床や天井にブロックを設置することを想定してプログラムしてみました。ただブロックを敷き詰めるだけなら簡単なんですが、コンフィグから縦と…

コンピュータークラフト 地面にブロックを敷き詰める その2

Computer Craft で床を作るプログラムです。コンフィグで縦と横のサイズを変更できることが特徴です。プログラミング未経験者ですが、コツをつかめば何とかなりそうなMODのコンピュータークラフト、というかマイクラ経験者はプログラムが好きなのでは・・・
使用MODは、ComputerCraft1.80pr1


前回の「地面にブロックを敷き詰める」は、渦巻き状に床を貼るプログラムでしたが、今回は折り返しながら床を貼っていきます。利点は終了時のタートルの位置がわかることです。当然この上に豆腐建築をタートルに作ってもらうことを想定したら、終わりがグダグダにならないこのプログラムの方が有利となります。



縦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

プログラム脱初心者を目指してシリーズ化しました。マイクラのMODをやりつくした人やこれからプログラムを始めたい人には、お勧めのサイトとなっています。思い通りにタートルが動いたときは、きっと感動するでしょう。

コメント

関連コンテンツ

リンク

このブログの人気の投稿

マイクラ1.12.2、銃追加MODの導入、日本語化

まな板プラスの導入

マイクラ1.12.2、ピクセルモンMOD

ピクセルモンの伝説モンスター出現率を上げる設定、バニラMOBを湧かせる設定

はりぼてエアクラフト

マイクラ1.12.2、抜刀剣の導入

最強になった、まな板プラス

ドラゴンメイドMOD

ピクセルモンジェネレーションズの導入

五つの難題MOD