2020年度卒研セミナー(2020/05/28)

関連サイトと資料

準備 - 世界の作成

  1. まず、前回作成したforgeの環境でランチャーからゲームをプレイします。 ここでは、Singleplayerをクリックします。
  2. 「Create New World」ボタンをクリックします。
  3. まず、「World Name」のテキストボックスに英語で新しい世界名を入力します。 私はすでに「New World」という名前を使っているので、「New World2」を入力しました。 中段のボタンを何回かクリックして、「Game Mode」を「Creative」にします。 そして、さらに下にある「More World Options...」ボタンをクリックします。
  4. まず、上にあるテキストボックスに「Python world」と入力します。 これは、世界を作る時に使われる乱数の種(初期値)になるようです。 それから、中段の赤丸で囲ったボタンをこれらと同じ状態にします。 そして、最後に下の「Create New World」ボタンをクリックします。

プログラムの作成と実行

  1. 前回「Raspberry Jam Mod」を解凍して「C:\Users\yama\AppData\Roaming\.forge1.12.2」にコピーした「mcipy」フォルダーを、 Visual Studio Codeで開きます(メニュー「ファイル」→「フォルダーを開く」)。
  2. chat.pyというファイルを新規作成し、以下の内容を入力します。
  3. chat.py
    from mcpi.minecraft import Minecraft
      
    mc = Minecraft.create()
    mc.postToChat('Hello Minecraft!')      
        
  4. 上記で新しく作成したMinecraftのworldを開きます。「t」キーを押してテキスト入力欄を表示し、「/python chat.py」と入力してエンターキーを押します。
  5. するとプログラムが実行され、メッセージ「Hello Minecraft!」が表示されます。

プレイヤーの位置情報の取得

まず、Minecraft.create()を呼び出すことにより、Minecraftとやりとりするためのオブジェクトを作成して変数mcに代入します。 この変数名は何でもよいのですが、Minecraftの頭文字と途中のcをとってmcとしています。 mcの中にあるplayerは、まさにプレイヤーに関する情報を保持しているオブジェクトです。 このplayerオブジェクトに対してgetTilePos()というメソッドを呼び出すと、プレイヤーの位置情報が返ってくるので変数posに代入しています。 posの中身を表示するために、mc.postToChat()というメソッドの引き数にposを渡して呼び出しています。 ただし、mc.postToChat()の引き数として渡せるものは文字列だけなので、str(pos)とすることで強制的に文字列化してから渡しています。

位置情報はx,y,zの3次元座標系で表されており、xが水平方向、yが垂直方向、zが奥行きを示しています。

pos1.py
from mcpi.minecraft import Minecraft 
      
mc = Minecraft.create() 
pos = mc.player.getTilePos()
mc.postToChat(str(pos))
    

x,y,zそれぞれの数値を扱いたい場合には、pos.x, pos.y, pos.zとすればよく、以下のプログラムでは個別の値を表示しています。

pos2.py
from mcpi.minecraft import Minecraft
  
mc = Minecraft.create()
pos = mc.player.getTilePos()
mc.postToChat(str(pos.x))
mc.postToChat(str(pos.y))
mc.postToChat(str(pos.z))
    

次のプログラムでは、一瞬現在の場所から10だけ上空にジャンプします。これまでは、位置の取得にmc.player.getTilePos()メソッドを使ってきましたが、 mc.player.setTilePos()メソッドを使うとプレイヤーの位置を設定できます。

pos3.py
from mcpi.minecraft import Minecraft
  
mc = Minecraft.create()
pos = mc.player.getTilePos()
mc.player.setTilePos(pos.x, pos.y + 10, pos.z)      
    

ブロックの配置

mc.setBlock()を使うと指定した場所に、ブロックを配置することができます。ブロックは、ブロック名もしくはブロックIDで指定します。 以下に示すset-block1a.pyではブロック名を、set-block1b.pyではブロックIDを使ってブロックを配置しています。

ブロックの種別 ブロック名 ブロックID
空気 AIR 0
STONE 1
草ブロック GRASS 2
土ブロック DIRT 3
丸石 COBBLESTONE 4
木材 WOOD_PLANKS 5
苗木 SAPLING 6
岩盤 BEDROCK 7
流水 WATER_FLOWING 8
WATER 8(WATER_FLOWINGと同じ)
止まった水 WATER_STATIONARY 9
流れる溶岩 LAVA_FLOWING 10
溶岩 LAVA 10(LAVA_FLOWINGと同じ)
止まった溶岩 LAVA_STATIONARY 11
SAND 12
砂利 GRAVEL 13
金鉱石 GOLD_ORE 14
鉄鉱石 IRON_ORE 15
石炭鉱石 COAL_ORE 16
原木 WOOD 17
LEAVES 18
ガラス GLASS 20

set-block1a.py
from mcpi.minecraft import Minecraft
from mcpi.block import *
  
mc = Minecraft.create()
pos = mc.player.getTilePos()
mc.setBlock(pos.x, pos.y, pos.z, STONE)
    

set-block1b.py
from mcpi.minecraft import Minecraft
from mcpi.block import *
  
mc = Minecraft.create()
pos = mc.player.getTilePos()
mc.setBlock(pos.x, pos.y, pos.z, Block(1)) 
    

以下に示すset-block2.pyでは、プレイヤーのいる場所からxの正の方向に連続して4個の石を配置しています。

set-block2.py
from mcpi.minecraft import Minecraft
from mcpi.block import *
  
mc = Minecraft.create()
pos = mc.player.getTilePos()
mc.setBlock(pos.x, pos.y, pos.z, STONE)
mc.setBlock(pos.x + 1, pos.y, pos.z, STONE)
mc.setBlock(pos.x + 2, pos.y, pos.z, STONE)
mc.setBlock(pos.x + 2, pos.y, pos.z, STONE)
mc.setBlock(pos.x + 3, pos.y, pos.z, STONE)
    

mc.setBlocks()を使うと、同じことがメソッドを1回呼ぶだけで実現できます。

set-block3.py
from mcpi.minecraft import Minecraft
from mcpi.block import *
  
mc = Minecraft.create()
pos = mc.player.getTilePos()
mc.setBlocks(pos.x, pos.y, pos.z, pos.x + 4, pos.y, pos.z, STONE)
    

mc.getBlock()を使うと指定した場所のブロックIDを取得できます。

getblock.py
from mcpi.minecraft import Minecraft
from mcpi.block import *
  
mc = Minecraft.create()
pos = mc.player.getTilePos()
blockid = mc.getBlock(pos.x, pos.y, pos.z)
mc.postToChat(str(blockid))