🏈
GoでWordleを作る
GoでWordleを作る
対象読者: Go学び始め ~ 中級者を目指す人
Wordle
みんな大好き、決められた文字数の単語を入力して、各文字の登場位置から答えの単語を当てるゲームです。
成果物
Point
文字に色をつける
文字が答えの中に登場するかどうかおよび文字の登場位置が合致しているかの情報を、文字色によって示す必要があります。
ANSI escape codeに従い、端末への出力に色をつけることができます。
type ColorScheme string
const (
BgBrightRed ColorScheme = "\033[1;101m%s\033[0m"
BgBrightGreen ColorScheme = "\033[1;102m%s\033[0m"
BgBrightBlue ColorScheme = "\033[1;104m%s\033[0m"
)
定数値として色コードのラッパーを用意し、それを内包するToken オブジェクトの文字列表現にString()
メソッドおよびGoString()
メソッドを実装します。
type Token struct {
Literal string
util.ColorScheme
}
func (t Token) String() string {
return fmt.Sprintf(string(t.ColorScheme), t.Literal)
}
func (t Token) GoString() string {
return fmt.Sprintf(string(t.ColorScheme), t.Literal)
}
参考: ANSI escape code - Wikipedia
ルールをカスタマイズする
type ValidateFunc func(s string) bool
func ValidLowerAlphabet(length int) ValidateFunc {
return func(s string) bool {
// check length
if len(s) != length {
return false
}
for _, r := range s {
if r < 'a' || r > 'z' {
return false
}
}
return true
}
}
Wordleには様々な派生がありますが、おおよそ
- 正統な入力は決められた文字数かつ決められた文字種
という点で共通化できると考えています。
入力の正統性チェックについては、ValidateFunc
として抽象化し依存注入しています。
自前でValidateFuncを実装し、ルールの換装をすることも簡単にできます。
例えば1文字のアルファベットを正統な入力とすれば、Letterleも再現できます()
改善案
- 本家と異なり、適当な英字入力
aaaaa
も受け付けるので、入力が辞書に登録されているかを見る - 日本語に対応
- 5文字のカタカナとか
- テストコード
- 見通しをよくする
Discussion