あれとかこれとかそれとか

気まぐれプログラマーのブログです。簡単なことから小難しいことまで必死に勉強した内容を書き留めていきます。プログラム以外にも気になったことや面白かったことをまとめていこうと思います。

【Swift】 リバーシを作りましょう #2 周辺座標に存在するオブジェクトを検索する

前回の記事はこちらから
aretoka-koretoka-soretoka.hatenablog.com

周辺座標に存在するオブジェクトを確認するため、searchObject 関数を作成します。
引数では、打つ予定のオブジェクトタイプと打つ座標をもらいます。

処理の内容は

①ローカル変数を用意しています。

②周辺座標検索テーブルを仕様して、周辺8マスの状態を確認します。
 id0 は Y座標 id1 は X座標 を表します。

③引数で貰った座標に対して、オフセット座標を足し合わせて現在位置を作成します。
 現在位置が範囲外を差した場合は、何もせずに次の座標に進みます。

④現在位置に打たれているオブジェクトの状態をチェックします。
 引数で指定したオブジェクトと別のものが存在する場合は処理を継続します。

⑤指定座標からオブジェクトが同一オブジェクトではさみこめるかをチェックします。

⑥オフセット座標の方向10マス分先から順にオブジェクトの状態を確認していきます。
 この時、現在位置が範囲外を差した場合は、何もせずに次の座標に進みます。

⑦同じオブジェクトが存在する場合、pinch = true とし、次の座標からオブジェクトをひっくり返してゆく。

⑧はさみこみ判定を初期化して、次のオフセット座標をチェックしていく。

となっています。

// 周辺8マスを検索して置ける条件に当てはまれば置く(x:X座標,y:Y座標,type:オブジェクトタイプ(0 ■,!0 ●),戻り値:配置できるかどうか(true 可能, false 不可))
func searchObject(x:Int,y:Int,type:Int) -> Bool {
    // ①
    let revType = type == OBJTYPE.WHITE.rawValue ? OBJTYPE.BLACK.rawValue : OBJTYPE.WHITE.rawValue
    var ret = false     // 書き換え判定
    var pinch = false   // はさみこみ判定
    let oldArray = workArray

    print(x,y,"に",object[type],"を置こうとしています")
    
    // ②
    // 縦
    for var idx0 = 0; idx0 < searchTbl.count; idx0++ {
        // 横
        for var idx1 = 0; idx1 < searchTbl[idx0].count; idx1++ {
            // ③
            // 現在の座標
            let current:(x:Int,y:Int) = (x:x + searchTbl[idx0][idx1].x,y:y + searchTbl[idx0][idx1].y)
            let loop = searchTbl.count
            
            // 範囲外の場合はコンテニュー
            if(loop <= current.y || loop <= current.x || current.y < 0 || current.x < 0) {
                print("current continue")
                continue
            }
            print("current",current)
            
            // ④
            // 指定したオブジェクト種別と違うものが存在する場合
            if(workArray[current.y][current.x] == object[revType]) {
                print(current.x,current.y,"に",object[revType],"があります")
                
                // ⑤
                // 挟めるかチェック
                for var cnt = loop; 0 <= cnt; cnt-- {
                    // ⑥
                    // 移動後の座標
                    let next:(x:Int,y:Int) = (x: current.x + (searchTbl[idx0][idx1].x * cnt),y: (current.y + (searchTbl[idx0][idx1].y * cnt)))
                    // 範囲外の場合はコンテニュー
                    if(loop <= next.y || loop <= next.x || next.y < 0 || next.x < 0) {
                        print("next continue")
                        continue
                    }
                    print("next",next)

                    // ⑦
                    // 同じオブジェクト種別が存在するかチェック
                    if(workArray[next.y][next.x] == object[type]) {
                        print("!!true!!")
                        ret = true                      // 書き換えられた
                        pinch = true                    // はさみこまれた
                        workArray = oldArray            // 同じオブジェクトを二つ以上発見したらテーブルを元に戻す
                    }

                    // はさめる場合はひっくり返す
                    if(pinch == true) {
                        workArray[next.y][next.x] = object[type]
                    }
                }
            }
            // ⑧
            // はさみこみ判定を初期化
            pinch = false
        }
    }
    return ret
}