minecraft で世界一高いエレベーターを作ってみたい!
そう思ったことはありませんか?
どーもTakeです。
私も minecraft にはまっておりますが、世界一高いエレベーターを作ってみたいと思い、
Python プログラミングで「高さ自由、色の指定自由」のなんでもありのエレベーター作成プログラミングを開発しました!!
私が作成したエレベーター作成プログラミングを動かしたらこんな感じです!
高すぎて上がみえない。。。
雲より高いところに出れるエレベーターです。
ちなみに横から空から見るとこんな感じです。
いまにも太陽に届きそうなエレベーター。。。
ちなみに屋上に出てくるとこんな感じです。
下に海とか島とかをみると高さが際立っていいですよね。
自分で作って言うのもなんですが、見ているだけで結構楽しくないですか?(私の所感です。。)
これは Minecraft 上で Python プログラミングを動かしている作成したものです。
Python プログラミング「code connection for Minecraft」と呼ばれるMinecraft 公式のプログラミング開発環境用のツールで開発しました。
※ 「code connection for Minecraft」の使い方について詳しく知りたい方は下記をどうぞ!
この記事では、私が作成したMinecraft 上で「高さ自由のエレベーター」を建築するPython プログラミングについて簡単に解説します。
※ YouTube 動画でも紹介しています!よければこちらどうぞ!
- エレベーターを囲うブロックの色を自由に決めれます!
- エレベーターの高さを自由に決めれます!(ただしMinecraft の処理の都合上あまりに高く設定すると建築できない場合もあります!)
- 完全自動です!コマンドを入力するだけで何も動かず自動作成できます!
「高さ自由のエレベーター」を建築するPython プログラミングの作り方
まず「高さ自由のエレベーター」を建築する プログラミングですが、Python というプログラミング言語で作成します。
また開発環境ですが、「code connection for Minecraft」と呼ばれるMinecraft 公式のプログラミング開発環境用のツールで開発しました。
作り方といっても、下の「エレベータプログラミのソースコード」を「code connection for Minecraft」のPython プログラミングのところに貼り付けて実行すればOKです!
※ イメージこんな感じです!こんな感じで貼り付けて右下の再生ボタンを押下すればOK!
※ よくわからない方は下記ページに詳しく記載しています。
「高さ自由のエレベーター」プログラミングの処理フローと実行方法
「高さ自由のエレベーター」を建築する プログラミングの処理の流れはこんな感じです。
- エレベータの土台をつくる
- エレベータの外観をつくる
- エレベータの屋上をつくる
- 水流ブロックを埋め込む
- マグマブロック、ソウルサンドを地面に埋め込んで完成!
超ざっくりいうとこれだけです。
なお今回作成するエレベータは「水上エレベータ」と呼ばれるものを作っています。
この「水上エレベータ」はマグマブロック、ソウルサンドに水流ブロックを載せると勢いのある水流ができ、自動で登り下りできるものになります。
イメージはこんな感じです↓左が登りで右が下りのエレベーターです。
これをプログラミングで書いただけ・・・です。
多分実際にソースコードを見たほうがはやいかも、、、って感じです。
ソースコードが気になる方は下の章に載せてますので、そちらをどうぞ。。
エレベータープログラミングの実行方法について
「高さ自由のエレベーター」のプログラミングを「code connection for Minecraft」のPythonプログラムに貼り付けて実行状態にできれば
あとはMinecraft のチャット欄に「build」と入力し Enter すればOKです!
なお、<エレベータの個数>は指定しなくてもOKです!指定しない場合は1件建築されます!
たとえば下記のように実行できます!
- build 100 ・・・高さ100階のエレベーターが1件建築できます!
- build 100 3 ・・・高さ100階のエレベーターが3件建築できます!
- build 200 1 ・・・高さ200階のエレベーターが3件建築できます!
エレベータープログラミングのソースコード
Python プログラミングのソースコードを載せます。
ちなみにPython プログラミングの下記行の値を変えることで自分好みの設定に変更もできます!
- THEAM_BLOCK = DIAMOND_BLOCK → ここでブロックの種類を変更できます!
- MAX_STAIRS = 200 → ここでエレベーターの最大階を指定できます!
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 |
# ############################################ # エレベータ自動作成 # ############################################ # 最初のポジション F_X = 0 F_Y = -1 F_Z = 5 # エレベータの間隔 E_INTERVAL = 6 # 積み重ねるエレベータの単位 ELEVATOR_UNIT = 50 # 足場の単位 SCAFFOLD_UNIT = 5 # エレベータの最大階 MAX_STAIRS = 200 # エレベータ作成 def buildElevator2(stairs): agent.teleport_to_player() # THEAM_BLOCK = BLOCK_OF_QUARTZ THEAM_BLOCK = DIAMOND_BLOCK firstPosition = pos(F_X, F_Y, F_Z) calNum = 0 MAX_NUM = stairs / ELEVATOR_UNIT F_Y_B = F_Y F_Y_A = F_Y + ELEVATOR_UNIT # 削除 blocks.fill(AIR, pos(F_X -2, F_Y+1, F_Z-2), pos(F_X + 2, F_Y + stairs + 5, F_Z + 2), FillOperation.REPLACE) # 客席つくる 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) # 土を埋める blocks.fill(THEAM_BLOCK, pos(F_X -2, F_Y , F_Z ), pos(F_X + 2, F_Y, F_Z + 2), FillOperation.REPLACE) blocks.place(blocks.block_with_data(DIRT, 1), pos(F_X +1, F_Y , F_Z + 1)) blocks.place(blocks.block_with_data(DIRT, 1), pos(F_X -1, F_Y , F_Z + 1)) # エレベータ外観 if stairs <= ELEVATOR_UNIT: # エレベータを積み重ねず建築 blocks.fill(THEAM_BLOCK, pos(F_X - 2, F_Y, F_Z + 2), pos(F_X + 2, F_Y + stairs, F_Z + 2), FillOperation.REPLACE) blocks.fill(THEAM_BLOCK, pos(F_X - 2, F_Y, F_Z), pos(F_X - 2, F_Y + stairs, F_Z + 1), FillOperation.REPLACE) blocks.fill(THEAM_BLOCK, pos(F_X, F_Y, F_Z), pos(F_X, F_Y + stairs, F_Z + 1), FillOperation.REPLACE) blocks.fill(THEAM_BLOCK, pos(F_X + 2, F_Y, F_Z), pos(F_X + 2, F_Y + stairs, F_Z + 1), FillOperation.REPLACE) blocks.fill(PINK_STAINED_GLASS, pos(F_X - 1, F_Y + 3, F_Z), pos(F_X - 1, F_Y + stairs, F_Z), FillOperation.REPLACE) blocks.fill(BLUE_STAINED_GLASS, pos(F_X + 1, F_Y + 3, F_Z), pos(F_X + 1, F_Y + stairs, F_Z), FillOperation.REPLACE) blocks.fill(THEAM_BLOCK, pos(F_X + 2, F_Y + 1, F_Z-1), pos(F_X + 2, F_Y + stairs, F_Z-1), FillOperation.REPLACE) blocks.fill(THEAM_BLOCK, pos(F_X - 2, F_Y + 1, F_Z-1), pos(F_X - 2, F_Y + stairs, F_Z-1), FillOperation.REPLACE) blocks.fill(THEAM_BLOCK, pos(F_X, F_Y + 1, F_Z-1), pos(F_X, F_Y + stairs, F_Z-1), FillOperation.REPLACE) else: # エレベータを積み重ねて建築 for i in range(MAX_NUM-1): player.say("エージェント「" + str(F_Y_B+2) + "~"+ str(F_Y_A+1) + "階を建築中!」") blocks.fill(THEAM_BLOCK, pos(F_X - 2, F_Y_B, F_Z + 2), pos(F_X + 2, F_Y_A, F_Z + 2), FillOperation.REPLACE) blocks.fill(THEAM_BLOCK, pos(F_X - 2, F_Y_B, F_Z), pos(F_X - 2, F_Y_A, F_Z + 1), FillOperation.REPLACE) blocks.fill(THEAM_BLOCK, pos(F_X, F_Y_B, F_Z), pos(F_X, F_Y_A, F_Z + 1), FillOperation.REPLACE) blocks.fill(THEAM_BLOCK, pos(F_X + 2, F_Y_B, F_Z), pos(F_X + 2, F_Y_A, F_Z + 1), FillOperation.REPLACE) if i == 0: blocks.fill(PINK_STAINED_GLASS, pos(F_X - 1, F_Y + 3, F_Z), pos(F_X - 1, F_Y_A, F_Z), FillOperation.REPLACE) blocks.fill(BLUE_STAINED_GLASS, pos(F_X + 1, F_Y + 3, F_Z), pos(F_X + 1,F_Y_A, F_Z), FillOperation.REPLACE) blocks.fill(THEAM_BLOCK, pos(F_X + 2, F_Y + 1, F_Z-1), pos(F_X + 2, F_Y_A, F_Z-1), FillOperation.REPLACE) blocks.fill(THEAM_BLOCK, pos(F_X - 2, F_Y + 1, F_Z-1), pos(F_X - 2,F_Y_A, F_Z-1), FillOperation.REPLACE) blocks.fill(THEAM_BLOCK, pos(F_X, F_Y + 1, F_Z-1), pos(F_X, F_Y_A, F_Z-1), FillOperation.REPLACE) blocks.fill(TORCH, pos(F_X, F_Y + 1, F_Z - 2), pos(F_X, F_Y_A, F_Z - 2), FillOperation.REPLACE) else: blocks.fill(PINK_STAINED_GLASS, pos(F_X - 1, F_Y_B, F_Z), pos(F_X - 1, F_Y_A, F_Z), FillOperation.REPLACE) blocks.fill(BLUE_STAINED_GLASS, pos(F_X + 1, F_Y_B, F_Z), pos(F_X + 1,F_Y_A, F_Z), FillOperation.REPLACE) blocks.fill(THEAM_BLOCK, pos(F_X + 2, F_Y_B, F_Z-1), pos(F_X + 2, F_Y_A, F_Z-1), FillOperation.REPLACE) blocks.fill(THEAM_BLOCK, pos(F_X - 2, F_Y_B, F_Z-1), pos(F_X - 2,F_Y_A, F_Z-1), FillOperation.REPLACE) blocks.fill(THEAM_BLOCK, pos(F_X, F_Y_B, F_Z-1), pos(F_X, F_Y_A, F_Z-1), FillOperation.REPLACE) blocks.fill(TORCH, pos(F_X, F_Y_B, F_Z - 2), pos(F_X, F_Y_A, F_Z - 2), FillOperation.REPLACE) F_Y_B = F_Y_A F_Y_A = F_Y_A + ELEVATOR_UNIT calNum = calNum + 1 LAST_Y = stairs - calNum * ELEVATOR_UNIT + F_Y_B # エレベータを積み重ねて建築 最終階 if stairs - calNum * ELEVATOR_UNIT > 0: player.say("エージェント「" + str(F_Y_B+2) + "~"+ str(F_Y_A+1) + "階を建築中!」") blocks.fill(THEAM_BLOCK, pos(F_X - 2, F_Y_B, F_Z + 2), pos(F_X + 2, LAST_Y, F_Z + 2), FillOperation.REPLACE) blocks.fill(THEAM_BLOCK, pos(F_X - 2, F_Y_B, F_Z), pos(F_X - 2, LAST_Y, F_Z + 1), FillOperation.REPLACE) blocks.fill(THEAM_BLOCK, pos(F_X, F_Y_B, F_Z), pos(F_X, LAST_Y, F_Z + 1), FillOperation.REPLACE) blocks.fill(THEAM_BLOCK, pos(F_X + 2, F_Y_B, F_Z), pos(F_X + 2, LAST_Y, F_Z + 1), FillOperation.REPLACE) blocks.fill(PINK_STAINED_GLASS, pos(F_X - 1, F_Y_B, F_Z), pos(F_X - 1, LAST_Y, F_Z), FillOperation.REPLACE) blocks.fill(BLUE_STAINED_GLASS, pos(F_X + 1, F_Y_B, F_Z), pos(F_X + 1, LAST_Y, F_Z), FillOperation.REPLACE) blocks.fill(THEAM_BLOCK, pos(F_X + 2, F_Y_B, F_Z-1), pos(F_X + 2, LAST_Y, F_Z-1), FillOperation.REPLACE) blocks.fill(THEAM_BLOCK, pos(F_X - 2, F_Y_B, F_Z-1), pos(F_X - 2, LAST_Y, F_Z-1), FillOperation.REPLACE) blocks.fill(THEAM_BLOCK, pos(F_X, F_Y_B, F_Z-1), pos(F_X, LAST_Y, F_Z-1), FillOperation.REPLACE) blocks.fill(TORCH, pos(F_X, F_Y_B, F_Z - 2), pos(F_X, LAST_Y, F_Z - 2), FillOperation.REPLACE) # エレベータ屋上 blocks.fill(THEAM_BLOCK, pos(F_X - 2, F_Y + stairs + 1, F_Z+2), pos(F_X + 2, F_Y + stairs + 3, F_Z+2), FillOperation.REPLACE) blocks.fill(THEAM_BLOCK, pos(F_X + 2, F_Y + stairs + 1, F_Z+1), pos(F_X + 2, F_Y + stairs + 3, F_Z+1), FillOperation.REPLACE) blocks.fill(THEAM_BLOCK, pos(F_X - 2, F_Y + stairs + 1, F_Z+1), pos(F_X - 2, F_Y + stairs + 3, F_Z+1), FillOperation.REPLACE) blocks.fill(THEAM_BLOCK, pos(F_X, F_Y + stairs + 1, F_Z+1), pos(F_X, F_Y + stairs + 3, F_Z+1), FillOperation.REPLACE) blocks.fill(THEAM_BLOCK, pos(F_X - 2, F_Y + stairs, F_Z-1), pos(F_X + 2, F_Y + stairs, F_Z-1), FillOperation.REPLACE) blocks.fill(THEAM_BLOCK, pos(F_X - 0, F_Y + stairs + 1, F_Z + 1), pos(F_X - 0, F_Y + stairs + 3, F_Z + 1), FillOperation.REPLACE) blocks.fill(THEAM_BLOCK, pos(F_X - 1, F_Y + stairs + 3, F_Z + 1), pos(F_X - 1, F_Y + stairs + 3, F_Z + 1), FillOperation.REPLACE) blocks.fill(THEAM_BLOCK, pos(F_X + 1, F_Y + stairs + 3, F_Z + 1), pos(F_X + 1, F_Y + stairs + 3, F_Z + 1), FillOperation.REPLACE) # パネルつける useAgent(199,DOWN,F_X-1,F_Y + 1,F_Z) useAgent(199,DOWN,F_X+1,F_Y + 1,F_Z) useAgent(199,UP,F_X-1,F_Y + 2,F_Z) useAgent(199,UP,F_X+1,F_Y + 2,F_Z) before_p = player.position() i = 1 stempNum = 0 blocks.fill(8, pos(F_X + 1, F_Y + 1, F_Z + 1),pos(F_X + 1, F_Y + stairs, F_Z + 1), FillOperation.REPLACE) blocks.fill(8, pos(F_X - 1, F_Y + 1, F_Z + 1),pos(F_X - 1, F_Y + stairs, F_Z + 1), FillOperation.REPLACE) # エレベータの地面を置き換え blocks.place(blocks.block_with_data(SOUL_SAND, 1), pos(F_X +1, F_Y, F_Z + 1)) blocks.place(blocks.block_with_data(MAGMA_BLOCK, 1), pos(F_X -1, F_Y, F_Z + 1)) # 足場撤去 removeScaffold(stairs) player.say("エージェント「終わったあああああ」") agent.teleport_to_player() # 入力位置を最初の位置からのポジションずらす 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 useAgent(itemName,direction,ax,ay,az): agent.set_item(itemName,64,1) agent.set_slot(1) agent.teleport(pos(ax, ay, az), NORTH) agent.place(direction) # 足場作成 def buildScaffold(stempNum,SCAFFOLD_UNIT=5): blocks.fill(GLASS, pos(-1,0,-1), pos(1,SCAFFOLD_UNIT,1), FillOperation.REPLACE) blocks.fill(GLASS, pos(-1,SCAFFOLD_UNIT+1,-1), pos(1,SCAFFOLD_UNIT+2,-1), FillOperation.REPLACE) blocks.fill(GLASS, pos(-1,SCAFFOLD_UNIT+1,1), pos(1,SCAFFOLD_UNIT+2,1), FillOperation.REPLACE) blocks.fill(GLASS, pos(-1,SCAFFOLD_UNIT+1,0), pos(-1,SCAFFOLD_UNIT+2,0), FillOperation.REPLACE) blocks.fill(GLASS, pos(1,SCAFFOLD_UNIT+1,0), pos(1,SCAFFOLD_UNIT+2,0), FillOperation.REPLACE) player.teleport(pos(0, SCAFFOLD_UNIT + 2, 0)) return stempNum + 1 # 足場撤去 def removeScaffold(stairs): blocks.fill(AIR, pos(-1,0,-1), pos(1,stairs,1), FillOperation.REPLACE) # ############################################ # 呼び出し用メソッド # ############################################ # チャット 最初に位置に戻す def on_on_chat(): agent.teleport_to_player() player.say("完了") player.on_chat("tp", on_on_chat) # チャット 位置確認 def on_on_chat0(): blocks.place(REDSTONE_BLOCK, pos(F_X,F_Y,F_Z)) player.say("完了") player.on_chat("compass", on_on_chat0) # チャット エレベーター建築 def on_on_chat2(stairs=0,num=1): if 2 < stairs and stairs <= MAX_STAIRS: if num == 0: num = 1 player.say("=========== 開始! ===========") for i in range(num): if i > 0:player.teleport(pos(E_INTERVAL, 0 , 0)) player.say(str(i+1) + "件目 開始!") buildElevator2(stairs) player.say(str(i+1) + "件目 完了!") player.say("=========== 完了! ===========") else : player.say("実行コマンド:build [エレベータの階層] <オプション:エレベータの数>") player.say("エレベータの階層は 3 ~ " + MAX_STAIRS + "の数字を入力してください") player.say("コマンド入力例):build 5 1") player.on_chat("build", on_on_chat2) |
「高さ自由のエレベーター」プログラミングを実行する上での注意点
まずこのプログラムを実行する上での注意点です。
- プログラミングを実行中はプレイヤー(つまり自分自身)を絶対に動かさないこと!
- プログラムを実行する前に「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 開発のお役に立てれば幸いです。
ではでは