LoginSignup
8
10

More than 5 years have passed since last update.

Go shinyでGenpeiGo(源平碁==リバーシ)のGUIを作成する(shiny導入編)

Last updated at Posted at 2016-12-18

きっかけ

今年の夏、C言語でプログラミングの学習を始めた頃になんとなく作ったコレ。

genpeoGo_cui.gif
ターミナルでコンピュータプレイヤと対戦できるリバーシ(登録商標のため控えるけどオ◯ロのこと)を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
goban_test.gif
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
genpeiGo_test.gif
※Gopherの原著作者はRenée French氏

なんとかリバーシのGUIとして使えそうだ。

コードのモディファイ

それでは、サンプルのソースコードに加えた変更を、要点を絞って解説する。
今回はライブラリの良さを上手く活用できているであろうサンプルソースへ、最小限の変更を加えて実装することを目標とした。

まず、上記サンプルのgobanでは碁のスタイルなので、升目は8x8となっているが、石の置き場は9x9となっているため、8x8にしてやる必要がある。
board.go
diff5.png
main.go
diff4.png
この二点のみの変更で置き場の配列とクリックイベントのフィールドを8x8に変更できた。

そして、コメントによると盤上のラインは、配列一つ一つのフィールドの中心に描画することで碁の盤を表現していると書いてあるので以下の記述を変更した。

board.go
diff6.png
これにより、配列のフィールドの枠にに沿ったラインの描画に変更することができた。

3ファイル全体でも500行程で記述されており、シンプルな書き方となっているので、とても扱いやすく、これから不必要な記述を減らしていけばかなりコンパクトなGUIソースにできそうだ。

 まとめ 

  • まだまだ開発中のshinyだが、色々と試作してみるには使えるパッケージではないだろうか
  • 引き続きGUIのコードを煮詰めながら、冒頭のCソースのGoへの移植とGUIとの紐付けを行っていく
8
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
10