小学生のいとこのためにJavaで作った迷路ゲームを簡単に解説する - Qiita が面白かったので
rubyで実装してみました。
rochefort/ruby-maze: Ruby implementation of hey-cube/maze
穴掘り法(道延ばし法)というアルゴリズムで迷路の「道」をどんどん作成していって
最後にstart/goalを決める手法。
ここのところは元ソースを参考にしました。
こういうのは、そもそも楽しいし、子供がプログラミングを学ぶのにも良いのではという印象を持ちました。
入力方法について
元のコードは迷路の移動のために 移動方向 + 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を使って読み込むという力技で対応しています。
(他にいい方法ないかなぁ)