10/14
_ [同人ゲーム] 東方紅魔大迷宮 normal5-3にパソコンが挑戦
[BansheeSOFTWARE] の東方紅魔大迷宮 normal、3面突破に1ヶ月、4面突破に数日で、ラストの5面に入りました。前作の東方紅魔迷宮は4面が抜けられないのに比べると、良いペースと言いますか、すぐにヒントをのぞき見して進められると言いますか(汗。
さて、その中にある5-3が、氷塊を滑らせる完全パズル面。これならアクション性も全然無いし、滑らせるパターンなんてそうそうないから大丈夫、道を1個作るのは簡単であと1つと思っていたら、
...無理でしょこの面(汗。1時間考えて力尽きました。4面と5面の間の壁は高かったです。
パソコンに解かせてみる
さて、そこで諦めるのもと思って、パソコンに解かせる事を考えました。基本方針は3つ。
- 総当たりで、1つ目の解を見つけたところで終了
- 1つの氷塊も無駄にしない。ゴールへの直線経路以外で氷塊を水に落とすことは考えない
- 無限ループはしない事を前提にする。同じ手が現れたかの確認はしない
そうして書いてみたのが以下のRubyのコード。1時間ほど。
def solve(map, score, depth) map.each.with_index do |ary, y| ary.each.with_index do |val, x| next unless (val == 1) # [x,y]方向から押す [[1,0], [-1,0], [0,1], [0,-1]].each do |d| next unless map[y+d[1]][x+d[0]].zero? # 足場がない next if map[y-d[1]][x-d[0]] == 1 # 動かない i = 1 i += 1 while (map[y-d[1]*i][x-d[0]*i].zero? && map[y-d[1]*(i+1)][x-d[0]*(i+1)] != 1) val2 = map[y-d[1]*i][x-d[0]*i] next if val2 == 2 # 氷塊を無駄にしない map2 = Marshal::load(Marshal::dump(map)) map2[y][x] = 0 map2[y-d[1]*i][x-d[0]*i] = 1 if val2.zero? # 氷塊の手前まで動く score2 = (val2 == 3) ? score + 1 : score if (score2 == 2 || solve(map2, score2, depth+1)) p [x, y, d[0], d[1], i, depth] return true end end end end false end def read_data result = [] DATA.each_line do |line| result << line.chop.each_char.collect{|c| c.to_i} end result end map = read_data solve(map, 0, 0) __END__ 22222322222 20000000002 21100001002 20001000002 20000000102 21000000002 20000000102 20000000002 22222222222
これで一応解けました。 ...どう見てもチートです、はい。
解けないこと
氷塊を滑らせると思った場所に止まらないから、無限ループなんてないかなと思っていたら... 簡単に氷塊を何回でも滑らせられる面が作れました(汗。
Tipsでヒントになっている氷塊が入っていると、手数が長すぎて失敗しました。Stack Overflow。そこでこれをなかったことにステージ改変を。この手の面はextraにもないですし、このプログラムを直す事はないということで。別解があるかどうかが気になるくらいです。
東方紅魔迷宮では半マスずらしを多用します。思考系だと練習3-9のような面が勝手に解けると面白いかもと思いつつ、半マスの扱いは面倒そう(汗。それに滑らせるのと違って動かせるパターンがとても増えます。難しそうです。
最後に
AREA5の他の面は正攻法で頑張ります。
2o6YCC <a href="http://xxyguesbqilw.com/">xxyguesbqilw</a>, [url=http://zjmexcwupjof.com/]zjmexcwupjof[/url], [link=http://uczhxvunguiv.com/]uczhxvunguiv[/link], http://xdgpwgnfefdh.com/
0, http://bestantibioticsonline.com/#7110 doxycycline,
2, http://highbloodpressuremeds.com/#8464 medication furosemide,
1, http://de-viagra.info/ viagra bestellen,
1, http://compareantibioticsoffers.com/#8538 bactrim strengths,
2, http://cheapmedsonline.co.uk/ cialis,
2, http://bestdrugsonline.co.uk/ levitra,