LoginSignup
1
0

More than 1 year has passed since last update.

KotlinでCLIのWordleクローンを作ってみた

Last updated at Posted at 2022-03-14

Wordleとは

いま流行りの単語当てゲームです。まだの方はこちらから遊んでみてください。

Wordleのルールは非常にシンプルです。

  • プレイヤーは5文字の英単語を入力する
  • 入力された英単語に含まれる各文字を正解の英単語と比較して、
    • 正解に含まれる文字が正解と同じ位置なら🟩で表示
    • 正解に含まれる文字が正解と異なる位置なら🟨で表示
  • 6回以内に正解の単語を当てられたらクリア

このゲームをCLIで再現すること自体はそれほどむずかしくなさそうです。

というわけでKotlinの勉強がてら作りました。

枕詞を当てるゲームにしてみた

Wordles of the Worldを見ればわかる通り、Wordleクローンは今や雨後の筍がごとく作られています。日本語版も複数あり、ふつうにやっていてはネタ被りは避けられません(wordleクローンがすでにネタ被り? それはそう)

というわけで、(「Wordle 枕詞」でググった感じなさそうだったので)枕詞を当てるゲームにしてみました。

だいたいこんな感じになっています:

makurakotoba_test2.gif

makurakotoba_test3.gif

ソースコードはGithubに上げました。

コード(枕詞リストを除く)

Main.kt
import java.security.SecureRandom

enum class Valid {
    GRAY, YELLOW, GREEN
}

enum class ANSIColor(val escapeSequence: String) {
    GREEN("\u001b[32;1m"),
    YELLOW("\u001b[33;1m"),
    RESET("\u001b[0m")
}

fun wordCheck(word: String, answer: String): Array<Valid>{
    val checkArray: Array<Valid> = Array(word.length){Valid.GRAY}
    for (i in word.indices){
        for (j in word.indices){
            if (word[i] == answer[j]){
                if (i == j){
                    checkArray[i] = Valid.GREEN
                }else{
                    checkArray[i] = Valid.YELLOW
                }
            }
        }
    }
    return checkArray
}

fun putColor(word: String, checkList: List<Valid>): String{
    var coloredString = ""
    for ((index, ele) in checkList.withIndex()){
        coloredString += when(ele){
            Valid.GREEN -> ANSIColor.GREEN.escapeSequence+word[index]+ANSIColor.RESET.escapeSequence
            Valid.YELLOW -> ANSIColor.YELLOW.escapeSequence+word[index]+ANSIColor.RESET.escapeSequence
            Valid.GRAY -> word[index]
        }
    }
    return coloredString
}

fun main() {
    val canTry = 7
    var cleared = false
    val answer = makurakotoba[SecureRandom().nextInt(makurakotoba.size)]
    var checkArray: Array<Valid>
    val message = "${answer.length}文字の枕詞を「ひらがな」で入力してください。"
    println(message)
    println("${canTry}回までトライできます。")
    for ( i in 0 until canTry ){
        print("> ")
        var word = readLine()
        while (word.isNullOrEmpty() || word.length != answer.length || (!makurakotoba.contains(word))){
            when{
                word.isNullOrEmpty() -> {
                    println(message)
                }
                word.length != answer.length -> {
                    println("${answer.length}文字の枕詞を入力してください。")
                }
                !makurakotoba.contains(word) -> {
                    println("入力されたことばが本プログラムの辞書にありません。")
                }
            }
            print("> ")
            word = readLine()
        }
        checkArray = wordCheck(word, answer)
        val colored = putColor(word, checkArray.toList())
        println(colored)
        if (word.equals(answer, ignoreCase = true)){
            cleared = true
            break
        }
    }
    if (cleared){
        println("おめでとうございます!")
    }else{
        println("こたえはこれでした: $answer")
    }
}

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0