前提・実現したいこと
ここに質問の内容を詳しく書いてください。
マインスイーパーというゲームがあります。これは盤面上の爆弾をすべて見つけることが目的のゲームです。今回、爆弾の位置は予め分かっていて二次元配列が引数として与えられます。爆弾の位置を1で表し、何もおいていないところを0で表すとします。そのとき爆弾がない0の位置から見た周囲8方向に何個置いてあるかを二次元配列上のその位置に記録します。爆弾が置いてある1と書いてあるところは0になるとします。これを実行するプログラムを作成したつもりが上手く動きません。どこが間違えているのか教えていただけないでしょうか。
発生している問題・エラーメッセージ
プログラムを自分で作ったのですが、思い通りに動きません。どの箇所が間違っていてどう直せばよいのかわかりません。
例えば簡単な例として3×3の正方形上で真ん中にだけ爆弾があり場合、正しくプログラムが動作しているならばこのように表示されるはずです。
irb> sweep [[0, 0, 0], [0, 1, 0], [0, 0, 0]] => [[1, 1, 1], [1, 0, 1], [1, 1, 1]]
しかし、私が作成したプログラムだと以下のようになり、どこから2が出てきたのかもわかりません。
irb(main):183:0> sweep [[0,0,0],[0,1,0],[0,0,0]] => [[1, 2, 1], [2, 0, 1], [0, 1, 2]]
他にも
正しい結果 irb> sweep [[1, 0, 0, 1], [0, 1, 0, 1], [0, 0, 1, 1]] => [[0, 2, 3, 0], [2, 0, 5, 0], [1, 2, 0, 0]] 私の間違った結果 irb(main):190:0> sweep [[1, 0, 0, 1], [0, 1, 0, 1], [0, 0, 1, 1]] => [[0, 1, 4, 0], [2, 0, 4, 0], [0, 1, 0, 0]]
該当のソースコード
ruby
def sweep(board) board2 = board h = board.length h.times do |y| w = board[y].length w.times do |x| if(board[y][x] == 1) c = 0 elsif(board[y][x] == 0) c = 0 -1.step(1) do |dx| -1.step(1) do |dy| if(dx == 0 && dy == 0) next end xx = x + dx yy = y + dy if(0 <= xx && xx < w && 0 <= yy && yy < h) if(board[yy][xx] == 1) c += 1 end end end end end board2[y][x] = c end end return board2 end
試したこと
endの位置を見直したり、board2という二次元配列の作成時にミスがないかなども見直しました。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/21 12:37