
当記事はChatGPTが出力した文章を使用しています。
このゲームの関連記事
前回
実演風に解説!

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-1。sizeと間違えない!
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. 「この順番」でバグを潰せる🔥(チェックリスト)
-
off-by-one:端の比較は全部
size - 1になってる? -
作業の位置:移動より前に入れてる?
-
一歩だけ:横移動は1回だけ?(2回動かないように)
-
フラグの反転タイミング:横に動いた直後に反転してる?
-
インデント統一:Tab/Space混在なし、
:忘れなし
7. 目に見えるテスト(3×3で手シミュ)🧪
初期:(0,0), going_right=True, going_up=True
-
北上→(0,1)→(0,2)
-
上端到達 → 東へ(1,2)、
going_up=False(今度は下る) -
南下→(1,1)→(1,0)
-
下端到達 → 東へ(2,0)、
going_up=True -
北上→(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が抜けてる orsizeと比較してる -
斜めに見える:縦移動と横移動を同じtickで2回やってる
-
取りこぼし:作業を移動後にやっている
-
行き止まり:
going_right/going_upの反転漏れ
10. 自分で応用できる“発想のコア”🧩
-
目標の動きを“状態(フラグ)”に直す
-
端か、それ以外かの2分岐に分解
-
一歩だけ動かす(多重移動しない)
-
端でフラグを反転
-
仕事はその場でやる
この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…**の並びを自動で維持するから安定✨