テトリスをgo言語で作る
この記事は ドワンゴ Advent Calendar 16日目の記事です。
ニコニコ静画で開発をしている @kazuhei0108 です。
ここ1週間ほどGo言語を触ってみたので、その集大成?としてテトリスを作りました。
作ったもの
ソースコードはこちら https://github.com/kazuhei/go-tetoris
テトリスを作ろうと思ったのは http://qiita.com/kurehajime/items/a02eaae3f0c17750c07e の記事を見たからです。
2番煎じです。
GoでのCUIのアプリケーションの作り方、goroutineの使い方などとても参考になりました。
作ってみた感想
Go言語について
for文
日頃SwiftやJavascriptでmapやforeachに慣れてしまっているので、
for文で回さないといけない箇所がたくさん出てきて、辛かったです。
あとappend関数を.
アクセスして動かない〜ってのを10回はやりましたね
// ダメ
list.append(element)
// 良い
list = append(list, element)
[n][m]bool
のスライスが欲しいときに毎回for文回してたんですが、
もっと良いやり方あるんでしょうね...
テスト
Go言語はfilename.go
に対してfilename_test.go
という名前で
テストファイルを作って、go test
のコマンドを打つだけですぐテストができます。
しかもgo test -cover
を実行するとカバレッジが表示されるので、
カバレッジを上げるためにテスト書くぞーってなります。
あと、Goのテストは外部のライブラリなどを使わずに、testingというライブラリだけを使って、Table Driven Testという入力と出力を表にして順番にやっていくというようなテストが推奨されているようです。
type transformPointsTestCase struct {
points []point
expect []point
}
func TestRemoveFilledRows(t *testing.T) {
var stage = newStage(3, 3)
testCases := []transformPointsTestCase{
{ // 列を埋めていないときは何も起きない
[]point{{X: 0, Y: 0}},
[]point{{X: 0, Y: 0}},
},
{ // 列を埋めていて、さらに上に載っているときはそれが落ちてくる
[]point{{X: 0, Y: 0}, {X: 0, Y: 1}, {X: 1, Y: 1}, {X: 2, Y: 1}},
[]point{{X: 0, Y: 1}},
},
{ // 2列を埋めているときは2段消えて、上のブロックは2段ずれる
[]point{{X: 0, Y: 0}, {X: 0, Y: 1}, {X: 1, Y: 1}, {X: 2, Y: 1}, {X: 0, Y: 2}, {X: 1, Y: 2}, {X: 2, Y: 2}},
[]point{{X: 0, Y: 2}},
},
}
for i, testCase := range testCases {
actual := stage.removeFilledRows(testCase.points, 1)
if !reflect.DeepEqual(testCase.expect, actual) {
t.Errorf("#%d: got:%v expect:%v", i, actual, testCase.expect)
}
}
}
地道ですが、分かりやすくて良いです。
Visual Studio Codeについて
今回Go言語を書くにあたって最初はAtomで書こうと思っていたのですが、
Goのプラグイン入れても、go get
した外部のライブラリの補完が効きませんでした。
$GOPATH
の設定が悪かったとかなにかあったのかもしれませんが調べるのも面倒だったので、
有識者( @koki_cheese )に聞いたところVisual Studio Codeが良いという話だったので、試しに使ってみました。
結果としては、補完も効いてサクサク書けたので良かったです。
テトリスについて
プログラム
ブロック回転させたり, 1列揃ったら消して、その上似合ったブロックを下にずらしたり等
作り始める前の想定よりも割りとめんどくさかったですね。
Javascriptで200行で書くサンプル等があったので、余裕っしょと思ったのですが、
結構大変でした。
トリビア
プログラム書いているときに、上から降ってくるブロックになんて名前つけようかな、
と思ってググったら、あれはテトリミノ
という名前がちゃんとついているんだということを知りました。あとテトリスはロシア発らしいです。
学ぶのに参考にしたもの
サイト
書籍
テストのところは殆どこの本を見て書きましたが、とても参考になりました。
終わりに
いつもWebやアプリを開発していて、ゲーム等は作ったことが無かったので、ゲームを作るということ自体面白かったです。
Goの書き方が分かってきたので、次はWeb書いてみようかなと思っています。
宣伝
自分が所属するニコニコ静画では現在コミケC91との連動企画を行っています。
自分はiOSアプリのビューワー部分を担当しています。コミケに行く方はぜひ使ってみてください。