Zenn
🏈

GoでWordleを作る

2022/03/19に公開

GoでWordleを作る

対象読者: Go学び始め ~ 中級者を目指す人

Wordle

Wordle - The New York Times

みんな大好き、決められた文字数の単語を入力して、各文字の登場位置から答えの単語を当てるゲームです。

成果物

https://github.com/sayuen0/wordle-go

image

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

ログインするとコメントできます