01

Minecraft で Rubyプログラミングを楽しむ情報をまとめてみました。

(2015.10.21 追加記事を書きました;
→・Ruby で Minecraft の mod を作る RubyCore が出た!) 

PyConJP 2015 で「MinecraftをPythonで遊ぶ」という素晴らしい講演がありました。 
→・ドット絵自動生成から空飛ぶ絨毯まで! MinecraftをPythonで遊び倒す! #PyConJP_M #pyconjp - Togetterまとめ 





ここでは、Minecraft を Ruby で Programmingして遊んでみます。

0.環境構築
環境構築は Raspberry Pi、PC(Mac、Windows)に合わせて、それぞれ以前の記事を参照してください。
→・Minecraft でプログラミングを楽しむ4つの方法
→・Raspberry Pi の Minecraft Pi 版でプログラミングを楽しむ方法
→・Minecraft PC 版に Mod を入れてプログラミングを楽しむ方法


1. gem(Minecraft-Pi Ruby)のインストール
Raspberry Pi用の Minecraft Pi版でも、Mac/ Windows/ Linux用の Minecraft PC版でも以下同じ操作です。
まず、Ruby でプログラミングするには  Minecraft-Pi Ruby という gem をインストールします。
ターミナルで;
$ gem install minecraft-pi-ruby
(管理者権限が必要場合は、頭に sudo を付けて実行)
これで、OK です。

(2015.11.15 追記;おすすめ!
Minecraft-Pi Ruby で使える命令を独自に追加しました。そちらの gem をインストールするには;
$ gem install specific_install
$ gem specific_install https://github.com/noanoa07/minecraft-pi-ruby.git feature
Windowsの場合、git が必要です。 
→・GitHub のブランチにある gem をインストールする方法 )


2.Minecraft の起動
Minecraft を起動して、先にワールドの画面を開いた状態にしておきます。
この状態で、マウスカーソルを画面外に出します。(Pi版は Tabキーまたは Escキー、PC版は Escキー)

※ 同じ LAN環境にいれば、ゲームメニューで「LANに公開」を選ぶと、別の人とワールドを共有(マルチプレイ)できます。


(2015.11.18 追記;この設定をしておくと便利です。おすすめ!
→・Minecraft でマウスポインタを画面外に出して、一時停止させない方法

Minecraft の基本操作については;
→・Raspberry Pi の Minecraft Pi 版でプログラミングを楽しむ方法
→・Minecraft PC 版に Mod を入れてプログラミングを楽しむ方法


3.プログラムの実行
あとは、ターミナルを起動して、Rubyプログラムを動かすだけです!
irb でも実行できます。)
書き方、使えるコマンドの詳細は、Minecraft-Pi Ruby のサイトを参照してください。
後述のサンプルプログラムも参考に。

○初期設定
 require 'minecraft-pi-ruby'
 mc = Minecraft.new

 実行には、上記の2行が必要です。(mc は任意の変数名で可。)

○コマンド
・say "message"
 画面に文字(message)を表示

・set_camera_mode(Raspberry Pi のみ)
 カメラモードを設定(:fixed、 :normal、 :follow)

・set_block(x, y, z, ブロックID[, ブロックデータ]) または
 set_block(position, ブロックID[, ブロックデータ])
 座標(x, y, z)または position = Position.new(x, y, z) で指定
 ※ Minecraft の座標は、ブロック単位で、y座標が高さ方向になるのことに注意(上が +)

 例)set_block(0, 0, 0, Block::STONE) 
 ブロックID は数字でも良い 
 ブロックデータは省略可
(ブロックID、ブロックデータは後述) 

・get_block(x, y, z)  ※独自拡張
 座標(x, y, z) のブロックIDを返す

・set_blocks または make_cuboid
 引数の指定は (x1, y1, z1, x2, y2, z2, ブロックID[, ブロックデータ]) または (position1, position2, ブロックID[, ブロックデータ])

 例)set_blocks(0, 0, 0, 20, 20, 20, Block::OBSIDIAN) 
 ブロックID は数字でも良い 
 ブロックデータは省略可
