ゲーム難民おじさん、「農家はReplace()されました」に出会う
「Wall World」の実績をコンプリートし、並行していた「ボーダーランズ3」もクリア。少し手持ち無沙汰になっていたところ、一風変わったプログラミングゲーム「農家はReplace()されました (The Farmer Was Replaced)」に遭遇しました。

「農家はReplace()されました」とは? (AI生成ゲーム紹介)
このゲームは、シンプルなPython風の言語を使ってドローンをプログラミングし、農業の様々な作業を自動化するゲームです。
プログラムを実行すると、ドローンが全ての重労働をこなしてくれます。
他の多くのプログラミングゲームとは異なり、個別のレベルに分かれているわけではなく、継続的に進行していくのが特徴です。
農業で得た資源を使って新しい技術をアンロックすることができます。
ゲームの序盤は、基本的なプログラミングの概念を一つ一つ学ぶことができるように設計されています。
ただし、ゲーム内の様々なタスクを解決する方法については、自分で考え出す必要があります。そのため、プログラミングの経験がない場合は、少し難しく感じるかもしれません。
経験豊富なプログラマであれば、序盤はスムーズに進めることができ、後半のより複雑なタスクに挑戦することができるでしょう。
実際に触ってみた感触と自動化のロジック
説明の通り、Pythonによく似た言語でドローンの動きを制御します。
「move(North)」で北に1マス進む、「harvest()」で足元の作物を収穫する、といった具合です。
インデントでコードブロックを管理する点もPythonに近い印象です。

効率化のための栽培ロジック
単に植えるだけでなく、各作物の特性に合わせて効率を最大化するロジックを考えました。
- 木:チェッカーフラッグ状に配置
木の成長速度は、上下左右に他の木が隣接すると低下します。
そこで、木と茂みを交互に植える「チェッカーフラッグ(市松模様)」配置にすることで、木の成長を阻害しないようにコーディングしました。 - カボチャ:合体を狙った4×4栽培
カボチャは、収穫可能な状態で2×2以上の正方形に隣接すると、合体して大きなカボチャになり収穫量が増えます。
これを最大限に活用するため、4×4の畑を用意。
最後のマスでだけ収穫処理をトリガーすることで、4×4サイズに合体した後に一括で収穫できるようにしています。
(成長に失敗した「割れたカボチャ」は都度植え直します) - 資源のバランス
人参を植えるのに草や木が必要になるなど、資源に依存関係があるため、カボチャ畑の横に人参、その隣に草のエリアを設けて、全ての素材をまんべんなく集められるようにしています。
こういうゲームは、自分の意図した通りに自動化の仕組みが動いた瞬間が、一番気持ちいいですね。ただ、プログラミング適性がない人には少し辛いかもしれません。
現在の自動化コード
以下が、上記ロジックを実装した現在のコードです。(日本語コメントが入力しづらいため、ほぼ書き殴り状態ですが…)
import Harvest
import Initial
import Plant
import PosReset
#クリア
clear()
#Global変数
global pumpkin_start
global pumpkin_end
global carrot_start
global carrot_end
global grass_start
global grass_end
#樹木以外のエリア設定
grass_size = 4
#カボチャのエリア
pumpkin_start = [0, 0]
pumpkin_end = [3, 3]
#人参のエリア
carrot_start = [4, 0]
carrot_end = [5, 3]
#草エリア
grass_start = [6, 0]
grass_end = [7, 3]
#耕すエリアの設定(x, y)
Initial.InitTill(6,4)
#ドローンの場所リセット
PosReset.Pos_Reset_xy()
while True:
Plant.plant_select(get_pos_x(), get_pos_y(), pumpkin_end, carrot_end, grass_end)
move(North)
if get_pos_y() == 0:
move(East)
def Pumpkin():
plant(Entities.Pumpkin)
def Carrot():
plant(Entities.Carrot)
def Tree_Bush():
pos = get_pos_x() + get_pos_y()
if pos % 2 == 0:
plant(Entities.Tree)
else:
plant(Entities.Bush)
def plant_select(x, y, pumpkin_end, carrot_end, grass_end):
if x <= pumpkin_end[0] :
if y <= pumpkin_end[1]:
Pumpkin()
if get_pos_x() == pumpkin_end[0] and get_pos_y() == pumpkin_end[1]:
harvest()
Pumpkin()
elif y > pumpkin_end[1]:
harvest()
Tree_Bush()
elif x <= carrot_end[0]:
if y <= carrot_end[1]:
harvest()
Carrot()
else:
harvest()
Tree_Bush()
else:
harvest()import PosReset
def InitTill(x, y):
for i in range(x):
for j in range(y):
till()
move(North)
PosReset.Pos_Reset_y()
move(East)
def Pos_Reset_xy():
PosReset.Pos_Reset_x()
PosReset.Pos_Reset_y()
def Pos_Reset_x():
while get_pos_x() > 0:
move(East)
def Pos_Reset_y():
while get_pos_y() > 0:
move(North)


コメント