【農家は Replace() されました】サボテンをソートして収穫するプログラムを考える

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

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

遊びながらPythonを学べるゲーム「農家は Replace() されました」の、サボテンをソート(整列)させるプログラムについて考えました。

本記事はネタばれが含まれています。ルールや考え方について知りたい場合はこちらを見てください。

スポンサーリンク

収穫の条件

緑色のサボテンを収穫するとサボテンが得られます。茶色になったサボテンを収穫しても何も得られません。緑色のサボテンになるための法則があります。

緑色のサボテンを造る

緑色に成長させるにはソート(並び順)が重要になります。

北、東方向 >>> 同じサイズか大きいサイズ
南、西方向 >>> 同じサイズが小さいサイズ

ソートさせるのに有効なコマンド

measure()・・・ドローンの下のサイズを確認
measure(東西南北)・・・ドローンの指定した方向1ブロック先のサイズを確認
swap(東西南北)・・・・ドローンの指定した方向1ブロック先のサボテンと植え替える

収穫

1ブロック収穫すると、隣接した全ての緑サボテンが収穫されます。隣接数に応じて収穫量が増えます。

スポンサーリンク

プログラム

基本的な考え方

  • x、y が(0、0)の位置から開始
  • 耕地にして、サボテンを植える
  • ドローン位置に対して北方向と東方向を比較
  • 逆ソートになっていたらスワップ
  • これを繰り返して全て緑サボテンなるようにする
  • x方向、y方向、それぞれカウントする
  • スワップしたらカウントをリセットする
  • カウントが農場サイズを超えたら収穫
  • 収穫は(0、0)で行う

プログラム

この流れで組んだのが下のプログラムです。農場全面にサボテンを植えるプログラムです。

#農場のサイズを指定したい場合は下の行を有効にする
#set_world_size(5)
#スピードを指定したい場合は下の行を有効にする
#set_execution_speed(5)
clear()

cactus_row = get_world_size()
total_row = cactus_row
done_sort_column = 1
done_sort_row = 1
harvest_count = get_world_size() * get_world_size()

while True:
	for i in range(cactus_row):
		pos_x = get_pos_x()
		pos_y = get_pos_y()

		if get_ground_type() == Grounds.Grassland:
			till()
			plant(Entities.Cactus)
		elif harvest_count <= done_sort_column and harvest_count <= done_sort_row and pos_x == 0 and pos_y == 0:
			harvest()
			plant(Entities.Cactus) 
		elif can_harvest() == False:
			plant(Entities.Cactus)
		
		if get_ground_type() == Grounds.Soil and can_harvest():
			if measure(North) < measure() and pos_y + 1 != get_world_size():
				swap(North)
				done_sort_column = 1
			else:
				done_sort_column += 1
				
			if measure(East) < measure() and pos_x + 1 != get_world_size():
				swap(East)
				done_sort_row = 1
			else:
				done_sort_row += 1	

		move(North)
	move(East)

このプログラムだけで動きます。綺麗にソートされていく様子がわかります。

動画

注意:動画の動きと上記のプログラムは、必ずしも完全に一致しているわけではありません。動作が異なっていても、上記のプログラムがベースになっています。

スポンサーリンク

改善点

大きな農場で動作させてみるとわかりますが、無駄な時間が多いです。これらを解決できればもっと効率的に収穫することができます。

複数ドローンの使用は、除外しています。

その1

上のプログラムはわかりやすいように、シンプルなプログラムにしています。北、東方向でスワップしたら、さらに南、西方向を比較してスワップすると、ソートが早くなりそうです。

その2

動作を見ていると、農場の東端から順番にソートが完了しています。ソート完了した場所は何度も確認しているだけなので、ここを上手く処理できれば時間の短縮になりそうです。

コメント

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