(ブロックID、ブロックデータは後述)
 
・get_ground_height(x, z) または ground_height(x, z)
 座標 (x, z) の地面の高さ(y座標)を返す

・set_player_position(x ,y, z) または set_player_position(position)
 プレーヤーを座標 (x, y, z) に置く

・get_player_position  ※独自拡張
 プレーヤーの座標を Positionクラスで返す。

・キー入力の取得
 Minecraft からキー入力の情報を取得することは現状ではできません。また、Minecraft ウィンドウがアクティブだと、ターミナルで実行中のプログラムにはキー入力の取得はできません。
そこで、ターミナルウィンドウをアクティブにしつつ、Minecraft ウィンドウを表示させることで、キー入力の情報をターミナル側で取得できます。
 →・Minecraft でマウスポインタを画面外に出して、一時停止させない方法
 ※ Minecraftウィンドウ自体の移動などの操作は Escキーを押さないとできません。

 なお、キー入力の取得には、Rubyの io/consoleライブラリが使えます。
 →・Ruby - ターミナルのキー入力を得てカーソル移動とかする (curses無し) - Qiita


4.サンプルプログラム
(license; public domain)

○画面に文字を表示
hello.rb
-------------------------------------------------------------------------------
require 'minecraft-pi-ruby'

mc = Minecraft.new
mc.say 'Hello Minecraft World!'
-------------------------------------------------------------------------------


○土地を平地化
reset.rb
-------------------------------------------------------------------------------
require 'minecraft-pi-ruby'

mc = Minecraft.new

sleep 5
mc.say 'Reset this World!'
mc.set_blocks(-100,   0, -100, 100, 63, 100, Block::AIR)
mc.set_blocks(-100,  -1, -100, 100, -1, 100, Block::GRASS)
mc.set_blocks(-100, -63, -100, 100, -2, 100, Block::STONE)

mc.set_player_position(0, 100, 0)
-------------------------------------------------------------------------------


○ブロックを文字の形に地面に置く(上から見てください)
chars.rb
-------------------------------------------------------------------------------
require 'minecraft-pi-ruby'

mc = Minecraft.new

chars = [
'#####   #    #  ####   #    #   #',
'#    #  #    #  #   #   #  #    #',
'#   #   #    #  ####     #      #',
'####    #    #  #   #    #      #',
'#   #   #    #  #   #    #       ',
'#    #   ####   ####     #      #',
]

sleep 5
mc.set_player_position(0, 100, 0)
mc.say 'Hello Ruby !'

# Reset the world
mc.set_blocks(-100,   0, -100, 100, 63, 100, Block::AIR)
mc.set_blocks(-100,  -1, -100, 100, -1, 100, Block::GRASS)
mc.set_blocks(-100, -63, -100, 100, -2, 100, Block::STONE)

x = -10
y =   0
z = -10


chars.each do |line|
  line.each_char do |ch|
    if ch == '#'
      mc.set_block(x, y, z, Block::GOLD_BLOCK)
    end
  x += 1
  end
  x = -10
  z += 1
end
-------------------------------------------------------------------------------
参考)→・Minecraft Pi Editionで遊びながらプログラミングの勉強! - TONGARISM.COM


○押したキーを表示
chat.rb
-------------------------------------------------------------------------------
require 'minecraft-pi-ruby'
require 'io/console'

mc = Minecraft.new
mc.say 'chat start!'

# ctrl + C to exit
while ch = STDIN.getch
  exit if ch == ?\C-c
  mc.say ch
end
-------------------------------------------------------------------------------
※ Cmd + Tab(または Alt + Tab)で Minecraftワールドを開いたまま、ターミナル(コマンドプロンプト)ウィンドウに切り替えて実行。下記の設定をしておくこと。プログラムの終了は Ctrl + C。
→・Minecraft でマウスポインタを画面外に出して、一時停止させない方法
(Minecraftウィンドウの移動などの操作は、Minecraftで Esc を押す。)


現在は、Python で書かれたプログラムが多いですが、デジタル時計、フラクタル樹木など参考になるものが多いです。
Rubyのプログラムも順次増やしていくつもりです。

