
当記事はChatGPTが出力した文章を使用しています。
このゲームの関連記事
前回
インポート(import)は、コードを“科目別ノート”に分けてキレイに保つ魔法

何ができるの?(一言で)
-
別ファイルに書いた関数や変数を、今のファイルから使えるようにする。
-
例:
import jobs→jobs.do_carrot()みたいに呼べる。
3つの書き方と使い分け
-
import module(推し💖)
名前空間を分けて安全。「どこから来た関数か」が一目でわかる。import jobs jobs.do_bush() -
from module import name(少数だけ使いたい時)from movement import snake_step going_right, going_up = snake_step(size, going_right, going_up) -
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 に逃がす
続き