RE: 小学生のいとこのためにJavaで作った迷路ゲームを簡単に解説する

小学生のいとこのためにJavaで作った迷路ゲームを簡単に解説する - Qiita が面白かったので rubyで実装してみました。
 
rochefort/ruby-maze: Ruby implementation of hey-cube/maze
 
穴掘り法(道延ばし法)というアルゴリズムで迷路の「道」をどんどん作成していって 最後にstart/goalを決める手法。
ここのところは元ソースを参考にしました。
 
こういうのは、そもそも楽しいし、子供がプログラミングを学ぶのにも良いのではという印象を持ちました。

f:id:rochefort:20170918013116p:plain

入力方法について

元のコードは迷路の移動のために 移動方向 + Enter を押すという方法でした。
ちょっとこれは操作しにくいなと思ったので、Enterなしで実行できないかと調べてみました。

最終的には

こうしました。

class RubyMaze
  class Keyboard
    def self.read_key
      begin
        system("stty raw -echo")
        c = STDIN.getc
        if c == "\e"
          thread = Thread.new {
            c += STDIN.getc.chr
            c += STDIN.getc.chr
          }
          thread.join()
        end
      ensure
        system("stty -raw echo")
      end
      c
    end
  end
end

これは、sttyをrawモードに変更することで1文字単位ずつrubyで受け取るようにし、 ensureでrawモードから抜けるというようにしています。
ただし、Arrow keyの場合、「\e」「[」「A」のように3文字単位の入力となるようなので 残りの2文字を取得するためにthreadを使って読み込むという力技で対応しています。
(他にいい方法ないかなぁ)

参考