→・Digital Clock in Minecraft - Raspberry Pi • View topic 
→・Python & Minecraft on Raspberry Pi! - import minecraft - MCPIPY.com
→・Python coding for Minecraft - instructables
→・Adventures in Minecraft - <Stuff about="code" >
→・Minecraft API - <Stuff about="code" />
→・Minecraft Pi Recipe Cards - arghbox
→・Python Programming with Minecraft Pi: Early Draft - arghbox
 (Codecademy用の生徒向けテキスト215ページ、教師向けテキスト45ページのpdfがダウンロードできる)


5.ブロックID、ブロックデータ
○ブロックID;(* はブロックデータあり)
-------------------------------------------------------------------------------
  0 AIR(空気、何もない状態にする)
  1 STONE(石)
  2 GRASS(草)
  3 DIRT(土)
  4 COBBLESTONE(丸石)
  5* WOOD_PLANKS(木材)
  6* SAPLING(苗木)
  7 BEDROCK(岩盤)
  8 WATER_FLOWING
WATER(水)
  9* WATER_STATIONARY(静止した水)
 10 LAVA_FLOWING
LAVA(溶岩)
 11* LAVA_STATIONARY(静止した溶岩)
 12 SAND(砂)
 13 GRAVEL(砂利)
 14 GOLD_ORE(金鉱石)
 15 IRON_ORE(鉄鉱石)
 16 COAL_ORE(石炭鉱石)
 17* WOOD(原木)
 18* LEAVES(葉)
 20 GLASS(ガラス)
 21 LAPIS_LAZULI_ORE(ラピスラズリ鉱石)
 22 LAPIS_LAZULI_BLOCK(ラビスラズリブロック)
 24* SANDSTONE(砂岩)
 26 BED(ベッド)
 30 COBWEB(クモの巣)
 31* GRASS_TALL(草)
 35* WOOL(羊毛)
 37 FLOWER_YELLOW(黄色い花)
 38 FLOWER_CYAN(赤いバラ)
 39 MUSHROOM_BROWN(キノコ 茶)
 40 MUSHROOM_RED(キノコ 赤)
 41 GOLD_BLOCK(金ブロック)
 42 IRON_BLOCK(鉄ブロック)
 43* STONE_SLAB_DOUBLE(重ねたハーフブロック)
 44* STONE_SLAB(ハーフブロック)
 45 BRICK_BLOCK(レンガブロック)
 46* TNT(TNT爆弾)
 47 BOOKSHELF(本棚)
 48 MOSS_STONE(苔石)
 49 OBSIDIAN(黒曜石)
 50* TORCH(松明 たいまつ)
 51 FIRE(炎)
 53* STAIRS_WOOD(樫の木の階段)
 54* CHEST(チェスト)
 56 DIAMOND_ORE(ダイヤモンド鉱石)
 57 DIAMOND_BLOCK(ダイヤモンドブロック)
 58 CRAFTING_TABLE(作業台)
 60 FARMLAND(耕地)
 61* FURNACE_INACTIVE(かまど)
 62* FURNACE_ACTIVE(燃えているかまど)
 64 DOOR_WOOD(木のドア)
 65* LADDER(はしご)
 67* STAIRS_COBBLESTONE(丸太の階段)
 71 DOOR_IRON(鉄のドア)
 73 REDSTONE_ORE(レッドストーン鉱石)
 78 SNOW(雪)
 79 ICE(氷)
 80* SNOW_BLOCK(雪ブロック)
 81 CACTUS(サボテン)
 82 CLAY(粘土)
 83 SUGAR_CANE(サボテン)
 85 FENCE(フェンス)
 89 GLOWSTONE_BLOCK(グロウストーンブロック)
 95 BEDROCK_INVISIBLE(鍵のかかったチェスト)
 98* STONE_BRICK(石レンガ)
102 GLASS_PANE(板ガラス)
103 MELON(スイカ ブロック)
107* FENCE_GATE(フェンスゲート)
246 GLOWING_OBSIDIAN(輝く黒曜石)
247* NETHER_REACTOR_CORE(ネザーリアクターコア)
-------------------------------------------------------------------------------


