【農家は Replace() されました】迷路を攻略するプログラムを考える

プロモーションが含まれています。

スポンサーリンク
サムネイル プログラム

遊びながら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

右手法で宝物を収穫し迷路の再利用を繰り返していると、途中で迷路の形状が変化して、永遠に宝物にたどりつけないループ状態におちいります。

コメント

タイトルとURLをコピーしました