Minecraft PiEditionでPythonとエレクトロニクスを学ぶ

Minecraft PiEditionでPythonとエレクトロニクスを学ぶ

あなたはいつもコーディングを学びたいと思っていましたが、どこから始めればよいのかわかりませんでしたか? Pythonといくつかの簡単な電子機器を使用して、RaspberryPiでMinecraftを制御する方法を学びます。最終結果は次のとおりです。





このプロジェクトにはPi2以降が必要です。これらのタスクのほとんどは、Secure Shell(SSH)を介したコマンドラインから実行できますが、このチュートリアルでは、Piで直接コーディングすることに焦点を当てます。





Minecraftは初めてですか?心配しないでください-これが私たちの Minecraftビギナーズガイド





MinecraftPiの紹介

Minecraft for Raspberry Piは、学習と調整のために開発されました(無料です)。コードがMinecraftと簡単に通信する方法を提供するアプリケーションプログラミングインターフェイス(API)が付属しています。 Pythonでのコーディング方法を学び、電子機器を使い始めるのに最適です。

Pythonとは何ですか?

Python プログラミング言語です。です 通訳 つまり、Pythonファイルまたはプログラムを実行するとき、コンピューターは最初にファイルに対してわずかな作業を行う必要があります。欠点は、コンパイルされた言語と比較すると遅いと見なされる可能性があることです[壊れたURLが削除されました]。



インタプリタ言語の利点は、コーディングの速度とその使いやすさです。あなたはコンピュータに言う必要はありません あなたが保存したいデータ、あなたが何かを保存したいというだけで、コンピュータは何をすべきかを理解します。もちろん例外もあり、これはやや単純化されたビューですが、プログラミングは楽しいはずです!複雑な技術的詳細を掘り下げ始めると、少し面倒になる可能性があります。

