Skip to content

Commit f29f95e

Browse files
committed
タイピングゲームの実装
1 parent 1b40d34 commit f29f95e

16 files changed

+969
-0
lines changed

kadai3/.idea/kadai3.iml

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

kadai3/.idea/misc.xml

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

kadai3/.idea/modules.xml

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

kadai3/.idea/vcs.xml

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

kadai3/.idea/watcherTasks.xml

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

kadai3/.idea/workspace.xml

Lines changed: 362 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

kadai3/simady/README.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
## 課題内容
2+
タイピングゲームを作ろう
3+
- 標準出力に英単語を出す(出すものは自由)
4+
- 標準入力から1行受け取る
5+
- 制限時間内に何問解けたか表示する
6+
7+
## 実行例
8+
```$xslt
9+
$ typing-game
10+
【タイピングゲーム】画面に表示される英単語をできるだけ多く入力しましょう!
11+
制限時間は10秒です。
12+
1問目: apple
13+
>apple
14+
正解! 現在の正答率:1/1
15+
2問目: bake
16+
>bake
17+
正解! 現在の正答率:2/2
18+
3問目: cup
19+
>cup
20+
正解! 現在の正答率:3/3
21+
4問目: dog
22+
>cat
23+
不正解... 現在の正答率:3/4
24+
5問目: egg
25+
>
26+
タイムアップ!
27+
***
28+
4問中3問正解
29+
***
30+
お疲れ様でした!
31+
```
32+
33+
## その他
34+
- 制限時間や問題等が固定になっているので可変にしたい
35+
- テストパッケージを分けたい
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package gamemaster
2+
3+
import (
4+
"bufio"
5+
"context"
6+
"fmt"
7+
"io"
8+
"time"
9+
)
10+
11+
type GameMaster interface {
12+
Play()
13+
}
14+
15+
type gameMaster struct {
16+
// 入力元
17+
r io.Reader
18+
// 出力先
19+
w io.Writer
20+
// 制限時間(分)
21+
timeLimit time.Duration
22+
// 問題
23+
problems []string
24+
// 回答数
25+
answerNum int
26+
// 正答数
27+
correctAnswerNum int
28+
}
29+
30+
// New GameMasterを生成する.
31+
func New(reader io.Reader, writer io.Writer, timeLimit time.Duration, problems []string) GameMaster {
32+
return &gameMaster{
33+
r: reader,
34+
w: writer,
35+
timeLimit: timeLimit,
36+
problems: problems,
37+
}
38+
}
39+
40+
func (gm *gameMaster) Play() {
41+
gm.displayRule()
42+
gm.game()
43+
gm.displayResult()
44+
}
45+
46+
// displayRule ルールを表示する.
47+
func (gm *gameMaster) displayRule() {
48+
fmt.Fprintln(gm.w, "【タイピングゲーム】画面に表示される英単語をできるだけ多く入力しましょう!")
49+
fmt.Fprintf(gm.w, "制限時間は%d秒です。\n", gm.timeLimit)
50+
}
51+
52+
// game ゲームを行う.
53+
func (gm *gameMaster) game() {
54+
ctx, cancel := context.WithTimeout(context.Background(), gm.timeLimit*time.Second)
55+
defer cancel()
56+
57+
ch := gm.input()
58+
59+
gameLoop:
60+
for i := 0; i < len(gm.problems); i++ {
61+
problem := gm.problems[i]
62+
fmt.Fprintf(gm.w, "%d問目: %s\n", i+1, problem)
63+
fmt.Fprint(gm.w, ">")
64+
65+
var in string
66+
var ok bool
67+
select {
68+
case in, ok = <-ch:
69+
if !ok {
70+
break gameLoop
71+
}
72+
gm.answerNum++
73+
case <-ctx.Done():
74+
break gameLoop
75+
}
76+
77+
if in == problem {
78+
gm.correctAnswerNum++
79+
fmt.Fprint(gm.w, "正解!")
80+
} else {
81+
fmt.Fprint(gm.w, "不正解...")
82+
}
83+
fmt.Fprintf(gm.w, " 現在の正答率:%d/%d\n", gm.correctAnswerNum, gm.answerNum)
84+
}
85+
}
86+
87+
// displayResult 結果を表示する.
88+
func (gm *gameMaster) displayResult() {
89+
fmt.Fprintln(gm.w)
90+
if gm.answerNum == len(gm.problems) {
91+
fmt.Fprintln(gm.w, "全問回答しました!")
92+
} else {
93+
fmt.Fprintln(gm.w, "タイムアップ!")
94+
}
95+
fmt.Fprintln(gm.w, "***")
96+
fmt.Fprintf(gm.w, "%d問中%d問正解\n", gm.answerNum, gm.correctAnswerNum)
97+
fmt.Fprintln(gm.w, "***")
98+
fmt.Fprintln(gm.w, "お疲れ様でした!")
99+
}
100+
101+
func (gm *gameMaster) input() <-chan string {
102+
ch := make(chan string)
103+
go func() {
104+
s := bufio.NewScanner(gm.r)
105+
for s.Scan() {
106+
ch <- s.Text()
107+
}
108+
close(ch)
109+
}()
110+
return ch
111+
}

0 commit comments

Comments
 (0)