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

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

 

このゲームの関連記事

www.himajin-block30.com

 

前回

www.himajin-block30.com

 

変数アンロック


あたし的まとめ→「その場の値を“メモ”して使い回せる」「1回の判定を全体で共有できる」「動きを数字1つで調整できる」。つまりムダが減って安定&可読性UPだよ🧠⚡

何が便利?

  • 1回測って何度も使えるsize = get_world_size() みたいに保存→毎回呼ばなくてOK。

  • 高コスト判定の共有can = can_harvest()一度だけ呼んで分岐に使い回し(空振り減らす)。

  • フラグ&カウンタ:進行方向のフラグや、収穫数カウンタが書ける。

  • パラメータ化でチューニング:待ちtickや資材の目標量を変数1つで調整できて、実験が爆速。

  • 読みやすさ爆上げlane = x % 3 とか名付けておくと、コードの意図が一目でわかる。


すぐ使える実戦パターン🥕🌿🪵

1) 「端で曲がる」蛇行をフラグで実装(ラップしない)

size = get_world_size()
going_east = True  # 進行方向フラグ

while True:
    x = get_pos_x()
    y = get_pos_y()
    can = can_harvest()  # 1回だけ呼んで共有

    if can:
        harvest()

    if going_east:
        if x == size - 1:
            move(South)
            going_east = not going_east   # 方向を反転
        else:
            move(East)
    else:
        if x == 0:
            move(South)
            going_east = not going_east
        else:
            move(West)

going_eastTrue/Falseで方向を覚える“フラグ”。notでスパッと反転できて気持ちいい✌️


2) 車線判定をメモって分岐(3レーン運用の芯)

# 3レーン運用 + 無限蛇行移動(端で南へ曲がる)
size = get_world_size()
wait = 0   # 成熟が遅いなら 1 や 2 に調整してね

while True:
	x = get_pos_x()
	y = get_pos_y()
	lane = x % 3                 # 0:ニンジン / 1:茂み / 2:草
	can = can_harvest()

	# —— 各レーンの作業 —— #
	if lane == 0:
		# ニンジン列
		if can:
			harvest()
		if get_ground_type() == Grounds.Grassland:
			till()
		if num_items(Items.Hay) >= 1 and num_items(Items.Wood) >= 1:
			plant(Entities.Carrot)

	elif lane == 1:
		# 茂み列(木材供給)
		if can:
			harvest()
			plant(Entities.Bush)

	else:
		# 草列(干し草供給)
		if can:
			harvest()

	# —— 蛇行移動(ラップせず端で南へ)—— #
	if y % 2 == 0:                     # 偶数行は東へ
		if x == size - 1: 
			move(North)
		else:              
			move(East)
	else:                               # 奇数行は西へ
		if x == 0:         
			move(North)
		else:              
			move(West)
		

lane を作っておくと条件が短くスッキリ。しきい値も変数で一括調整👌


3) “待ちtick”をパラメータ化(リズム調整が一瞬)

wait = 1  # 成熟が遅いなら 2 や 3 に
if not can:
    for _ in range(wait):
        do_a_flip()

4) 収穫数を数える(デバッグ&KPI)

harvested = 0

while True:
    can = can_harvest()
    if can:
        harvest()
        harvested += 1      # 複合代入(+=)でカウント
        if harvested % 10 == 0:
            quick_print("HARV:", harvested)
    move(East)

よくあるミス💣

  • === の違い

    • a = 5代入(左に入れる)。

    • a == 5比較if の条件に使うのはこっち。

  • 未定義変数の使用:先に代入してから使う(x = get_pos_x() など)。

  • 型の勘違いcan_harvest()True/False。数字と足し算はできないよ。

  • インデント統一:TabとSpace混在はエラー(片方だけ)。

  • 全角/半角()%が全角だと読まれない。必ず半角で!


 


「値を返す」「値を渡す

  • 渡す(pass):関数に材料を手渡すこと(カッコの中の引数)。

  • 返す(return):関数が結果を手元に返すこと(戻り値)。

  • 返す先=その関数を呼び出した場所。戻り値は呼び出し箇所のその場にスポッと入るよ。


1) 「値を渡す」=引数の話

呼ぶ側→受け取る側の流れだよ。

plant(Entities.Carrot)     # Entities.Carrot を引数として“渡す”
move(North)                # North を“渡す”
num_items(Items.Hay)       # Items.Hay を“渡す”
  • カッコの中は評価してから渡す
    range(get_world_size()) なら、まず get_world_size() を呼んで数字にしてから、その数字を range に渡す。

  • 変数を渡してもOK:

    d = North
    move(d)                  # 変数 d の値(North)を渡す
    

2) 「値を返す」=戻り値の話(返す先はどこ?)

戻り値は呼び出し位置そのものに入る。だからいろんな“先”で使えるよ👇

a) 変数に入れる先

size = get_world_size()    # ← 返ってきた数字が size に入る
x = get_pos_x()

b) 条件の先(if/while)

if can_harvest():          # ← True/False がその場に入って判定される
    harvest()

c) 他の関数の引数の先(入れ子)

for _ in range(get_world_size()):   # ← 返った数字が range(...) に渡される
    move(East)

d) 計算の一部

last_col = get_world_size() - 1     # 3 - 1 → 2 みたいに計算続行

3) このゲームで“返す”代表/“返さない”代表

関数 返す? 使い方の例
can_harvest() True/False を返す if can_harvest(): ...
get_pos_x()/get_pos_y() を返す if get_pos_x() == 0:
get_world_size() を返す for r in range(get_world_size()):
get_entity_type() エンティティ or None if get_entity_type() == Entities.Bush:
get_ground_type() 地面タイプ if get_ground_type() == Grounds.Soil:
num_items(item) を返す if num_items(Items.Wood) >= 1:
harvest() 返さない(効果だけ) harvest() して終わり
plant(...) / move(...) / till() / do_a_flip() 返さない 実行の副作用だけ

重要⚠️:返さない関数を条件に使わない
例:if harvest(): は意味ナシ(戻り値がなくて常に偽っぽくなる)。


4) 流れのイメージ(評価順)

if get_pos_x() == get_world_size() - 1:
    move(South)
  1. get_pos_x() が数字を返す

  2. get_world_size() が数字を返す- 1 を計算

  3. == で比較 → True/False返す

  4. if がその True/False を受け取って分岐

  5. True なら move(South)South を渡して 実行


5) 返す vs. 表示する(print)

  • print(x)画面に出すだけで、値を返さない(ロジックは進まない)。

  • ロジックを組むのは戻り値、状態を観察するのはprint。役割が違うのだ🫶


6) ちょい実例(渡す&返すをセットで)

「端で南へ」の端ガード:

size = get_world_size()            # ← 返された数を変数に保存
x = get_pos_x()                    # ← 同上

if x == size - 1:                  # ← 比較の結果(True/False)が if に返る
    move(South)                    # ← South を“渡す”
else:
    move(East)

まとめ

  • 渡す=関数に材料(引数)を手渡し。

  • 返す=関数から結果(戻り値)が呼んだ場所にスポッ。

  • 戻り値は「代入」「条件」「他関数の引数」「計算の一部」…どこでも使える

  • 効果だけの関数は返さないから、条件に使わないでね🙅‍♀️

 

続き

www.himajin-block30.com

 

このゲームの関連記事

www.himajin-block30.com