トップ «前の日記(10/13) 最新 次の日記(10/16)» 編集

hossy online - といぼっくす

ゲームの感想日記、たまにIT・プログラミングの話


10/14

_ [同人ゲーム] 東方紅魔大迷宮 normal5-3にパソコンが挑戦

[BansheeSOFTWARE] の東方紅魔大迷宮 normal、3面突破に1ヶ月、4面突破に数日で、ラストの5面に入りました。前作の東方紅魔迷宮は4面が抜けられないのに比べると、良いペースと言いますか、すぐにヒントをのぞき見して進められると言いますか(汗。

さて、その中にある5-3が、氷塊を滑らせる完全パズル面。これならアクション性も全然無いし、滑らせるパターンなんてそうそうないから大丈夫、道を1個作るのは簡単であと1つと思っていたら、

...無理でしょこの面(汗。1時間考えて力尽きました。4面と5面の間の壁は高かったです。

パソコンに解かせてみる

さて、そこで諦めるのもと思って、パソコンに解かせる事を考えました。基本方針は3つ。

  1. 総当たりで、1つ目の解を見つけたところで終了
  2. 1つの氷塊も無駄にしない。ゴールへの直線経路以外で氷塊を水に落とすことは考えない
  3. 無限ループはしない事を前提にする。同じ手が現れたかの確認はしない

そうして書いてみたのが以下の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の他の面は正攻法で頑張ります。

本日のツッコミ(全7件) [ツッコミを入れる]
_ tlxxkpxwl (01/20 17:32)

2o6YCC <a href="http://xxyguesbqilw.com/">xxyguesbqilw</a>, [url=http://zjmexcwupjof.com/]zjmexcwupjof[/url], [link=http://uczhxvunguiv.com/]uczhxvunguiv[/link], http://xdgpwgnfefdh.com/

_ doxycycline (02/06 07:24)

0, http://bestantibioticsonline.com/#7110 doxycycline,

_ furosemide 20mg (02/06 09:50)

2, http://highbloodpressuremeds.com/#8464 medication furosemide,

_ viagra (02/07 19:49)

1, http://de-viagra.info/ viagra bestellen,

_ bactrim and cranberry juice (02/09 08:20)

1, http://compareantibioticsoffers.com/#8538 bactrim strengths,

_ buy cialis online (02/09 13:12)

2, http://cheapmedsonline.co.uk/ cialis,

_ levitra no prescription (02/09 14:13)

2, http://bestdrugsonline.co.uk/ levitra,