【農家は Replace() されました】番外編 コードを書く時、何を考えてる?|ギャルから学ぶドローン農業【超初心者向け攻略】

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

 

このゲームの関連記事

www.himajin-block30.com

 

前回

www.himajin-block30.com

 

実演風に解説!


0. まず“完成イメージ”を一言で🎯

南西(0,0)スタート1列目は北へてっぺんまで → 東に1歩で次列へ → 今度は南へ底まで → 東に1歩
これをラップなしで永遠往復(右端に着いたら今度は西へ戻る)にする。


1. 世界のルールをモデリング🧠

  • 盤は正方形:size = get_world_size()(≒一辺の長さ)

  • 座標:x = get_pos_x()(列)/ y = get_pos_y()(行)

  • 端の座標:x==0(最左)/ x==size-1(最右)、y==0(最下)/ y==size-1(最上)

  • ラップ禁止(端でクルンと反対側に出ない)=端ガードを必ず入れる

✓チェック:端の条件は必ず size-1size と間違えない!


2. 動きを“状態”に置き換える(2フラグ方式)🧭

  • 横の進行方向:going_right(右へ列替えする?)

  • 縦の進行方向:going_up(今の列は上へ?下へ?)

なぜフラグ?

  • if文の分岐がスッキリする

  • 右端/左端で向きを反転するのが一行で書ける(going_right = not going_right みたいに)


3. 無限ループの骨組みを先に置く🦴

先に“外枠”を作ると、内側の条件は穴埋めで書けるようになるよ

size = get_world_size()
going_right = True   # 次の列へ進む向き(True=東, False=西)
going_up    = True   # 現在の列の縦方向(True=北上, False=南下)

while True:
    # ★このマスでの作業(収穫/植え等)を先に書けるように空けておく
    # 例: if can_harvest(): harvest()

    if going_up:
        # 北上ロジック(あとで中身を入れる)
        ...
    else:
        # 南下ロジック
        ...

✓チェック:作業は移動の前に入れる(通過時に取りこぼさないため)


4. “上へ進む”ロジックを具体化↗️

考える順番は端か?それ以外か?

  • 端(最上段)なら:横へ1歩(東or西)&次列は下るようにgoing_up=False

  • 端じゃなければmove(North)1歩だけ上へ

if going_up:
    if get_pos_y() == size - 1:   # 最上段に到達?
        if going_right:
            # 右へ列替え。ただし最右端なら“東へ行けない”ので西戻りへ切替
            if get_pos_x() == size - 1:
                going_right = False
                move(West)
            else:
                move(East)
        else:
            # 左へ列替え。ただし最左端なら“西へ行けない”ので東戻りへ切替
            if get_pos_x() == 0:
                going_right = True
                move(East)
            else:
                move(West)
        going_up = False          # 次の列は南下モード
    else:
        move(North)               # まだ頂点じゃない→北へ1歩

✓チェック:横移動は1歩だけ。その後で向きフラグを反転


5. “下へ進む”ロジックを対称に↘️

同じ発想を最下段に当てはめるだけ。対称性を意識するとミスが減るよ。

else:  # going_up が False → 南下中
    if get_pos_y() == 0:          # 最下段?
        if going_right:
            if get_pos_x() == size - 1:
                going_right = False
                move(West)
            else:
                move(East)
        else:
            if get_pos_x() == 0:
                going_right = True
                move(East)
            else:
                move(West)
        going_up = True           # 次の列は北上
    else:
        move(South)               # まだ底じゃない→南へ1歩

✓チェック:上下で対称になってる?

  • 上端→going_up=False

  • 下端→going_up=True

  • 右端/左端では going_right を反転してバウンドさせる


6. 「この順番」でバグを潰せる🔥(チェックリスト)

  1. off-by-one:端の比較は全部 size - 1 になってる?

  2. 作業の位置:移動よりに入れてる?

  3. 一歩だけ:横移動は1回だけ?(2回動かないように)

  4. フラグの反転タイミング:横に動いた直後に反転してる?

  5. インデント統一:Tab/Space混在なし、: 忘れなし


