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


コメント