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を使って読み込むという力技で対応しています。
(他にいい方法ないかなぁ)

参考

最近入れて良かった atom packages

atom-alignment

atom-alignment
コードの整理に便利。
サクッと見やすく整えてくれます。 =でも=>でも使えます。

# before
$config['foo'] => 'foo'
$config['foobar'] => 'foobar'

# after
$config['foo']    => 'foo'
$config['foobar'] => 'foobar'

symbols-tree-view

symbols-tree-view
見通しの悪いclassなんかを見る時に便利。
class, variable, function が表示可能(右クリックで選択できる)。
f:id:rochefort:20170902160311p:plain

symbol-gen

symbol-gen
ctagsを生成してくれます。
atom自体がctagsをサポートしてくれているので、go to declaration (option cmd ↓)で定義へ移動できます。

余談

goto-definition
以前は定義へ移動するのに goto-definition というgrepするツールを利用していましたが、現在はメンテナンスされていないため使用しなくなりました。

split-diff

split-diff
これも非常に良いです。左右のpainでdiffってくれて、即時反映してくれます。
word diff、ignore whitespaceなども設定可能。

tablr

tablr
CSVExcelっぽくテーブル形式で参照・修正できます。Shift-JISもok。
Macの他のツールでもいいですが、お手軽なので使って見ています。
f:id:rochefort:20170902160324p:plain
 

See Also

Atom結構いいかも - rochefort’s blog

git submoduleの更新方法を勘違いしていた

ずーっと勘違いしていた。
 

これで更新されない

$ git submodule update

 
 
これでできたと思っていた

$ git submodule foreach 'git pull origin master'
$ git submodule update

git submoduleの更新 - rochefort’s blog
 
 
でも正しくはこれだった

$ git submodule update --recursive

おまけ

ちなみにrecursive オプションは、git cloneにもある。
これ使うとgit submodule init, update が不要になる。
Git - サブモジュール