読者です 読者をやめる 読者になる 読者になる

なにも わからぬ

パソコンとプログラミング関係をメモっていきたい

Hello, Kotlin

Javaも書けないのにbetter Javaとして評判のKotlinに手を出してみた。とりあえず定番っぽい以下の本を買う。

もちろんJava経験者がターゲットなので、「第3章:ガイドツアー」からなかなか厳しい。けど「第4章:基本的な文法」からはよくある言語仕様の紹介になり、ずぶの素人でもついていけそうな感じになっている。

最終的にはAndroidアプリを作るのが目標だけど、とりあえずはIntelliJ IDEAで純粋にKotlinをいじってみよう。Hello worldを言わせるだけじゃ面白くないので、昔やったことのある穴掘り法による迷路作成を適当に実装してみた。

import java.util.*

fun createMap(xLength: Int, yLength: Int): Array<Array<Int>> {
    var map = Array(yLength, {Array(xLength, {0})})

    fun buildRoad(posX: Int, posY: Int) {
        val directions: List<Int> = mutableListOf(0,1,2,3)
        Collections.shuffle(directions)
        for (i in directions) {
            val distance:Array<Int> = when(i) {
                0 -> arrayOf(0, -1)
                1 -> arrayOf(1, 0)
                2 -> arrayOf(0, 1)
                3 -> arrayOf(-1, 0)
                else -> arrayOf(0, 0)
            }
            val dest:Array<Int> = arrayOf(posX+distance[0]*2, posY+distance[1]*2)
            if (
                dest[0] in 0..xLength-1
                && dest[1] in 0..yLength-1
                && map[dest[1]][dest[0]] == 0
            ) {
                map[posY+distance[1]][posX+distance[0]] = 1
                map[dest[1]][dest[0]] = 1
                buildRoad(dest[0], dest[1])
                break
            }
        }
    }

    map[1][1] = 1
    buildRoad(1, 1)
    for (i in 0..100) {
        val r = Random()
        while(true) {
            val x = r.nextInt(xLength)
            val y = r.nextInt(yLength)
            if (x%2 == 1 && y%2 == 1 && map[y][x] == 1) {
                buildRoad(x, y)
                break
            }
        }
    }
    return map
}

fun main(args: Array<String>) {
    val scanner = Scanner(System.`in`)
    var input: String
    var length: Int
    while (true) {
        println("迷路の1辺のマス数を10以上で入力(偶数は奇数に繰り上げ)")
        input = scanner.nextLine()
        if (Regex("""\d{2}""").matches(input)) {
            length = if(input.toInt()%2 == 1) input.toInt() else input.toInt()+1
            break
        }
    }
    var map: Array<Array<Int>> = createMap(length, length)

    for (y: Int in map.indices) {
        var line:String = ""
        for (x: Int in map[y].indices)
            line += if (map[y][x] == 0) "#" else "."
        println(line)
    }
}

実行するとこんな感じに f:id:htkb:20161101235416j:plain

難しいけど少しずつやっていこう。