[初めてのGoアプリ]簡単なタイピングゲームアプリ作ってみた!


概要

Goの基礎練習に、初めてアプリ作ってみました!
なお、今までRails中心のアプリしか作ったことない、完全Go初心者です。
Go言語書いたことないけど興味ある駆け出しエンジニアさんに見ていただきたいです!

※内容はProgateのGoコースを参考にしています。

成果物(コンソールにて)

% go run typing.go
[質問1] 次の単語を入力してください: html
html
正解!
[質問2] 次の単語を入力してください: css
ccs
不正解!
[質問3] 次の単語を入力してください: ruby
ruby
不正解!
5.291065秒かかりました
スコア 20

ほんと、このレベルですのでご了承ください...

なお、以下はGoがインストールされている前提です。
インストールされていない方は、私の以前の記事をご覧ください!
10分もあればインストールできますよ!
↓↓
▼Railsしか使ったことない駆け出しエンジニアが、Goの環境構築してみた!▼
https://qiita.com/matsufuji_tech/items/523b1520c1bb71c63f78

手順

1. 雛形を記述

typing.go
package main

import "fmt"

func main() {

}

2. 質問と正解or不正解を表示させるためのask関数を追加

typing.go
package main

import "fmt"

func main() {

}

//以下を追記
func ask() {

}

3. 質問のみをコンソールに表示

typing.go
package main

import "fmt"

func main() {
  //引数をask関数内に渡してask関数を実行
  ask("html")
  ask("css")
  ask("ruby")
}

//引数のデータ型を指定して変数questionとして受け取る
func ask(question string) {
  //以下を追記
  fmt.Printf("次の単語を入力してください: %s\n", question)
}

4. 変数inputのデータ型を設定し、fmt.Scanを用い入力待ちにする

typing.go
package main

import "fmt"

func main() {
  ask("html")
  ask("css")
  ask("ruby")
}

func ask(question string) {
  //変数inputを宣言し、データ型を指定
  var input string

  fmt.Printf("次の単語を入力してください: %s\n", question)

  //fmtパッケージ内の機能、Scanを用いquestion内に入力されたデータを格納させる
  fmt.Scan(&input)

}

5.正解or不正解のif分岐

typing.go
package main

import "fmt"

func main() {
  ask("html")
  ask("css")
  ask("ruby")
}

func ask(question string) {
  var input string

  fmt.Printf("次の単語を入力してください: %s\n", question)

  fmt.Scan(&input)

  //同じ文字列になるかどうかで分岐
  if question == input {
    fmt.Println("正解!")
  } else {
    fmt.Println("不正解!")
  }

}

6.int型のデータをnumberに引数として受け取らせ、[質問1]...を表示

typing.go
package main

import "fmt"

func main() {
  //引数として1, 2, 3をそれぞれ追加
  ask(1, "html")
  ask(2, "css")
  ask(3, "ruby")
}

//numberのデータ型を指定し、呼び出し時に引数として受け取れるようにする
func ask(number int, question string) {
  var input string

  //[質問1]...を追加し、numberを受け取る値として追加。(※numberはquestionより先に文字列に表示されるので、先に指定しないとエラーになります)
  fmt.Printf("[質問%d] 次の単語を入力してください: %s\n", number, question)

  fmt.Scan(&input)

  if question == input {
    fmt.Println("正解!")
  } else {
    fmt.Println("不正解!")
  }

}

7. 戻り値(ゲーム結果)を変数totalScoreで受け取るようにし、表示させる

typing.go
package main

import "fmt"

func main() {
  //戻り値を格納する変数totalScoreを定義。"+="はさらに足し合わせるという意
  totalScore := ask(1, "html")
  totalScore += ask(2, "css")
  totalScore += ask(3, "ruby")

  //結果を表示
  fmt.Println("スコア", totalScore)
}

//戻り値のデータ型を指定
func ask(number int, question string) int {
  var input string

  fmt.Printf("[質問%d] 次の単語を入力してください: %s\n", number, question)

  fmt.Scan(&input)

  if question == input {
    fmt.Println("正解!")
   //正解したら10を戻り値として返す
    return 10

  } else {
    fmt.Println("不正解!")
    //不正解なら0を戻り値として返す
    return 0

  }

}

8. ゲームにかかった時間を表示させる

typing.go
package main

import "fmt"
//tumeパッケージをインポート
import "time"

func main() {
  //ask関数実行前に現在の時刻を取得
  start := time.Now();

  totalScore := ask(1, "html")
  totalScore += ask(2, "css")
  totalScore += ask(3, "ruby")

  //ask関数実行後に現在の時刻を取得
  start := time.Now();

  //何秒かかったか表示
  fmt.Printf("%f秒かかりました\n", (end.Sub(start)).Seconds())

  fmt.Println("スコア", totalScore)
}

func ask(number int, question string) int {
  var input string
  fmt.Printf("[質問%d] 次の単語を入力してください: %s\n", number, question)
  fmt.Scan(&input)

  if question == input {
    fmt.Println("正解!")
    return 10

  } else {
    fmt.Println("不正解!")
    return 0

  }

}

終わりに

質問の文字列を色々変えて、
"go run typing.go"で遊んでみてください!

まだまだ、こんなレベルなのでこれからも精進いたします!