[Swift Playgrounds] – ライフゲームでアルゴリズムを学ぼう – Blink編(Modifying Rules)

2016.11.04

こんぬづは、新海誠監督の『言の葉の庭』が好きなのですが、舞台となっている新宿御苑に昨日初めて行くことができて晴れやかな気分の田中です。
今度は梅雨の季節に、雨の降る午前中にビールとチョコレートを持って行きたい。

今回はSwift Playgroundsの『Blink』というコンテンツのModifying Rulesの紹介です。
前回はライフゲームについて説明してきました。今回は実際にソースコードに触れていきます。

blink

Swift Playgroundsとは?

こちらをご覧ください。

[Swift Playgrounds] - Swift Playgroundsことはじめ - 全体紹介編

BlinkはSwift Playgroundsに入っているコンテンツの一つで、コンウェイのライフゲームを通してアルゴリズムについて学び、最終的には自分自身で考えたルールを作り出し、その通りにシミュレーションをすることを目的としたものです。

Modifying Rules解説

Modifying Rulesではすでに組まれたソースコードに修正を加えることでライフゲームのルールを自分で考えたルールに変えてみることを目標とします。
以下の動画で動きをみることができます。

ソースコード解説

ソースコード中にコメントを記載して解説をしていきます。

let simulation = Simulation()


// ----- 編集可能箇所 -----
// セルのサイズ。数を大きくするとセルが大きくなります。
simulation.cellDimention = 32

// 最初に出現させるパターンの種類と位置を設定します。
// 第一引数          : パターン。開始時に表示するパターンを修正することができる。
// .capitalL, .glider, .pentadecathlon, .pulsarの四つが用意されている。
// 第二引数(atColumn): 開始時に表示する列位置。
// 第三引数(row)     : 開始時に表示する行位置。
simulation.placePattern(Pattern.glider, atColumn: 3, row: 3)

// シミュレーションの速度
simulation.speed = 2

// セルの状態に合わせた表示方法を定義。好きな文字、絵文字、画像、色などに書き換えてみましょう。
simulation.set("?", forState: .alive)
simulation.set(Color, forState: .alive)
simulation.set("?", forState: dead)
simulation.set(Color, forState: .dead)
simulation.set(Color, forState: .idle)

// --------------------

func configureCell(cell: Cell) {
    
    
    // ----- 編集可能箇所 -----
    switch cell.state {
    // セルの生死に関するルールを作りましょう。
    case .alive:
        if cell.numberOfAliveNeighbors < 2 {
            cell.state = .dead
        }
        else if cell.numberOfAliveNeighbors > 3 {
            cell.state = .dead
        }
    case .dead:
        if cell.numberOfAliveNeighbors == 3 {
            cell.state = .alive
        }
    case .idle:
        if cell.numberOfAliveNeighbors == 3 {
            cell.state = .alive
        }
    }
    // --------------------
    
    
}

書き換えのポイント

パターンを覚える

ソースコードだとここです。

simulation.placePattern(Pattern.glider, atColumn: 3, row: 3)

capitalL, glider, pentadecathlon, pulsarはライフゲームでよく現れる形のようです。
placePatternメソッドで選択できるそれらを見て覚えてみるとまたルールの書き換えに良いアイデアが思いつくかもしれません。

セルの状態表示を変える

ソースコードだとここです。

simulation.set("?", forState: .alive)

初期表示では笑顔とオバケの絵文字ですが、?にかえてみたり?に変えてみるとなかなか面白いです。
自分も?が勝手に泳ぎだして増えていくように見えるのが面白かったりしました。
また、画像も入れることができるようなので、あまり大きなものはどうかわかりませんが自分で書いて入れてみるのもよいかもしれません。

生死のルールを変える

ソースコードだとここです。

switch cell.state {
    case .alive:
        if cell.numberOfAliveNeighbors < 2 {
            cell.state = .dead
        }
        else if cell.numberOfAliveNeighbors > 3 {
            cell.state = .dead
        }
    case .dead:
        if cell.numberOfAliveNeighbors == 3 {
            cell.state = .alive
        }
    case .idle:
        if cell.numberOfAliveNeighbors == 3 {
            cell.state = .alive
        }
}

Blinkの書き換えで面白い箇所は特にここです。
生死のルールを変えることでパターンの繁栄の仕方がまったく変わってきたりします。
「俺の考えた最強のパターン」が「俺の考えた最強のルール」によって最弱になったりすることもあるかもしれません。

まとめ

まず一から書くのではなく、修正を加えるところから始めるのもプログラミングの学び始めではよくやる手法です。
完成度の高いプログラムの書き換えたら良い部分のみが簡潔にまとめられているこの章は、その方法を学ぶのに良いサンプルだと思いました!