皆様こんにちは、いかがお過ごしでしょうか。
技術部の@shogi727です。
水曜のひと時、16日目のtech.kayac.com Advent Calendar 2015でお楽しみください。
普段ターミナルを開いて作業をしている時、四角いターミナルの画面がそのまま将棋盤になってそのまま将棋させたらいいなぁと思ったことありませんか?
いや、さすがにそれは何が何でも難しいでしょと思いますか?
安心してください。ありますよ。
今回はそんなあなたの望みを叶えるコマンドをつくってみました。
左右が違うターミナルとなっていて交互にコマンドで指していけます。
ターミナルの背景がリアルタイムで変わって、まさにその場に将棋盤があるかのように見えます。
これさえあればvimからの自然な流れでリアルな将棋を指すことができるようになります。
将棋で例えるとまさに中原誠先生の指し回しのような自然な流れですね。
さて、最後に技術的な話しをしておきます。
技術的なところ
駒の操作
ベースは去年のアドベントカレンダーで作ったconsole-jchessを使っていますのでこちらをみてください。
基本的にconsole-jchessと同じで従来通りコマンドで指せます。
例えば
mv 77 76
と打つと7七の歩が7六へ動きます。
成り不成りは相手の陣地に入ったら聞かれます。
盤面の作成
内部でImageMagickを使用しています。それを白い将棋盤の画像に順番に貼り付けていっています。
system "convert #{BOARD_FILE} #{image_name} -geometry #{position pos} -composite state.png"
BOARD_FILEが将棋盤の画像パスで、そこに駒のファイル名であるimage_nameを合成しています。
これだけだと、将棋盤に一つしか駒が乗らないので、state.pngという名前で書き出してこれに連続で駒画像を繰り返し合成していっています。
手駒に関しても合成位置を変えて同じように合成しています。
ターミナルの背景に表示
次に、合成が完了した画像をターミナルの背景に表示します。背景の更新部分はJXA(JavaScript for Automation)を使っています。
#!/usr/bin/osascript -l JavaScript
function run(argv){
var img = argv[0];
var app = Application("iTerm");
app.currentTerminal.currentSession.backgroundImagePath = img || null;
}
このように記入したiterm-bg-image.jsというファイルを作成して実行権限を与え、Rubyから下記のように実行しています。
system("#{WORKING_DIR}iterm-bg-image.js #{WORKING_DIR}state.png")
これを1秒おきに実行して常に変更が反映されるようにしています。
コード
まだREADMEは書けていませんが、ImageMagickが必要なこと以外はconsole-jchessと同じです。
*駒のイラストなどは素材のプチッチさんから許可を得て使用させていただいています
改善すべきところ
・毎回まっさらな盤面に全ての駒を画像合成していってるので遅いのでなんとかしたい。
・ターミナルの背景を変更する部分がcurrentTerminalになっているので、プログラムを実行している背景をすべて変更したい。
というわけで以上です。
次回は最近カヤックにジョインしたマーティンです。楽しみですね。
参考:
http://shogi1.com/shimizuichiyo-nhk-shinte-kosei/