○ブロックデータ
------------------------------------------------------------------------------- 
5 WOOD_PLANKS(木材)
 0: Oak
 1: Spruce
 2: Birch
 3: Jungle

6 SAPLING(苗木)
 0: Oak
 1: Spruce
 2: Birch
 3: Jungle

 9 WATER_STATIONARY(静止した水)
11 LAVA_STATIONARY(静止した溶岩)
 0-7: Level of the water, 0 being the highest, 7 the lowest
(0-7: 高さ、0が一番低く、7が一番高い) 

17 WOOD(原木)
  0: Oak (up/down)
  1: Spruce (up/down)
  2: Birch (up/down)
  3: Jungle (up/down)
  4: Oak (east/west)
  5: Spruce (east/west)
  6: Birch (east/west)
  7: Jungle (east/west)
  8: Oak (north/south)
  9: Spruce (north/south)
 10: Birch (north/south)
 11: Jungle (north/south)
 12: Oak (only bark)
 13: Spruce (only bark)
 14: Birch (only bark)
 15: Jungle (only bark)

18 LEAVES(葉)
 1: Oak leaves
 2: Spruce leaves
 3: Birch leaves

24 SANDSTONE(砂岩)
 0: Sandstone
 1: Chiseled sandstone
 2: Smooth sandstone

31 GRASS_TALL(草)
 0: Shrub
 1: Grass
 2: Fern
 3: Grass (color affected by biome) 

35 WOOL(羊毛)
  0: White
  1: Orange
  2: Magenta
  3: Light Blue
  4: Yellow
  5: Lime
  6: Pink
  7: Grey
  8: Light grey
  9: Cyan
 10: Purple
 11: Blue
 12: Brown
 13: Green
 14: Red
 15:Black

43 STONE_SLAB_DOUBLE(重ねたハーフブロック)
44 STONE_SLAB(ハーフブロック)
 0: Stone
 1: Sandstone
 2: Wooden
 3: Cobblestone
 4: Brick
 5: Stone Brick
 6: Nether Brick
 7: Quartz

46 TNT(TNT爆弾)
 0: Inactive
 1: Ready to explode

50 TORCH(松明 たいまつ)
 1: Pointing east
 2: Pointing west
 3: Pointing south
 4: Pointing north
 5: Facing up

53 STAIRS_WOOD(樫の木の階段)
67 STAIRS_COBBLESTONE(丸太の階段)
 0: Ascending east
 1: Ascending west
 2: Ascending south
 3: Ascending north
 4: Ascending east (upside down)
 5: Ascending west (upside down)
 6: Ascending south (upside down)
 7: Ascending north (upside down)

 54 CHEST(チェスト)
 61 FURNACE_INACTIVE(かまど)
 62 FURNACE_ACTIVE(燃えているかまど)
 65 LADDER(はしご)
107 FENCE_GATE(フェンスゲート)
 2: Facing north
 3: Facing south
 4: Facing west
 5: Facing east

80 SNOW_BLOCK(雪ブロック)
 0-7: Height of snow, 0 being the lowest, 7 being the highest.
(0-7: 雪の高さ、0が一番低く、7が一番高い)

98 STONE_BRICK(石レンガ)
 0: Stone brick
 1: Mossy stone brick
 2: Cracked stone brick
 3: Chiseled stone brick

247 NETHER_REACTOR_CORE(ネザーリアクターコア)
 0: Unused
 1: Active
 2: Stopped / used up
-------------------------------------------------------------------------------
※詳細は未検証です
→・Minecraft API - <Stuff about="code" />


(Qiita [キータ] にも投稿;




Raspberry Pi で Minecraft Pi 版の Programming をする方法を解説。
特に Scratch について詳しい。 Python についても少し紹介。


「Pythonで自由自在 楽しく学ぶラズパイプログラミング」
第1回 Python と Minecraft で遊ぼう(ガリレオ 小山博史)が掲載。





Minecraft で Programming をする方法(Mac/Windows/Raspberry Pi)を詳しく解説。サンプルプログラム多数。
関連サイトに動画;