
当記事はChatGPTが出力した文章を使用しています。
このゲームの関連記事
前回
変数アンロック

あたし的まとめ→「その場の値を“メモ”して使い回せる」「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_eastがTrue/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)
-
get_pos_x()が数字を返す -
get_world_size()が数字を返す →- 1を計算 -
==で比較 → True/False を返す -
ifがその True/False を受け取って分岐 -
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)
まとめ
-
渡す=関数に材料(引数)を手渡し。
-
返す=関数から結果(戻り値)が呼んだ場所にスポッ。
-
戻り値は「代入」「条件」「他関数の引数」「計算の一部」…どこでも使える。
-
効果だけの関数は返さないから、条件に使わないでね🙅♀️
続き