7. 目に見えるテスト(3×3で手シミュ)🧪

初期:(0,0), going_right=True, going_up=True

  1. 北上→(0,1)→(0,2)

  2. 上端到達 → 東へ(1,2)、going_up=False(今度は下る)

  3. 南下→(1,1)→(1,0)

  4. 下端到達 → 東へ(2,0)、going_up=True

  5. 北上→(2,1)→(2,2)…
    → 右端に着いた列替え時は going_right=False に切替わるので、今度は西へ戻る往復に入る。
    (=端ガードでラップせず、永遠バウンド


8. “作業”を入れる場所の黄金パターン🛠️

そのタイルに“立ち寄った瞬間”にやるのが取りこぼし減のコツ👇

# —— 列ベース蛇行:端ガードで永遠往復 —— #
size = get_world_size()
going_right = True
going_up    = True

while True:
    # ★このマスの仕事(例)
    # 3レーン運用とかしてたら lane = get_pos_x() % 3 で分岐すると良き
    if can_harvest():
        harvest()
        # 例: 植え戻しや資材チェックをここに

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

9. つまずきポイントを先読み💣

  • ラップしちゃう問題:端ガードのifが抜けてる or sizeと比較してる

  • 斜めに見える:縦移動と横移動を同じtickで2回やってる

  • 取りこぼし:作業を移動後にやっている

  • 行き止まりgoing_right/going_up の反転漏れ


10. 自分で応用できる“発想のコア”🧩

  1. 目標の動きを“状態(フラグ)”に直す

  2. 端か、それ以外かの2分岐に分解

  3. 一歩だけ動かす(多重移動しない)

  4. 端でフラグを反転

  5. 仕事はその場でやる

この5ステップを身体に入れれば、横ベース蛇行行スキップトラップ避けみたいな別パターンもスラスラ書けるようになるよ✌️


 

ギャル流 ニンジン / 茂み / 草無限ループ

(立ち寄ったマスで仕事→移動の順。CarrotはSoil必須だから必要なときだけtillするよ)

# —— 列ベース蛇行:1=Carrot, 2=Bush, 3=Grass(繰り返し)で永遠運転 —— #
size = get_world_size()
going_right = True   # 列替えの向き(True=東へ, False=西へ)
going_up    = True   # 縦移動の向き(True=北上, False=南下)

while True:
	# ==== このマスの「仕事」 ====
	x = get_pos_x()
	lane = x % 3          # 0:ニンジン, 1:茂み, 2:草
	can = can_harvest()

	if lane == 0:
		# 🥕 ニンジン列:刈れたら刈って → 必要なら耕して → 資材があれば植え戻し
		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)

	elif lane == 1:
		# 🌳 茂み列:刈れたら刈って即リカバリ。空なら植える
		if can:
			harvest()
			plant(Entities.Bush)
		else:
			if get_entity_type() == None:
				plant(Entities.Bush)

	else:
		# 🌿 草列:刈れる時だけ刈る(植え直し不要)
		if can:
			harvest()

	# ==== 端ガード付き「縦スネーク」移動 ====
	y = get_pos_y()
	if going_up:
		# 北上中:最上段に着いたら横へ1歩&次列は南下へ
		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:
		# 南下中:最下段に着いたら横へ1歩&次列は北上へ
		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)

使い方メモ💡

  • Carrot列は「空+Soil+資材あり」でだけ植えるから、tillのトグル事故なし&資材も枯らしにくいよ。

  • Bush列/Grass列は供給レーン。収穫テンポがズレるなら、必要に応じて do_a_flip() を “刈れなかったときだけ” 1〜2回入れて待ちtickを調整してOK👌

  • 幅が3より大きくても、x % 3 で**1→2→3→1…**の並びを自動で維持するから安定✨

 

続き

www.himajin-block30.com

このゲームの関連記事

www.himajin-block30.com