Pythonでは大文字と小文字が区別されます。 Pythonはオブジェクトを認識しないため、これを知っておくことが重要です。 スペルが正しくても ケースが間違っている場合。メソッドが実際に「DoSomething()」と呼ばれる場合、「Dosomething()」は機能しません。 Pythonもインデントを使用します 。他のプログラミング言語は、コードのインデントの数を気にしないかもしれませんが、Pythonは NS ケア。インデントは、コードがどこに属するかをPythonに伝えるために使用されます。他の言語では、コードをグループ化するために「中括弧」({})を使用する場合があります。Pythonはこれらを使用しません。 Pythonはコメントにハッシュ(#)を使用し、コメントは他の開発者やコードを見ている人々に特定の部分が何をするのか、なぜそれが必要なのかを伝えるために使用されます。 Pythonはハッシュの後は何も無視します。





最後に、Pythonには2つの主要なバージョンがあります-Python2.7.xとPython3.xです。 2つの間にいくつかの違いがあります( 違いは何ですか? )。このチュートリアルではPython3を使用します。

初期設定

あなたの円周率を提供することはすでにです Raspbianのセットアップと実行 、初期設定はそれほど必要ありません。





オープンターミナル( メニュー>アクセサリー>ターミナル )そしてこのコマンドを実行します。リポジトリリストを最新の状態に保つことは常に良い習慣です。これにより、プログラムの最新リストがダウンロードされます(プログラム自体はダウンロードされません。これにより、Piはどのプログラムが呼び出され、どこにあるかを知ることができます)。

sudo apt-get update

次に、Piを更新します(これにはしばらく時間がかかる場合があります)。

sudo apt-get upgrade

PythonとMinecraftPiはすでにインストールされていますが、何らかの理由でMinecraft Piがインストールされていない場合は、簡単にインストールできます。

sudo apt-get install minecraft-pi

ドキュメントに移動し、「Minecraft」という新しいフォルダを作成します。

cd Documents/
mkdir Minecraft

この新しいフォルダの内容を表示できます。

ls

ヒントは次のとおりです。入力を開始してTabキーを押すと、コマンドラインでステートメントがオートコンプリートされます。

Print Working Directoryの略であるpwdを使用して、現在のディレクトリへのパスを調べることができます。

pwd

に移動してMinecraftを開始します メニュー>ゲーム> Minecraft Pi 。これを実行する必要がありますが、後で戻ってきます。

からPython3を開く メニュー>プログラミング> Python 3(IDLE) 。このプログラムは、Pythonコマンドを実行してプログラムを作成する方法を提供します。

ここでPythonコマンドを入力できますが、それはあまり実用的ではありません。に移動 ファイル>新しいファイル その後 ファイル>保存 これを前に作成したフォルダに保存します。 (( ドキュメント> Minecraft )。それを呼びましょう ' hello_world.py '。 .py拡張子を使用する必要はありません。これは自動的に追加されますが、これは良い習慣です。

ターミナルに戻ってMinecraftフォルダーに移動すると、作成したファイルが表示されます。

cd Minecraft/
ls

このファイルは次のように実行できます。

python hello_world

'python'がすべて小文字であることに注意してください。次のファイルはPythonであることがPiに通知されるため、これはファイル名の前にある必要があります。そのため、そのように実行する必要があります。

Pythonエディターに戻り、次のように入力します。

print 'Hello, World!'

このファイルを保存して再度実行すると、「Hello、World!」と表示されます。コマンドラインに表示されます-きちんと! printコマンドは、次のテキストを二重引用符で囲むようにPythonに指示するだけです。これは良いことですが、Minecraftにとってはそれほど有用ではありません。リンクしてみましょう。

from mcpi.minecraft import Minecraft
mc = Minecraft.create()
mc.postToChat('Hello, World!')

このファイルを保存して実行すると、「Hello、World!」と表示されます。 Minecraftゲームに表示されます。コードを分解してみましょう:

from mcpi.minecraft import Minecraft

この行は、別のファイルのコードを使用することをPythonに通知します。このmcpi.minecraftファイルは、Minecraftを簡単に制御できるようにするために開発されました。

mc = Minecraft.create()

この行は、「mc」(Minecraft)というオブジェクトを作成します。 Minecraftゲームとの通信を可能にするには、これを作成する必要があります。ファイルを含めるだけでは不十分です。

mc.postToChat('Hello, World!')

最後に、この行はMinecraftにチャットにテキストを書き込むように指示します。 「Hello、World!」を変更してみてください。他の何かに移動して何が起こるかを確認しますが、両方の二重引用符を含めることを忘れないでください。ソフトウェアに問題がある場合、これらはいくつかの一般的なPythonおよびMinecraftPiエラーです。

  • AttributeError-これは、printではなくpintやprntなどのタイプミスです。
  • NameError:名前 'Minecraft'が定義されていません-必要なモジュールをインポートすることを忘れないでください
  • NameError:名前「true」が定義されていません-Pythonでは大文字と小文字が区別されます。「True」に変更してください
  • socket.error:[Errno111]接続が拒否されました-Minecraftが実行されていることを確認してください

プロジェクト

PythonとMinecraftの基本を理解したところで、いくつかのクールなプロジェクトを作成しましょう。すべてのコードはGithubからダウンロードできます。

自動ブリッジビルダー

このプログラムは、効果的に水に架かる橋を建設します。プレイヤーが水域に近づくと、プログラムはいくつかのブロックを石に変換します。 Minecraftは座標系を使用しているため、プレーヤーの位置と、プレーヤーの周囲のブロックのタイプを簡単に取得できます。 Minecraft Piはわずかに制限されているため、複数の異なるブロックを一括で更新することはできません。ただし、この動作は自分で簡単にコーディングできます。

新しいファイルを作成します( ファイル>新しいファイル )そしてそれを 'として保存します bridge_builder.py '。

from mcpi.minecraft import Minecraft
mc = Minecraft.create() # create Minecraft Object
while True:
x, y, z = mc.player.getPos() # store player position

# store the surrounding blocks
a = mc.getBlock(x, y - 1, z + 1)
b = mc.getBlock(x, y - 1, z - 1)
c = mc.getBlock(x - 1, y - 1, z)
d = mc.getBlock(x + 1, y - 1, z)
if a == 8 or a == 9 or b == 8 or b == 9 or c == 8 or c == 9 or d == 8 or d == 9:
# 8 or 9 is water. Set surrounding blocks on floor to a solid (stone) if water is found
mc.setBlocks(x, y - 1, z, x + 1, y - 1, z + 1, 1)
mc.setBlocks(x, y - 1, z, x - 1, y - 1, z - 1, 1)
mc.setBlocks(x, y - 1, z, x - 1, y - 1, z + 1, 1)
mc.setBlocks(x, y - 1, z, x + 1, y - 1, z - 1, 1)

y値が実際にy-1をどのように見ているかに注意してください。これはフロアレベルです。 yの値が使用された場合、スクリプトはほぼ膝の高さでブロックを探します-それはあまりうまく機能しません! Mc.getBlock() 指定された座標のブロックのIDを返します。 x、y、zはプレーヤーの座標であるため、これらを加算または減算して、プレーヤーの周囲の位置を取得できます。 x、y、zの値を使用する必要はなく、任意の数値を使用できますが、その特定のブロックがプレーヤーにどのように関連しているかわからない場合があります。プレーヤーに関連する値を使用することをお勧めします。コマンドラインからこのファイルを実行して、何が起こるかを確認します。

プレイヤーが水域に到達すると、地面の小さな領域が石に変わることがわかります。それは素晴らしいことではありません-あなたは問題を引き起こすのに十分速く歩くことができます。これは、大量の水を土地に変換することで解決できます。 mc.setBlocks()メソッドの最後の部分はブロックIDです。 1つは石のブロックIDです。これを木や草などに変えることができます。必要に応じて、これを非常に簡単に複雑な設計に変換できます。おそらく吊橋です。

スーパーマイニングボタン

この例では、マイニングの短い作業を行います。これは物理的なボタンで構成されており、押すと10ブロックの立方体がマイニングされます。ボタンから始めましょう。 Arduinoのボタンと同様に、少量の電子機器が必要になります。これらはすべて、基本的なスターターキットに含まれている必要があります。

  • 1xブレッドボード
  • 1xモーメンタリスイッチ
  • 1 x220オーム抵抗器
  • メス>オスジャンプケーブル
  • オス>オスジャンプケーブル

回路は次のとおりです。

Pi-Button-接続

この抵抗は「プルダウン」抵抗と呼ばれます。 Piが考えているのはボタンが押されていること、実際にはボタンが押されていることを確認するのに役立ちます。これを使用する必要はありませんが、これを使用しないと多くのノイズや誤った読み取り値が見つかる可能性があるため、これを使用することをお勧めします。

ボタンは汎用入出力(GPIO)ピン14に接続されています。任意のGPIOピンを使用できますが、 ピン配置 まず、すべてがPiから制御できるわけではなく、モデル間でわずかに異なるためです。

ボタンが接続されたので、それをテストする時が来ました。新しいファイルを作成し、 'として保存します button_test.py '。このコードを追加して保存し、ターミナルで実行します。

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM) # tell the Pi what headers to use
GPIO.setup(14, GPIO.IN) # tell the Pi this pin is an input
while True:
if GPIO.input(14) == True: # look for button press
print 'BUTTON WORKS!' # log result
time.sleep(0.5) # wait 0.5 seconds

押す コントロール+ C スクリプトを停止します。すべてが正しく機能している場合は、「BUTTONWORKS!」と表示されます。ターミナルで。 Minecraftモジュールと同様に、このテストでRPi.GPIOモジュールと時間モジュールがどのように使用されているかに注目してください。これらにより、Piはハードウェアピンにアクセスし、便利なタイミング機能を提供できます。

それでは、残りのコードを完成させましょう。 'という新しいファイルを作成します super_mine.py '。コードは次のとおりです。

import RPi.GPIO as GPIO
import time
from mcpi.minecraft import Minecraft
mc = Minecraft.create() # create Minecraft Object
GPIO.setmode(GPIO.BCM) # tell the Pi what headers to use
GPIO.setup(14, GPIO.IN) # tell the Pi this pin is an input
while True:
if GPIO.input(14) == True: # look for button press
x, y, z = mc.player.getPos() # read the player position
mc.setBlocks(x, y, z, x + 10, y + 10, z + 10, 0) # mine 10 blocks
mc.setBlocks(x, y, z, x - 10, y + 10, z - 10, 0) # mine 10 blocks
time.sleep(0.5) # wait 0.5 seconds

mc.player.getPos() プレーヤーの現在の座標を返します。この座標は、x、y、zに保存されます。 NS setBlocks() メソッドは、開始と終了の間のすべてのブロックを次のブロックで埋めるようにMinecraftに指示します。ゼロは空気のブロックIDです。これを別のブロックIDに変更して、領域を塗りつぶすことができます。座標を+100または+1000ブロックに変更することもできますが、気が狂いすぎるとPiが苦労し始める可能性があります。 y +10が両方の線で同じであることに注意してください。地下のブロックを削除したい場合は、これをy-10に変更できます。

テレポート

このボタンのもう1つの簡単な使用法は、「テレポート」することです。 Minecraft Pi Apiは、プレーヤーの位置を設定する方法を提供します。次のコードは、プレーヤーを事前設定された場所に「テレポート」します。

mc.player.setPos(0, 0, 0)

彼のメソッドは3つのパラメーターを受け入れることに注意してください。 x、y、z –これらを任意に設定して、プレーヤーをその場所に即座にテレポートできます。

super_mineファイルのコピーを作成します( ファイル>名前を付けてコピーを保存 )そして、ifを次のように置き換えて変更します。

if GPIO.input(14) == True: # look for button press
mc.player.setPos(0, 0, 0) # teleport player
time.sleep(0.5) # wait 0.5 seconds

このファイルは次のようになります。

import RPi.GPIO as GPIO
from mcpi.minecraft import Minecraft
import time
mc = Minecraft.create() # create Minecraft Object
GPIO.setmode(GPIO.BCM) # tell the Pi what headers to use
GPIO.setup(14, GPIO.IN) # tell the Pi this pin is an input
while True:
if GPIO.input(14) == True: # look for button press
mc.player.setPos(0, 0, 0) # teleport player
time.sleep(0.5) # wait 0.5 seconds

'として保存 teleport.py 'そして実行します。

これを使用すると、プレーヤーがいくつかのブロック内でスタックする場合があります。その場合、座標を既知のオープンスペースに調整する必要があります(画面の左上に現在の場所が表示されます)。

家を建てる

このボタンの最後のタスクは、家を建てることです。上記のクイックマイニングの例と同じように、これは単にプレイヤーを囲むブロックを置き換えて家を作ります。さまざまな材料(窓、壁など)にさまざまなブロックIDが使用されます。コーディングを容易にするために、中実のブロックが作成され、次に内部が削除されます(ブロックが空気に設定されます)。これにより、中空のシェルが作成されます。ベッドやドアなどのエクストラを追加することもできますが、Minecraft Piプロジェクトは少し不完全であり、これらのオブジェクトはプレーヤーが配置すると機能しますが、Pythonを使用すると見事ではありません。

from mcpi.minecraft import Minecraft
import RPi.GPIO as GPIO
import time
mc = Minecraft.create() # create Minecraft Object
GPIO.setmode(GPIO.BCM) # tell the Pi what headers to use
GPIO.setup(14, GPIO.IN) # tell the Pi this pin is an input
while True:
if GPIO.input(14) == True:
x, y, z = mc.player.getPos()
mc.setBlocks(x + 2, y - 1, z + 2, x + 7, y + 3, z + 8, 5) # make shell
mc.setBlocks(x + 3, y, z + 3, x + 6, y + 2, z + 7, 0) # remove inside
mc.setBlocks(x + 2, y, z + 5, x + 2, y + 1, z + 5, 0) # make doorway
mc.setBlocks(x + 4, y + 1, z + 8, x + 5, y + 1, z + 8, 102) # make window 1
mc.setBlocks(x + 4, y + 1, z + 2, x + 5, y + 1, z + 2, 102) # make window 2
mc.setBlocks(x + 7, y + 1, z + 4, x + 7, y + 1, z + 6, 102) # make window 3

これを 'として保存 house.py 'そして実行します。すべてが順調で、小さな家が現れるはずです(それを見つけるために振り返る必要があるかもしれません)。それは非常にシンプルで、開口部といくつかの窓があります。理論的には、建設できる建物の大きさや複雑さに制限はありません。

ミニゲームを作る

次に、ミニゲームを作ろう!これは非常に簡単です。プレーヤーが砂のブロックを踏むと、ランダムな時間が経過すると溶岩に変わります。独自のレベルを設計したり、レベルを変更して物事を難しくしたりできるので、これは作成するのに適したゲームです。この例ではボタンは必要ありません。

新しいファイルを作成し、 'として保存します mini_game.py '。コードは次のとおりです。

from mcpi.minecraft import Minecraft
import random
import time
mc = Minecraft.create() # create Minecraft Object
while True:
x, y, z = mc.player.getPos()
block_under_player = mc.getBlock(x, y - 1, z)

if block_under_player == 12:
# player standing on sand, start the timer
random_time = random.uniform(0.1, 2.5) # generate random number
time.sleep(random_time); # wait
mc.setBlock(x, y - 1, z, 11) # turn it into lava

このコードは、 ランダム() 関数: random.uniform(0.1、2.5) 0.1(1/10秒)から2.5(2 1/2秒)の間の乱数を生成します。これらの数字を増やすと、ゲームが簡単になります。

やってみて!砂のブロックの上に立つと、すぐに溶岩に変わります。これは、より複雑なゲームの基礎になる可能性があります。

別のミニゲームを作る

このゲームの前提は単純です-時間がなくなったときに木の床に立ってはいけません。プレイヤーは「アリーナ」にテレポートされます。ゲームが始まるまで、彼らは静止することを余儀なくされます。開始すると、タイマーが切れると床が水に変わります。プレイヤーは生き残るためにセーフゾーン(ダイアモンドブロック)に立っている必要があります。レベルごとにタイマーが1秒ずつ減ります。レベルが成功するたびに、安全領域が大きくなります。以下のコードを確認してください。

import time
import random
from mcpi.minecraft import Minecraft
mc = Minecraft.create() # create Minecraft Object
# clear area
mc.setBlocks(-10, 1, -10, 25, 5, 25, 0)
# create arena shell
mc.setBlocks(0, 0, 0, 25, 10, 25, 17)
# hollow out arena
mc.setBlocks(1, 1, 1, 24, 10, 24, 0)
# move player to arena
mc.player.setPos(14, 25, 20) # teleport player
# make them stay put
# teleport player to start position every 1/10th second.
# do this for 5 seconds then start the game
time.sleep(2)
total_wait = 0
mc.postToChat('Waiting to Start')
while total_wait <5:
mc.player.setPos(14, 1, 20) # teleport player
time.sleep(0.1)
total_wait += 0.1
mc.postToChat('BEGIN!')
# 10 levels
for level in range(10):
x, y, z = mc.player.getPos()
level_time = 10 - level # reduce time by 1 second for each level
mc.postToChat('Level - ' + str(level + 1) + ' start')
# build floor
mc.setBlocks(0, 0, 0, 25, 0, 25, 17)
# make safe area
safe_area_start = random.uniform(0, 22)
safe_area_end = random.uniform(0, 22)
mc.setBlocks(safe_area_start, 0, safe_area_end, safe_area_start + level, 0, safe_area_end + level, 57)
elapsed_time = 0
while elapsed_time <10:
x, y, z = mc.player.getPos()
time.sleep(0.25)
elapsed_time += 0.25
# check player is still on floor
if y <0.75:
mc.postToChat('Game Over')
break;
else:
# remove floor
mc.setBlocks(-10, 0, -10, 25, 0, 25, 8)
# put safe area back
mc.setBlocks(safe_area_start, 0, safe_area_end, safe_area_start + level, 0, safe_area_end + level, 57)
time.sleep(2.5)
continue
break

これを 'として保存 mini_game_2.py 'そしてそれを実行します。

Pi 2には、Minecraftの実行中にいくつかのパフォーマンスの問題があります。中央処理装置(CPU)の使用状況グラフ( 右上隅 )重い負荷が表示されることはないため、これは開発者による不十分な設計と最適化によるものである必要があります。これらの問題は、コードの実行とは関係ありません(Pythonが実行されていないときにも発生するため)が、このミニゲームによってさらに複雑になります。 Piが本当に苦労している場合は、アリーナのサイズを小さくするか、Piをオーバークロックすることをお勧めします。

専用のビデオRAMウィンドウを増やす方法10

ダイヤモンド検出器

別の回路を作ってみましょう。これは、発光ダイオード(LED)を使用して、下にダイヤモンドがある場合(15ブロック以内)に点灯します。必要なものは次のとおりです。

  • 1xブレッドボード
  • 1 x LED
  • 1 x220オーム抵抗器
  • メス>オスジャンプケーブル
  • オス>オスジャンプケーブル

回路は次のとおりです。

アノード(ロングレッグ)をGPIOピン14に接続します。このピンは+ 5vのように機能します。カソード(ショートレッグ)をアースに接続します。

安価な鉱石のおもちゃを使用し、背面カバーと電子機器を取り外して改造し、その下にLEDを配置しました。ホットグルーなどで簡単にパーマネントにすることができます。

このコードを 'として保存します Diamonds.py ':

import RPi.GPIO as GPIO
import time
from mcpi.minecraft import Minecraft
mc = Minecraft.create() # create Minecraft Object
led_pin = 14 # store the GPIO pin number
GPIO.setmode(GPIO.BCM) # tell the Pi what headers to use
GPIO.setup(14, GPIO.OUT) # tell the Pi this pin is an output
while True:
# repeat indefinitely
x, y, z = mc.player.getPos()
for i in range(15):
# look at every block until block 15
if mc.getBlock(x, y - i, z) == 56:
GPIO.output(led_pin, True) # turn LED on
time.sleep(0.25) # wait
GPIO.output(led_pin, False) # turn LED off
time.sleep(0.25) # wait

プレーヤーの下(15ブロック以内)にダイヤモンド鉱石ブロックがある場合、ライトが点滅します。

ThinkGeekMinecraftライトアップブルーストーンダイヤモンド鉱石-ピグメンを遠ざけることを忘れないでください アマゾンで今すぐ購入

Minecraft Piで何かクールなものを作りましたか?コメントで、あなたが何をしたか、またはゲームでどこまで達成したかを教えてください。

私たちがお勧めし、議論するアイテムを気に入っていただければ幸いです。 MUOはアフィリエイトとスポンサーのパートナーシップを持っているので、私たちはあなたの購入のいくつかから収入の一部を受け取ります。これはあなたが支払う価格に影響を与えることはなく、私たちが最高の製品の推奨を提供するのに役立ちます。

共有 共有 つぶやき Eメール Windows 11にアップグレードする価値はありますか?

Windowsが再設計されました。しかし、それはWindows10からWindows11に移行するように説得するのに十分ですか?

次を読む
関連トピック
  • DIY
  • プログラミング
  • マインクラフト
  • ラズベリーパイ
  • エレクトロニクス
  • Python
著者について ジョーコバーン(136件の記事が公開されました)

Joeは、英国のリンカーン大学でコンピュータサイエンスを卒業しています。彼はプロのソフトウェア開発者であり、ドローンを飛ばしたり音楽を書いたりしていないときは、写真を撮ったりビデオを制作したりしていることがよくあります。

ジョーコバーンのその他の作品

ニュースレターを購読する

ニュースレターに参加して、技術的なヒント、レビュー、無料の電子書籍、限定セールを入手してください。

購読するにはここをクリックしてください
カテゴリ Diy