Minecraftとタートルと僕

PCゲームMinecraftのMOD「ComputerCraft」の情報を集めたニッチなブログです。

こちらのページは更新が滞っており、情報が古くなりつつあります。新しいCC情報サイトをはじめましたので、もしよければご参照ください。今後ともよろしくお願い申し上げます。

「百億のマインクラフトと千億のタートル」(https://hevo2.hatenablog.com/)

なぜプログラミングを学ぶことが必要なのか

はじめに

中学生たちに「なぜプログラミングが必要なのか」を教えてみた - WirelessWire News(ワイヤレスワイヤーニュース)

この記事を読んでの感想になります。

将来的に3Dプリンタが家庭内で普通に使われる時代には、きっとプログラミングの必要ないUIができているはずです。 テレビがリモコン一つで操作できるように、電子レンジが前面のパネルボタンだけで操作できるように、炊飯器がボタン一発でおいしいご飯を炊くように。逆にそうでないと、家電として家庭内に3Dプリンタが普及するわけがありません。

しかし、テレビのリモコンボタンの数が増え操作が複雑になる一方であることからわかるように、シンプルなUIで家電の機能の全てを引き出すというのは無理があります。

紹介記事中にある、

プログラミングをできるようになるということは、人類の叡智を利用できるようになるということ

は至言です。

プログラミングの必要ない便利なUIは、しょせん叡智の上澄みでしかなくて、より深い、最先端に近いところに触れるにはプログラミングができることが重要です。

言い方を変えると、プログラミングを学ぶことは、出来合いのモノをただ使うだけでなく、より深く使いこなすことに通じます。場合によっては、開発者の想定すら超えて新しいモノを作り出すことにつながるかもしれません。

つまり、プログラミングを学ぶことは、与えられたモノを使う側から、モノを作る側になれることが重要なのです。

全ての人間が「モノを作る側」になる必要性

ここまで考えたときに問題になるのが、全ての人間がクリエイターになる必要があるのかという問いです。

ここでは反感を買うことを恐れず、あえて断言しましょう。

必要があります。

そうでなければ、将来は悲観的なビジョンしか見えません。 クリエイターという言葉に抵抗があるならこう言い換えましょう。

創造性のある仕事ができない人は、これからの世の中ではきつくなる一方である。

最近、人工知能が話題になっているのはご存知でしょう。狭義の人工知能(人と同等の知)はまだ遠い未来ですが、広義の知(これまでできなかったような、かしこい便利な機能)はすでに様々な分野で実現し利用されつつあります。

クリエイティブでない、簡単な人工知能で代替できることしかできない人は、将来的にその位置を失うことになるでしょう。これは断言します。

とはいえ、このことはみんなうすうす気づいていますよね。

我が国が目指す教育目標に「創造性」という項目が昔からありますが、「モノづくり日本」という言葉に真っ向から反対する人なんていないでしょう?

知的不均等構造を持つデストピア

僕の大好きな、小島アジコ氏はこう言ってます*1

いまから20年後、有能な1%の人間がモノとシステムを作り、4%のコミュニケーション強者がその上前を撥ね、残りの95%がそのおこぼれで生活する時代がやってくる。

なんというデストピア。なんて狂った社会構造。でも、こんな将来が来ることを否定できない自分もいます(すでにそうなっているという説もある)。

でもこのデストピア、何が不満で何が不幸なのでしょう。

僕は知的不均等構造に注目します。

個人の意思と知についての尊厳、つまりはお釈迦様の手の上で踊る自分を許容できるかというプライドの問題です。

もちろん、これを何とも思わない人は少なからずいると思います。あるいは目をそむけ、あきらめている人も。逆に、すでに搾取する側いるので、ライバルを増やしエサが減るのを嫌がる人もいるかもしれませんね:P

プログラミング教育でモノとシステムを深く使いこなす人材を増やすことで、この偏りが少しでも均(なら)された社会を目指しましょう。

デストピアがリトルデストピアくらいになり、少しはましになるのではないでしょうか*2

基礎教養としてのプログラミング

プログラミング教育は、創造性教育の一環でもあります。創造的なプロダクトを生成する技術の習得といってもかまいません。

とはいえ、プログラム言語を駆使して一から完成品を作り出すまでの能力を育てることは難しいかもしれません*3。与えられたモノを使いこなし、ときには複数のモノを結び付けたり、たまに開発者の想定から飛び出すくらいが現実的な落としどころでしょう。

しかし、小さいころからプログラミングを駆使してモノを使いこなす人たちを増やすことで、将来的にモノを作り出す人たちが数多く生まれてくるはずです。

そのためには、子どものころからプログラミングに慣れ親しむ機会を増やしましょう。プログラミングでモノを使いこなすことを覚えさせましょう。 そしてできるならば、全ての子どもに、プログラミングで創造的なモノを生み出す喜びを体験させましょう。

プログラミングを駆使する「モノ使いこなし層」を厚くし、「モノづくり予備軍」を育てることが、これからの日本には必要となります。

つまり、プログラミングが基礎教養となる時代がすでにやってきているのです。

なお、創造性教育という点で、プログラミングだけを押す必要はないと思っています。教科「芸術」は履修時間数を増やすべきだし、他の一般教科においても「創造的なモノを生み出す」教養を意識すべきだと思います。

しかしこれらの教養の中でも、プログラミングはこれからの日本で生きる上で特に重要な基礎教養だと僕は確信しています。

*1:この言葉は半分ネタであり、釣りタイトルであることは理解しております。みなさんもご了承ください。我ながらネタにマジレスかっこわるいw

*2:つまり、このデストピアの到来自体は否定しない、できない。

*3:つまりここでは、義務教育期間において職業プログラマーを養成することを謳っているわけではない。

【公式】タートルにinspect関数【チート】

はじめに

ひさしぶりの更新です。

今回は、最新のComputerCraft1.65で追加されたタートル関数をご紹介します。

このバージョンのCCは、Minecraft1.7.10でしか動かないのでご注意ください。

新しく追加された強力な関数

記事タイトルが過激ですが、そのくらい新しく追加された関数が強力であるとご理解ください。

一言でいうと、「目の前のブロックの名前がわかる」関数、「インベントリ内のアイテムの名前がわかる」関数です。

CC初心者の方でしたら、「え、いままでそんな基本的な関数がなかったの?」と思うかもしれませんが、CCのプログラムをいくつか書いたことがある方、本Webサイトを普段から閲覧されている方であるならば、ある種の衝撃を受けることでしょう。

「今までの苦労っていったい・・・。この機能、強力すぎない?」と。

turtle.inspect() の紹介

気を取り直して、新しく追加された関数の使い方を紹介しましょう。

まずは、目の前にあるブロックの名前(とメタデータ)を調べるturtle.inspect()関数です。

下画像のように、タートルの目の前にブロックを設置しましょう。ここでは土ブロックを置いています。

f:id:hevohevo:20150125023414p:plain

次にタートルを右クリックしてターミナルを開き、luaと打ち込みエンターキーを押すことで、Luaインタラクティブモードに入ります。

そして表示されるプロンプト(促し)に、turtle.inspect()と打ち込みましょう。

f:id:hevohevo:20150125023639p:plain

エンターキーを押して、turtle.inspect()を実行すると以下のような表示になります。

f:id:hevohevo:20150125023644p:plain

つまり、目の前にブロックがあり、その名前がminecraft:dirtでありメタデータが0であることを示しています。

前回の記事で紹介したように、マインクラフトのブロックは、ユニーク(一意な)名前を持っています。

Modの設定ファイルに他Modのアイテム・ブロック名を追加する方法 - Minecraftとタートルと僕

バニラの(素の)マインクラフトのブロックは、minecraft:XXXX(XXXXはブロック名)という名前を持っていることが特徴ですね。

また、土ブロックはメタデータを使っていないので0と表示されていますが、たとえば羊毛ブロックなどはメタデータで色の違いを示しています。

これまでのCCでは、目の前にブロックがあるかないかくらいしか判別できなかったので、これは大きな進歩と言えるでしょう。

turtle.inspect()関数の仕様

turtle.inspect()関数の仕様は以下の通りです。

  • turtle.inspect()
    • 目の前にブロックがあるかどうか、そしてその名前など詳細を調べる。
    • 返値は2つ
      • 返値1: ブロックがあるならばtrue、なければfalse
      • 返値2: ブロックがあるならばその詳細情報をテーブルで返す。ないならば、エラー文字列「No block to inspect」を返す

ブロック詳細情報テーブルの例

{
    name = "minecraft:dirt",
    metadata = 0,
}

なお、類似関数として、turtle.inspectUp()turtle.inspectDown()もあります。これらは、タートルの真上や真下のブロックを調べる関数になります。

サンプルコード

turtle.inspect()関数を使ったサンプルコード

-- 5秒おきに目の前のブロックの情報を調べ、表示する。
while true do
  local status, value = turtle.inspect() -- 2つの返値をそれぞれの変数に代入

  if status then -- ブロックありを1番目の返値で判別
    -- valueがテーブルなのでその情報を表示
    print("name: ",value["name"])
    print("meta: ",value["metadata"])
  else -- ブロックなし
    print("error: ",value) -- エラー文字列表示
  end

  os.sleep(5) -- 5秒スリープ
end

実行結果(最初はブロックを置かず、しばらくしてから土ブロック設置)

f:id:hevohevo:20150125030545p:plain

おわりに

目の前にあるブロックの名前がわかるようになることで、これまで作ってきたプログラムが一気に古臭くなってしまいました。

たとえばこの関数を使うことで、以下のようなプログラムが組めるかもしれません。

  • 目の前のブロックが丸石ブロックならばインベントリに入れずにそのまま放棄
  • 物理的に採掘できないブロックに突き当たったので名前を調べたら岩盤(minecraft:bedrock)だったので、採掘を進める方向を変えた。
  • 目の前のブロックを調べたら水ブロック(minecraft:water)だったので、持っているバケツを使って汲み上げた。

夢が広がりますね!

次回は、もう一つの強力な関数turtle.getItemDetail(スロット番号)を紹介しましょう。

この関数もまた、今回紹介したinspect関数に負けないくらいチートな性能なんですよ!

お楽しみに。

Modの設定ファイルに他Modのアイテム・ブロック名を追加する方法

はじめに

MinecraftでModを入れて遊ぶときに、その挙動を変えるために設定ファイルを書き換えることがあります。

Modの設定ファイルは「GameDir」フォルダにある「config」フォルダに入っていますので、 ファイルをメモ帳などで開き、該当項目を書き換え、ファイル保存、ゲームを起動することでModの挙動を変えることができます。

※「GameDir」フォルダやその開き方については以下の記事を参照してください。

変更例(MineAllの場合)

以下は、みんな大好き、ブロック一括破壊Mod「MineAll」の設定例です。

私の環境では、Minecraft1.7.10で「mod_MineAllSMP_v2.6.0.zip」を使っているので、 設定ファイルは、「net.minecraft.scalar.mineall.mod_MineAllSMP.cfg」になります。

その中身は以下のとおりです。なお以下の括弧書きは僕の注釈です。

# Configuration file

general {
    # Boolean: false (一括破壊でドロップするアイテムを自動的に集めるか)
    B:AutoCollect=false

    # Boolean: true (自分の立ち位置よりも下のブロックを破壊するか)
    B:DestroyUnder=true

    # Boolean: false (ドロップする大量のアイテムをひとまとめにするか)
    B:DropGather=false

    # Integer: 0 (ブロック破壊したときに使ったアイテムの耐久度を減らすか)
    # 0:not decrease durability 1,2:decrease durability(1=until whole blocks 2=until break an item)
    I:Durability=0

    # String: "KEY_M" (MineAllのON/OFFを切り替えるキー)
    S:Key=KEY_M

    # Integer: 0 (一度に破壊するブロック数の制限、0なら無制限?)
    I:Limiter=0

    # Boolean: true (ゲームスタート時にMineAllをONにするか)
    B:StartMode=true

    # String: "gold_ore, iron_ore, coal_ore, lapis_ore, obsidian, diamond_ore, redstone_ore, lit_redstone_ore, glowstone, emerald_ore, quartz_ore" (一括破壊対象とするブロック名)
    S:blockIds=gold_ore, iron_ore, coal_ore, lapis_ore, obsidian, diamond_ore, redstone_ore, lit_redstone_ore, glowstone, emerald_ore, quartz_ore

    # String: "mod_MineAll" (不明)
    S:channelName=mod_MineAll

    # String: "iron_pickaxe, wooden_pickaxe, stone_pickaxe, diamond_pickaxe, golden_pickaxe" (一括破壊が有効となるツール。ツルハシなど)
    S:itemIds=iron_pickaxe, wooden_pickaxe, stone_pickaxe, diamond_pickaxe, golden_pickaxe
}

まず基本的な知識として、「#」で始まる行はコメント行であること、そしてB:AutoCollect=falseという項目ならば、「=」の右側の値だけを書き換えることを押さえておきましょう。

右側の値として何を受け付けるかはそのModによって異なります。

MineAllでは、その直前の行でどのような値を受け付けるか、そしてデフォルト値(最初の値)は何であるかも例示してあります。親切ですね。

たとえば以下の例であれば、設定項目「B:AutoCollect」の値としてBoolean、すなわちtrueあるいはfalseを受け付けることがわかります。そしてデフォルト値がfalseであることも。

# Boolean: false (一括破壊でドロップするアイテムを自動的に集めるか)
B:AutoCollect=false

もし、ドロップするアイテムを自動的に入手したいならば、B:AutoCollect=trueに書き換えましょう。

次に本題の、一括破壊対象とするブロックや一括破壊ができるようになるツールを追加する方法を説明しましょう。

設定ファイルにブロック名・アイテム名を追加する

一言でいうならば、該当項目にブロック名・アイテム名を追加するだけです。

ただし、名前は「ユニークネーム」(ゲーム内で登録されているブロック・アイテムの正式名称)でなければなりません。

バニラの(Modを追加していない素のマイクラの)ブロックであれば簡単です。以下のページを参照してください。

たとえばエメラルドブロックならば、ユニークネーム(上記ページではIDと呼んでいます)は「emerald_block」ですので、項目「S:blockIds」の末尾に追加しましょう。

「,」区切りなのでお忘れなく。

S:blockIds=gold_ore, iron_ore, coal_ore, lapis_ore, obsidian, diamond_ore, redstone_ore, lit_redstone_ore, glowstone, emerald_ore, quartz_ore, emerald_block

このようにバニラのブロックであれば色々なWebページで紹介されているので問題ないのですが、自分で追加したModのブロック・アイテムだと問題が複雑になります。

正式名称(ユニークネーム)が何であるかを自分で調べないといけないのですから。

Modで追加されたブロック・アイテムの正式名称を調べる

調べるもっとも簡単な方法は、ゲーム内の全てのブロック・アイテムの名称をファイルに出力してくれるModを入れることです。

ここでは、のと氏のIDCheckerを使った例を紹介しましょう。

上記サイトから該当するModファイル(たとえば、IDChecker-1.7.10b.jarなど)をダウンロードし、自分の「GameDir」にある「mods」フォルダに放り込みましょう。これでModインストール完了です。

そしてゲームを起動しましょう。無事タイトル画面まで表示されたらOKです。そのままゲーム終了してかまいません。

このModはゲームを起動することで、ゲーム内の全てのブロック・アイテムの名前などの情報をファイルに書き出してくれます。

「GameDir」に「IDChecker」というフォルダが増えているのにお気づきでしょうか、そのフォルダの中を覗いてください。

f:id:hevohevo:20150117222129p:plain

この中の、「BlockList.txt」「ItemList.txt」が重要です。まずは「BlockList.txt」ファイルをダブルクリックするなどして、メモ帳で開いてみましょう。

以下は僕の環境の例です。

/////////////////////////////////////

Block List
2015/1/17 21:2:26

/////////////////////////////////////

ID,RegisterName,UnlocalizedName,LightLevel,OpacityLevel
0,minecraft:air,tile.air,0,0
1,minecraft:stone,tile.stone,0,255
2,minecraft:grass,tile.grass,0,255
3,minecraft:dirt,tile.dirt,0,255
4,minecraft:cobblestone,tile.stonebrick,0,255
5,minecraft:planks,tile.wood,0,255
6,minecraft:sapling,tile.sapling,0,0
・
・
途中省略
・
・
191,Mekanism:SlickPlasticBlock,tile.SlickPlasticBlock,0,255
192,Mekanism:GlowPlasticBlock,tile.GlowPlasticBlock,0,255
193,Mekanism:ReinforcedPlasticBlock,tile.ReinforcedPlasticBlock,0,255
194,Mekanism:RoadPlasticBlock,tile.RoadPlasticBlock,0,255
195,Mekanism:PlasticFence,tile.PlasticFence,0,0
196,Mekanism:SaltBlock,tile.SaltBlock,0,255
197,MekanismGenerators:Generator,tile.Generator,0,0

1行につき1つのブロックの情報が記述されています。IDCheckerはいろいろな情報を出力していますが、今回はブロックの名前だけに注目しましょう。

見づらいかもしれませんが、「,」区切りであることを頭の片隅に入れて注目してください。

2,minecraft:grass,tile.grass,0,255であるならば、IDが2*1、登録された正式名がminecraft:grassであることがわかります。なお、残りの2つの情報は今回の本題から外れるので説明を省略します。

バニラのブロックは全て「minecraft:XXXX」という名前なのですが、「minecraft:」の部分はほとんどの場合省略できます。つまり、「stone」とだけ記述したらそれは「minecraft:stone」を意味します。

それでは他のModで追加されたブロックはどうでしょうか。

上記の例で下から2番目、IDが196の行を見てください。

MekanismというModで追加されたSaltBlockというブロックであることがわかります。なお登録名は「Mekanism:SaltBlock」ですね。

他Modのブロック・アイテムの名前を設定ファイルに記述する

もし、MineAllの一括破壊の対象として、このSaltBlockを追加したいならば「Mekanism:SaltBlock」という文字列を追加しましょう。たとえば次のように。

S:blockIds=gold_ore, iron_ore, coal_ore, lapis_ore, obsidian, diamond_ore, redstone_ore, lit_redstone_ore, glowstone, emerald_ore, quartz_ore, emerald_block, Mekanism:SaltBlock

MineAllで一括破壊をするためのツールを追加したいならば、「ItemList.txt」ファイルを開いて、その追加したいツールの登録名を探して見ましょう。

たとえば、Mekanismのブロンズつるはしで一括破壊したいならば、「MekanismTools:BronzePickaxe」を設定項目「S:itemIds」に追加すればよいですね。例えば次のように。

S:itemIds=iron_pickaxe, wooden_pickaxe, stone_pickaxe, diamond_pickaxe, golden_pickaxe, MekanismTools:BronzePickaxe

その他のModの例(CutAll)

たとえば、MineAllと同じくらい、あるいはそれ以上によく使われるModとしてCutAll*2があります。

他のModで追加された木や葉をCutAllを使って一括伐採したいならば、その丸太ブロック、葉ブロックの名前を設定ファイル内に書き込む必要があります。

設定ファイル「net.minecraft.scalar.cutall.mod_CutAllSMP.cfg」内では、以下の項目に注目ですね。

# String: "log, brown_mushroom_block, red_mushroom_block, log2" (対象とする木ブロック)
S:blockIds=log, brown_mushroom_block, red_mushroom_block, log2
# String: "iron_axe, wooden_axe, stone_axe, diamond_axe, golden_axe" (対象ツール)
S:itemIds=iron_axe, wooden_axe, stone_axe, diamond_axe, golden_axe
# String: "" (対象とする葉ブロック)
S:leavesIds=

最初は上記のように、対象とする葉ブロックの項目「S:leavesIds」は空欄となっています。 「BlockList.txt」からModで新しく追加された樹木の葉ブロックの名前を探して追加しましょう。

なおバニラの葉である「minecraft:leaves」と「minecraft:leaves2」の違いは以下のページを参照のこと。

その他のModの例(SpawnChecker)

僕が愛用しているModとして、敵Mobの湧く場所をわかりやすく表示してくれるSpawnCheckerがあります。

このModのうれしいところは、明かりツール(たとえば松明など)を持っているときだけ湧き場所を表示するというとても便利な機能があることです。すばらしい!

そしてこの機能を、バニラの松明だけでなく他のModで追加される明かり系ツールを持っているときにも使いたくなってきます。

たとえば、松明をたくさん収納できる便利ツールです。松明を数百本まとめて収納しておいて右クリックでいつでも設置可能です、なんてツールは様々なModで見ることができます。

僕は、中にブロックを無限に入れて持ち運ぶことができるStorageBoxを愛用しています。この中に松明を入れて(ほぼ)無限松明ツールとして使うわけです。

では、StorageBoxを設定ファイルに書き加えましょう。

該当するSpawnChecnker側の設定項目は以下の通り(設定ファイル名「spawnchecker.cfg」より抜粋)。

# spawn checker enabling item id list.
# Add "itemid" if you'd like to use other vanilla's item.Add "modid:itemid" if you'd like to use other mod's item.(default: torch, lit_pumpkin)
S:checker_enabling_items <
    torch
    lit_pumpkin
 >

先ほどのMineAllなどとは違い、「,」区切りではなく1行あたり1つの名前という記述方法のようですね。

たとえばStorageBoxの登録名「net.minecraft.storagebox.mod_StorageBox:Storage Box」*3を「ItemList.txt」ファイルから調べ、この名前を追加します。

たとえば以下のように。

# spawn checker enabling item id list.
# Add "itemid" if you'd like to use other vanilla's item.Add "modid:itemid" if you'd like to use other mod's item.(default: torch, lit_pumpkin)
S:checker_enabling_items <
    torch
    lit_pumpkin
    net.minecraft.storagebox.mod_StorageBox:Storage Box
 >

これでゲーム内で、(松明を大量に収納した)StorageBoxを手に持っているときにもMobの湧き場所を表示することができます。

*1:過去のMinecraftはアイテムやブロックなどをIDすなわち数字で区別し管理していました。たとえばMinecraft1.6.xではブロックなどを完全にIDで管理していたために、Modの設定ファイルにブロックを追加するときは名前ではなくIDを書き加えていたのです。しかしMinecraft1.7以降、ブロックなどはIDではなく名前で管理することになりました。Minecraft1.7.10はID完全廃止の移行期間ということで、ブロック等はできるだけIDではなく名前を使うよう推奨されています。ぶっちゃけ、設定ファイルにIDを書いても問題なく動くことも多いのですが、できるだけ名前を書きましょう。

*2:一括伐採大好き!!

*3:とても長いですね^^;