そう思ったことはありませんか?
どーもTakeです。
私も minecraft にはまっておりますが、自動で家をつくってみたい!とも思い。
Python プログラミングで「高さ、横幅、奥行き」全部自由の完全自動の和風家建築プログラミングを開発しました!!
私が作成したプログラミングを動かしたらこんな感じです!
見た目は和風っぽいです!(たぶん)
内装はこんな感じです!(あんまり和風っぽくないかも、)
minecraftには和風modというのもあるんですが、なるべくmod入れずに作りたかったので、こんな感じの内装になりました。すみません。
これは Minecraft 上で Python プログラミングを動かしている作成したものです。
Python プログラミング「code connection for Minecraft」と呼ばれるMinecraft 公式のプログラミング開発環境用のツールで開発しました。
※ 「code connection for Minecraft」の使い方について詳しく知りたい方は下記をどうぞ!
この記事では、私が作成したMinecraft 上で「高さ、横幅、奥行き」全部自由の完全自動の和風建築の家のプログラミングついて簡単に解説します。
※ YouTube 動画でも紹介しています!よければこちらどうぞ!
- 「高さ、横幅、奥行き」の完全自由に指定できます!
- 完全自動です!コマンドを入力するだけで何も動かず自動作成できます!
「高さ、奥行き、横幅のエレベーター」を建築するPython プログラミングの作り方
まず「高さ、奥行き、横幅のエレベーター」を建築する プログラミングですが、Python というプログラミング言語で作成します。
また開発環境ですが、「code connection for Minecraft」と呼ばれるMinecraft 公式のプログラミング開発環境用のツールで開発しました。
作り方といっても、下の「エレベータプログラミのソースコード」を「code connection for Minecraft」のPython プログラミングのところに貼り付けて実行すればOKです!
※ イメージこんな感じです!こんな感じで貼り付けて右下の再生ボタンを押下すればOK!
※ よくわからない方は下記ページに詳しく記載しています。
エレベータープログラミングの実行方法について
「高さ、奥行き、横幅のエレベーター」のプログラミングを「code connection for Minecraft」のPythonプログラムに貼り付けて実行状態にできれば
あとはMinecraft のチャット欄に「build」と入力し Enter すればOKです!
エレベータープログラミングのソースコード
Python プログラミングのソースコードを載せます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 |
# ############################################ # 標準メソッド # ############################################ # 最初のポジション D_F_X = 0 D_F_Y = -1 D_F_Z = 5 F_X = D_F_X F_Y = D_F_Y F_Z = D_F_Z # 客席つくる def makeSeat(): blocks.fill(GLASS, pos(-1,1,-1), pos(1,2,-1), FillOperation.REPLACE) blocks.fill(GLASS, pos(-1,1,1), pos(1,2,1), FillOperation.REPLACE) blocks.fill(GLASS, pos(-1,1,0), pos(-1,2,0), FillOperation.REPLACE) blocks.fill(GLASS, pos(1,1,0), pos(1,2,0), FillOperation.REPLACE) # 客席削除 def deleteSeat(): blocks.fill(AIR, pos(-1,1,-1), pos(1,2,-1), FillOperation.REPLACE) blocks.fill(AIR, pos(-1,1,1), pos(1,2,1), FillOperation.REPLACE) blocks.fill(AIR, pos(-1,1,0), pos(-1,2,0), FillOperation.REPLACE) blocks.fill(AIR, pos(1,1,0), pos(1,2,0), FillOperation.REPLACE) # 入力位置を最初の位置からのポジションずらす def setPositionInfo(aX: number, aY: number, aZ: number): apX = F_X + aX apY = F_Y + aY apZ = F_Z + aZ return apX,apY,apZ # ############################################ # 建物構築メソッド # ############################################ # 和風建物 def buildWahuHouse(aX: number, aY: number, aZ: number): # 柱ブロック hashiraBlock = PLANKS_DARK_OAK # 床ブロック yukaBlock = COBBLESTONE # 階段ブロック stairsBlock = COBBLESTONE_STAIRS stairsBlock2 = BLOCK_OF_QUARTZ # 屋根ブロック roofBlocks = COBBLESTONE_STAIRS # 室内ブロック innerBlock1 = PLANKS_OAK innerBlock2 = BLOCK_OF_QUARTZ firstPosition = pos(F_X, F_Y, F_Z) apX,apY,apZ = setPositionInfo(aX, aY, aZ) newPosition = pos(apX, apY, apZ) blocks.fill(AIR, firstPosition, newPosition, FillOperation.REPLACE) buildInner() buildWafuRoof() buildWafuTower() buildKagu() # 和風建物土台 def buildWafuTower(): # 柱 blocks.fill(hashiraBlock, pos(F_X, F_Y, F_Z), pos(F_X, apY, F_Z), FillOperation.REPLACE) blocks.fill(hashiraBlock, pos(apX, F_Y, F_Z), pos(apX, apY, F_Z), FillOperation.REPLACE) blocks.fill(hashiraBlock, pos(F_X, F_Y, apZ), pos(F_X, apY, apZ), FillOperation.REPLACE) blocks.fill(hashiraBlock, pos(apX, F_Y, apZ), pos(apX, apY, apZ), FillOperation.REPLACE) # 床 blocks.fill(yukaBlock, pos(F_X-1, F_Y+1, F_Z-1), pos(apX+1, F_Y+1, apZ+1), FillOperation.REPLACE) # 天井 blocks.fill(hashiraBlock, pos(F_X, apY, F_Z), pos(apX, apY, apZ), FillOperation.REPLACE) # 階段 blocks.fill(blocks.block_with_data(stairsBlock, 2), pos(F_X+2, F_Y+1, F_Z-1), pos(apX-2, F_Y+1, F_Z-1), FillOperation.REPLACE) # 扉 blocks.fill(AIR, pos(F_X+aX/2, F_Y+2, F_Z), pos(F_X+aX/2+1, F_Y+3, F_Z), FillOperation.REPLACE) blocks.fill(blocks.block_with_data(ACACIA_DOOR, 1), pos(F_X+aX/2, F_Y+2, F_Z+1), pos(F_X+aX/2+1, F_Y+3, F_Z+1), FillOperation.REPLACE) # 和風建物屋根 def buildWafuRoof(): # 前 blocks.fill(blocks.block_with_data(roofBlocks, 2), pos(F_X-2, apY+1, F_Z-3), pos(apX+2, apY+1, F_Z), FillOperation.REPLACE) blocks.fill(blocks.block_with_data(roofBlocks, 2), pos(F_X-1, apY+2, F_Z-2), pos(apX+1, apY+2, F_Z), FillOperation.REPLACE) blocks.fill(blocks.block_with_data(roofBlocks, 2), pos(F_X, apY+3, F_Z-1), pos(apX, apY+3, F_Z), FillOperation.REPLACE) # 奥 blocks.fill(blocks.block_with_data(roofBlocks, 3), pos(F_X-2, apY+1, apZ+3), pos(apX+2, apY+1, apZ), FillOperation.REPLACE) blocks.fill(blocks.block_with_data(roofBlocks, 3), pos(F_X-1, apY+2, apZ+2), pos(apX+1, apY+2, apZ), FillOperation.REPLACE) blocks.fill(blocks.block_with_data(roofBlocks, 3), pos(F_X, apY+3, apZ+1), pos(apX, apY+3, apZ), FillOperation.REPLACE) # 左 blocks.fill(blocks.block_with_data(roofBlocks, 1), pos(apX, apY+1, F_Z-2), pos(apX+2, apY+1, apZ+2), FillOperation.REPLACE) blocks.fill(blocks.block_with_data(roofBlocks, 1), pos(apX, apY+2, F_Z-1), pos(apX+1, apY+2, apZ+1), FillOperation.REPLACE) blocks.fill(blocks.block_with_data(roofBlocks, 1), pos(apX, apY+3, F_Z), pos(apX, apY+3, apZ), FillOperation.REPLACE) # 右 blocks.fill(blocks.block_with_data(roofBlocks, 0), pos(F_X, apY+1, F_Z-2), pos(F_X-2, apY+1, apZ+2), FillOperation.REPLACE) blocks.fill(blocks.block_with_data(roofBlocks, 0), pos(F_X, apY+2, F_Z-1), pos(F_X-1, apY+2, apZ+1), FillOperation.REPLACE) blocks.fill(blocks.block_with_data(roofBlocks, 0), pos(F_X, apY+3, F_Z), pos(F_X, apY+3, apZ), FillOperation.REPLACE) # 上の土台 fZ = F_Z mZ = F_Z+aX/2 lZ = apZ for i in range(aY): if fZ < lZ: blocks.fill(blocks.block_with_data(roofBlocks, 2), pos(F_X+1, apY+4+i, fZ), pos(apX-1, apY+4+i, mZ), FillOperation.REPLACE) blocks.fill(blocks.block_with_data(roofBlocks, 3), pos(F_X+1, apY+4+i, mZ), pos(apX-1, apY+4+i, lZ), FillOperation.REPLACE) else : break fZ = fZ + 1 lZ = lZ - 1 mZ = fZ+(lZ-fZ)/2 # 和風建物内部 def buildInner(): # 壁 blocks.fill(innerBlock1, pos(F_X, F_Y+1, F_Z), pos(F_X, F_Y+aY/2-2, apZ), FillOperation.REPLACE) blocks.fill(innerBlock1, pos(apX, F_Y+1, F_Z), pos(apX, F_Y+aY/2-2, apZ), FillOperation.REPLACE) blocks.fill(innerBlock1, pos(F_X, F_Y+1, F_Z), pos(apX-1, F_Y+aY/2-2, F_Z), FillOperation.REPLACE) blocks.fill(innerBlock1, pos(F_X, F_Y+1, apZ), pos(apX-1, F_Y+aY/2-2, apZ), FillOperation.REPLACE) blocks.fill(innerBlock2, pos(F_X, F_Y+aY/2-1, F_Z), pos(F_X, apY+2, apZ), FillOperation.REPLACE) blocks.fill(innerBlock2, pos(apX, F_Y+aY/2-1, F_Z), pos(apX, apY+2, apZ), FillOperation.REPLACE) blocks.fill(innerBlock2, pos(F_X, F_Y+aY/2-1, F_Z), pos(apX, apY+2, F_Z), FillOperation.REPLACE) blocks.fill(innerBlock2, pos(F_X, F_Y+aY/2-1, apZ), pos(apX, apY+2, apZ), FillOperation.REPLACE) WINDOWS_BLOCK = AIR # 窓 正面 for i in range(F_X,apX): if i - F_X >= 3 and (i -F_X) % 3 == 0 : blocks.fill(WINDOWS_BLOCK, pos(i, F_Y+aY/2+1, F_Z), pos(i, F_Y+aY/2+1, F_Z), FillOperation.REPLACE) # 窓 左右 for i in range(F_Z,apZ): if i - F_Z >= 3 and (i -F_Z) % 3 == 0 : blocks.fill(WINDOWS_BLOCK, pos(F_X, F_Y+aY/2+1, i), pos(F_X, F_Y+aY/2+1, i), FillOperation.REPLACE) blocks.fill(WINDOWS_BLOCK, pos(apX, F_Y+aY/2+1, i), pos(apX, F_Y+aY/2+1, i), FillOperation.REPLACE) # 家具 def buildKagu(): # ベッド blocks.fill(BED, pos(F_X+1, F_Y+2, apZ-1), pos(F_X+2, F_Y+2, apZ-1), FillOperation.REPLACE) # 本棚 blocks.fill(BOOKSHELF, pos(F_X+4, F_Y+2, apZ-1), pos(apX-1, apY-2, apZ-1), FillOperation.REPLACE) # 松明 blocks.fill(TORCH, pos(F_X+1, F_Y+4, apZ-1), pos(F_X+1, F_Y+4, apZ-2), FillOperation.REPLACE) blocks.fill(TORCH, pos(F_X+1, F_Y+4, apZ-1), pos(F_X+1, F_Y+4, apZ-2), FillOperation.REPLACE) # チェスト blocks.fill(blocks.block_with_data(CHEST, 4), pos(apX-1, F_Y+2, F_Z+1), pos(apX-1, apY-2, F_Z+2), FillOperation.REPLACE) # 台所 blocks.fill(blocks.block_with_data(62, 5), pos(F_X+1, F_Y+2, F_Z+1), pos(F_X+1, F_Y+3, apZ-4), FillOperation.REPLACE) # 椅子 blocks.place(blocks.block_with_data(SPRUCE_WOOD_STAIRS, 3), pos(apX-3, F_Y+2, F_Z+3)) blocks.fill(blocks.block_with_data(SPRUCE_WOOD_STAIRS, 1), pos(apX-4, F_Y+2, F_Z+3), pos(apX-4, F_Y+2, apZ-3), FillOperation.REPLACE) blocks.place(blocks.block_with_data(SPRUCE_WOOD_STAIRS, 2), pos(apX-3, F_Y+2, apZ-3)) # 焚火 blocks.fill(yukaBlock, pos(apX-1, F_Y+2, F_Z+3), pos(apX-1, apY-2, F_Z+3), FillOperation.REPLACE) blocks.fill(yukaBlock, pos(apX-1, F_Y+2, apZ-3), pos(apX-1, apY-2, apZ-3), FillOperation.REPLACE) blocks.fill(yukaBlock, pos(apX-1, apY-2, F_Z+4), pos(apX-1, apY-2, apZ-4), FillOperation.REPLACE) blocks.fill(CAMPFIRE, pos(apX-1, F_Y+2, F_Z+4), pos(apX-1, F_Y+2, apZ-4), FillOperation.REPLACE) # 村人 mobs.spawn(VILLAGER, pos(apX/2, F_Y+3, apZ/2)) mobs.spawn(VILLAGER, pos(apX/2, F_Y+3, apZ/2)) # ############################################ # 呼び出し用メソッド # ############################################ # チャット 家の建築 def on_on_chat5(INPUT_X=0,INPUT_Y=0,INPUT_Z=0): if INPUT_X > 0 and INPUT_Y > 0 and INPUT_Z > 0: makeSeat() buildWahuHouse(INPUT_X, INPUT_Y, INPUT_Z) deleteSeat() player.say("完了") else: player.say("build x y z") player.say("例) build 8 8 8") player.on_chat("build", on_on_chat5) |
「高さ、奥行き、横幅のエレベーター」プログラミングを実行する上での注意点
まずこのプログラムを実行する上での注意点です。
- プログラミングを実行中はプレイヤー(つまり自分自身)を絶対に動かさないこと!
- プログラムを実行する前に「compass」コマンドを実行して位置を確認!
- あまり無茶な動かし方をすると、正常に動かなくなる可能性もあります!
プログラミングを実行中はプレイヤー(つまり自分自身)を絶対に動かさないこと!
「高さ、奥行き、横幅のエレベーター」プログラミングを実行する際は必ずプレイヤーを操作しないようお願いします。
なぜなら動かしてしまうと建物の形がおかしなことになります。
これはなぜかというと、Miecraft プログラミングでブロックを置く処理を実行する際、
Minecraft のプログラミングの仕様上、プレイヤーの位置が原点(つまり数学でいう(0,0,0)の点)になるからです。
何言ってるかよくわからん人は下記図を見てください。
たとえばあるプレイヤーが水色の位置にブロックを置こうとします。
この場合、プログラミングで指定するブロックの配置場所は「プレイヤーの前の4ブロック」ですよね。
ではこのプログラムを実行する間にプレイヤーが動いてしまうと下記のようになります。
プログラムでは「プレイヤーの前の4ブロック」に置こうとしますが、プレイヤーが自体が移動してしまうため、
ブロックの配置場所がずれてしまうということになります。
こういう理由のため、「高さ、奥行き、横幅のエレベーター」プログラミングを実行する際はかならずプレイヤーを動かさないでください!
(見上げるとか視点を変える動作はOKです!)
「build」コマンドを実行する前に「compass」コマンドを実行して位置を確認!
Minecraft の世界では前とか後ろという方向性は、Minecraftのもつ X軸、Y軸、Z軸で決定しますが、
プログラミング開発している場合はどちらが前か正直わからないという悩みがあります。
わたしは独自に「compass」というコマンド作成しており、下図のように床に赤いブロックが出力されたほうを前とわかるようにしています。
なので、建物を建築する前はかならず「compass」コマンドを実行するようにしましょう!
あまり無茶な動かし方をすると、正常に動かなくなる可能性もあります!
これは Minecraft のプログラミングのスペック上仕方がないです。
例えば建物 10000階のエレベーターを作成しようとしても Minecraft 上では描くことができません。
なので、あまり無茶に動かさないようにお願いします。
最後に
いかがでしたでしょうか?
この記事では、Minecraft でもPython プログラミングで「高さ、横幅、奥行き」全部自由の完全自動の和風建築の家のプログラミングを開発しました!!
YouTubeでも紹介していますので、ぜひそちらもご覧ください。
この記事が読者の Python 開発のお役に立てれば幸いです。
ではでは