コンテンツにスキップ

ブロックから Python へ

かんたんブロックで組んだ bot は、裏では Python のプログラムになっています。 ここでは、同じ動きをブロックと Python で並べて見ます。 Python を書けるようになると、ブロックにない作戦(偏差射撃・経路探索など)も使えます。

下の 3 つの例は、上がブロック、下が Python です。 ブロックの右の番号と、Python の右の # 番号 が、同じ動きです。

例 1:敵のほうを向いて、前に進む

Section titled “例 1:敵のほうを向いて、前に進む”

かんたんブロックの並び(番号つき):1 敵の方を向く、2 前に進む

def update(state):
me = state["me"]
en = state["enemy"]
# さいしょは「止まる・いまの向き・撃たない・バリアなし」
drive = "stop"
steer = me["angle"]
fire = False
barrier = False
# 作戦(かんたんブロックで組んだところ)
steer = angle_to(me["x"], me["y"], en["x"], en["y"]) # 1
drive = "forward" # 2
return {"drive": drive, "steer": steer, "fire": fire, "barrier": barrier}

Python は、3 つのかたまりに分けると読めます。

かたまり何をしているか
はじめの 2 行ゲームからもらう情報(センサー)から、自分(me)と敵(en)を取り出す
「さいしょは…」の 4 行4 つの動き(drive steer fire barrier)に、いったんの値を入れる
「作戦」の部分ブロックで置いたところ。 上から順に、動きを上書きしていく(あとから置いたほうが勝つ

最後の return が、4 つをまとめてゲームに返します。ブロックは、この「上書き」を 1 つずつ並べたものです。

かんたんブロックの並び(番号つき):1 敵の方を向く、2 前に進む、3 もし 敵が見える かつ いま撃てる ならば、4 撃つ

steer = angle_to(me["x"], me["y"], en["x"], en["y"]) # 1
drive = "forward" # 2
if (line_of_sight(state["map"]["grid"], me["x"], me["y"], en["x"], en["y"]) # 3
and me["can_fire"]):
fire = True # 4
ブロックPython
❓ もしif
かつand
👁 敵が見えるline_of_sight という道具
🔋 いま撃てるme["can_fire"]

かんたんブロックの並び(番号つき):1 もし 弾がとんでくる(もうすぐ)ならば、2 弾をよける向きの方を向く、3 前に進む、4 そうでなければ、5 敵の方を向く、6 撃つ

if 弾まで < 1.2: # 1
steer = 弾をよける向き # 2
drive = "forward" # 3
else: # 4
steer = angle_to(me["x"], me["y"], en["x"], en["y"]) # 5
fire = True # 6
  • 「そうでなければ」は else です
  • 「弾がとんでくる」を使うと、作戦の前に「いちばん早く届く弾を調べる」部分が足されます(弾まで などの変数は、そこで作られています)
  • 変数の名前に日本語が使えることも、ここで分かります

かんたんブロックの画面にある「⬆ ステップアップ」を押すと、同じ bot を、もっと細かく決められるブロック(🧩 ブロック)で開けます。 bot の中身は変わりません。並べて見る「🔀 スプリット」なら、ブロックと Python を同時に見られます。

書きかた向いている人
🔰 かんたんブロックプログラムがはじめて。文字を打ちたくない
🧩 ブロックPython と同じことをブロックでやりたい
🐍 Python文字で書きたい。ブロックにない作戦を使いたい
📄 DNCL共通テストの書き方で読みたい(対訳表
🔀 スプリットブロックと Python を並べて、対応を見たい

Python で書くときに、まず覚えること

Section titled “Python で書くときに、まず覚えること”

やりたいことから探すなら、やりたいこと別レシピへ。