遊びながらPythonを学べるゲーム「農家は Replace() されました」の、迷路を攻略するシンプルなプログラムを考えました。迷路を生成すると迷路の中に宝物が現れて、宝物を収穫するとGold(金)が手に入ります。
本記事はネタばれが含まれています。ルールや考え方について知りたい場合はこちらを見てください。
収穫の条件
迷路を生成
Bush(低木)に Weird_Substance(奇妙な物質)を使うと生垣の迷路が現れます。迷路のサイズは、奇妙な物質の使用量によって決まります。
1ブロックで奇妙な物質を使用することで、使用した量に応じた迷路が生成されます。
迷路のサイズ、奇妙な物質の必要量は、農場のサイズと迷路のアンロックレベルで決まります。
フィールドいっぱいの迷路を造る
plant(Entities.Bush)
substance = get_world_size() * 2**(num_unlocked(Unlocks.Mazes) – 1)
use_item(Items.Weird_Substance, substance)
迷路を攻略
右手法、右壁法と言われる方法で進めていけば攻略できます。
収穫
ドローンが宝物の上にいるときに、収穫すると金が手に入ります。
harvest() で宝物を収穫して終了するか、use_item(Items.Weird_Substance, **) で奇妙な物質を使うことで、宝物を収穫し新しい宝物(迷路の再利用)を設置するかの二通りあります。
プログラム
基本的な考え方
- x、y が(0、0)の位置から開始
- 迷路を生成する
- 右手法で進める
- 最初に向いている方角は北(前)とする
- ドローンが宝物の上に着いたら収穫
- 向いている方角から左右・後ろを決める
- 右側を確認して移動可能なら右へ
- 前方に移動可能なら前方へ
- 左側に移動可能なら左へ
- 3方向が移動不可なら後ろへ
- 決めた方向に移動する
- (5)に戻って繰り返す
プログラム
# 農場のサイズ
set_world_size(5)
clear()
till()
plant(Entities.Bush)
substance = get_world_size() * 2**(num_unlocked(Unlocks.Mazes) - 1)
use_item(Items.Weird_Substance, substance)
# 北:0、東:1、南:2、西:3
dir_list = [North, East, South, West]
# 最初は北へ進む
move_dir = 0
tx, ty = measure()
while True:
pos_x, pos_y = get_pos_x(), get_pos_y()
if tx == pos_x and ty == pos_y:
harvest()
break
# 右・左・後ろの方向
right_dir = (move_dir + 1) % 4
left_dir = (move_dir + 3) % 4
back_dir = (move_dir + 2) % 4
if can_move(dir_list[right_dir]):
move_dir = right_dir
elif can_move(dir_list[move_dir]):
pass
elif can_move(dir_list[left_dir]):
move_dir = left_dir
else:
move_dir = back_dir
move(dir_list[move_dir])まずは、北に移動すると仮定しています。右手法なので、右に移動できるときは右に移動、北に移動できるときは北に移動と、順番に移動方向を決めていきます。「移動した結果を元に再度、前後左右を確定させて、移動できる方向を確認する。」を、繰り返します。
方角と前後左右の関係
移動方向(move_dir)が前になる。
dir_list = [North, East, South, West] に合わせて考えます。数字と方角の関係は、「0:北、1:東、2:南、3:西」です。
right_dir = (move_dir + 1) % 4
left_dir = (move_dir + 3) % 4
back_dir = (move_dir + 2) % 4
が今回のキモになります。
移動方向の東西南北(方角)に対して、前後左右を決めます。決めた前後左右を、東西南北で表現します。

例えば、北に移動したら移動方向は0です。(%は4で割った余り)
右方向 = (0 + 1)% 4 = 1 (東)
左方向 = (0 + 3)% 4 = 3 (西)
後方向 = (0 + 2)% 4 = 2 (南)
同様に、東に移動したら移動方向は1です。
右方向 = (1 + 1)% 4 = 2 (南)
左方向 = (1 + 3)% 4 = 0 (北)
後方向 = (1 + 2)% 4 = 3 (西)
となります。
こうすることで、移動方向、前後左右、東西南北の関係を決めることができます。
動画
注意:動画の動きと上記のプログラムは、必ずしも完全に一致しているわけではありません。動作が異なっていても、上記のプログラムがベースになっています。
改善点
宝物を一度、収穫出来たら以下の改善が必要だと感じました。
その1
一度で終わらずに、続けて宝物を探す。
「同一の迷路を300回再利用できる。」実績について
ドローンが宝物の上に到達すると、自動的に収穫します。収穫した状態で、Weird_Substance(奇妙な物質)を再度使用すると、新しい宝物が配置されます。
収穫(harvest())してしまうと、この条件から外れてしまいます。収穫(harvest())して300回繰り返したところ、実績解除されずやり方が間違っていることがわかりました。
その2
右手法で開始するのではなく宝物の位置を確認して、右手法で攻略するか、左手法で攻略するか判断する。
その3
右手法で宝物を収穫し迷路の再利用を繰り返していると、途中で迷路の形状が変化して、永遠に宝物にたどりつけないループ状態におちいります。


コメント