きっかけ
今年の夏、C言語でプログラミングの学習を始めた頃になんとなく作ったコレ。
ターミナルでコンピュータプレイヤと対戦できるリバーシ(登録商標のため控えるけどオ◯ロのこと)をC言語で書いた。
自分でアルゴリズムを紙に書いたりして、配列の中身を出力させたりしながらバグをとって組み上げていくのがとても楽しかったことを覚えている。
というわけで、引き続きこのネタで楽しいことをしようと思い、Goでこのプログラムを書き直すことにした。
そして、どうせならGUIでマウスでポチポチと楽しめるような、一番最初にやりたかった仕様を実現させるようにしようと思う。
そこで、今回はまず本体の移植の前に、GoのGUIをどんなライブラリで実装するかを検討し、軽いプロトタイピングをしてみたので、紹介していく。
Go x GUI
Goのコマンドラインアプリの実装でのパワフルさは、色々なweb上のtipsや書籍、また自身の業務の中で実感している。
逆に、GUIはまだまだこれからというような意見が多く、これぞというGUIのフレームワークは確立されていないように思える。
現在Web上で見かける開発が進んでいるGoのGUIライブラリは以下のようなものがある。
- Go-qml
- go-gtk
- WALK
- shiny
参考:Go最後の秘宝「GUI」を探しに行く
いくつかのものを試食してみた結果、今回はshinyを使用して開発してみることにした。
今回は記事執筆時点で最新のgolang/exp
のリビジョン03962049e143533dbf9467cffb8a52a15595b718
を使用している。
shiny
shinyはGoオフィシャルのサブプロジェクトとして、2015年の7月にプロポーザルが出され、https://godoc.org/golang.org/x/exp 以下で開発が進められているGUIフレームワークである。
あくまでもサブプロジェクトであるため(READMEによると"experimental and deprecated packages"とある)、go get
でインストールする。
go get golang.org/x/exp/shiny/...
そしてまずはサンプルコードを...、今回shinyを選んだのはクロスプラットフォームなことと、なにより最大の理由はこれである。
go run main.go board.go xy.go
https://github.com/golang/exp/tree/master/shiny/example/goban
なんとGoだけに碁のGUIサンプルが付属しているのだ。
これはこのままリバーシに転用できそうだということで、今回はこのサンプルコードをモディファイする形でGUIを作成してみることとする。
# Go(碁)からgenpeiGo(源平碁)へ #
"Goなんだったら碁を作れよ"という声が聞こえてきそうなので、今回のプロジェクトはリバーシの別称源平碁(genpeiGo)とした。
そしてとりあえずできあがったのがこちら。
go run main.go board.go xy.go
※Gopherの原著作者はRenée French氏
なんとかリバーシのGUIとして使えそうだ。
コードのモディファイ
それでは、サンプルのソースコードに加えた変更を、要点を絞って解説する。
今回はライブラリの良さを上手く活用できているであろうサンプルソースへ、最小限の変更を加えて実装することを目標とした。
まず、上記サンプルのgoban
では碁のスタイルなので、升目は8x8となっているが、石の置き場は9x9となっているため、8x8にしてやる必要がある。
board.go
main.go
この二点のみの変更で置き場の配列とクリックイベントのフィールドを8x8に変更できた。
そして、コメントによると盤上のラインは、配列一つ一つのフィールドの中心に描画することで碁の盤を表現していると書いてあるので以下の記述を変更した。
board.go
これにより、配列のフィールドの枠にに沿ったラインの描画に変更することができた。
3ファイル全体でも500行程で記述されており、シンプルな書き方となっているので、とても扱いやすく、これから不必要な記述を減らしていけばかなりコンパクトなGUIソースにできそうだ。
# まとめ #
- まだまだ開発中のshinyだが、色々と試作してみるには使えるパッケージではないだろうか
- 引き続きGUIのコードを煮詰めながら、冒頭のCソースのGoへの移植とGUIとの紐付けを行っていく