【農家は Replace() されました】第13回 インポート|ギャルから学ぶドローン農業【超初心者向け攻略】

当記事はChatGPTが出力した文章を使用しています。

 

このゲームの関連記事

www.himajin-block30.com

 

前回

www.himajin-block30.com

 

インポート(import)は、コードを“科目別ノート”に分けてキレイに保つ魔法


何ができるの?(一言で)

  • 別ファイルに書いた関数や変数を、今のファイルから使えるようにする

  • 例:import jobsjobs.do_carrot() みたいに呼べる。


3つの書き方と使い分け

  1. import module(推し💖)
    名前空間を分けて安全。「どこから来た関数か」が一目でわかる。

    import jobs
    jobs.do_bush()
    
  2. from module import name(少数だけ使いたい時)

    from movement import snake_step
    going_right, going_up = snake_step(size, going_right, going_up)
    
  3. from module import *(非推奨⚠)
    名前が混ざって衝突しやすい。基本使わないでOK。


いつ実行されるの?(超重要)

  • 初回の import で、そのファイルがまるごと一回“実行”される → そこで定義された関数や変数が使えるようになる。

  • 同じ実行中に再インポートしても再実行されない(キャッシュ)=副作用は1回だけ。

✅コツ:ファイルの先頭レベルには“定義だけ”を置く。
いきなり harvest() とか“動くコード”を書かない。動くのは main() の中に入れて、
ガードで起動するのが吉👇

def main():
    ...  # 本処理

if __name__ == "__main__":   # 直接このファイルを実行したときだけ動く
    main()

インポートあるある事故と回避術

  • 副作用(importした瞬間に動いてしまう)
    → 上のmainガードで防ぐ。トップには定義だけ。

  • 循環インポート(AがBを、BがAをimport)
    → 共有したい値はshared.pyみたいな第三のモジュールへ避難。
    もしくは片方だけが片方をimportする構造に整理。

  • 名前衝突from ... import *の悪影響)
    → 原則**import module**スタイルで。

  • 重いimportをループ内で呼ぶ
    → importはファイル先頭で一度だけ。ループ内はNG。


畑で即使える“3ファイル分割テンプレ”

ファイル名(jobs、movement、main)を忘れずに!

jobs(各作業を部品化)

def do_grass():
    if can_harvest():
        harvest()

def do_bush():
    if can_harvest():
        harvest()
        plant(Entities.Bush)
    elif get_entity_type() == None:        # 環境によっては is None でもOK
        plant(Entities.Bush)

def do_carrot():
    if can_harvest():
        harvest()
    if get_ground_type() == Grounds.Grassland:
        till()
    if num_items(Items.Hay) >= 1 and num_items(Items.Wood) >= 1:
        plant(Entities.Carrot)

movement(1歩だけ動かす“移動エンジン”)

def snake_step(size, going_right, going_up):
    x = get_pos_x(); y = get_pos_y()

    if going_up:
        if y == size - 1:
            if going_right:
                if x == size - 1:
                    going_right = False
                    move(West)
                else:
                    move(East)
            else:
                if x == 0:
                    going_right = True
                    move(East)
                else:
                    move(West)
            going_up = False
        else:
            move(North)
    else:
        if y == 0:
            if going_right:
                if x == size - 1:
                    going_right = False
                    move(West)
                else:
                    move(East)
            else:
                if x == 0:
                    going_right = True
                    move(East)
                else:
                    move(West)
            going_up = True
        else:
            move(South)

    return going_right, going_up

main(配線だけで読みやすく✨)

import jobs
from movement import snake_step   # ここだけピンポイント輸入

def main():
    size = get_world_size()
    going_right, going_up = True, True
    lanes = [jobs.do_carrot, jobs.do_bush, jobs.do_grass]  # 1=🥕 2=🌳 3=🌿

    while True:
        x = get_pos_x()
        job = lanes[x % len(lanes)]
        job()  # そのマスの作業
        going_right, going_up = snake_step(size, going_right, going_up)

if __name__ == "__main__":
    main()

これの良さ💡

  • mainは“読む用”に超短い=保守ラク。

  • 列配分は lanes = [...] を1行変えるだけでチューニング可能。

  • 移動ロジックを変えるときは movementだけ触ればOK。


迷ったらこのルールだけ覚えて👍

  • 定義はモジュールに、実行は main() に

  • import は冒頭で一回import module が基本

  • from は少数を取りたい時だけ* は使わない

  • 循環しそうなら shared に逃がす

 

 

続き

www.himajin-block30.com

 

 

このゲームの関連記事

www.himajin-block30.com