Go でタイピングゲーム作った

Go でタイピングゲーム作った

メルカリさんのご好意で「プログラミング言語 Go 完全入門」の期間限定公開のお知らせがあり、早速入門しました!

とても良いなと思ったのは、各章毎、学んだことをハンズオン形式でプログラミングして都度使い方を試せるところかなと思います。

そこにお題としてあった Go でタイピングゲームを作りました ♪

時間制限内に出題されたワードをタイピングし正解する毎にすこアップする、というゲームです。

やったこと

お題を出す

tjarratt/babble でランダムにお題とするワードを取得し標準出力

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import (
...
"github.com/tjarratt/babble"
)

func init() {
...
babbler = babble.NewBabbler()
babbler.Count = 1 // 1ワードに設定.
}

// 出題
func q() {
question = babbler.Babble()
fmt.Println("\ntype this: ", question)
fmt.Print("> ")
}

ゲーム開始前のカウントダウン

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func _main() {
// ゲーム開始前の 3,2,1 Go 表示
countdown()
...
}

func countdown() {
for i := 3; i > 0; i-- {
fmt.Print(i)
fmt.Print(" ")
time.Sleep(time.Second)
}
fmt.Println("Go !")
}

context.WithTimeout でタイムアウト処理

for-select パターンで無限にチャネルを作り、受け取れる様にしています。
時間制限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// タイムアウト処理付き context
bc := context.Background()
ctx, cancel := context.WithTimeout(bc, d)
defer cancel()

...

for {
select {
case <-ctx.Done(): // タイムアウト
fmt.Println("\n\ntime up !")
fmt.Println("score:", score)
return
...
}
}

標準入力から文字列取得し chan に送信

for-select パターンが待ち受けているので、無限に標準入力からの文字列取得処理が発行されます。
タイムアウト context によって、これらの処理ができなくなる様、打ち切られます。

1
2
3
4
5
6
7
8
9
10
11
12
func input(r io.Reader) <-chan string {
ch := make(chan string)
go func() {
// 標準入力から一行ずつ文字を読み込む
s := bufio.NewScanner(r)
for s.Scan() {
ch <- s.Text()
}
close(ch)
}()
return ch
}

こんなことやってみたい!

  • ゲーム中に音を出したい
  • PC タイピングゲームの様に敵が現れ、正しくタイピングする度に敵がダメージを受けている様なアクションをさせたい

こんなことを Go でやってみたいです。

ebiten の出番か!?

引き続き入門続けます ♪

以上
参考になれば幸いです。

Author

Kenzo Tanaka

Posted on

2020-04-30

Licensed under

コメント