【SwiftUI】ダビスタの完璧な配合アプリを作成してみた(面白い配合×見事な配合)

あけましておめでとうございます!

プログラミングを始めて2年目なので、技術的な記事を書いていけたらと思います。

今回は前回の続きからです。

いまだにダビスタやっています!
自分の牝馬から完璧な配合を生み出す方法を書いていきたいと思います

ですが、swiftでやってしまい、共有が難しいのが難点です。
アプリとして登録しようと思ってないし、やり方わかんないし。。。

とりあえず、完璧な配合を目指していきたいと思います!
実は私は牧場経営50年目にいきましたが、いまだに完璧な配合を作れていません笑

今回は前回の続きからで、見事な配合の計算方法を紹介したいと思います。
正直、無理やりやったので合ってるか不安な部分もあります。。

完璧な配合とは

前回も説明したのですが、ダビスタ(switch)の完璧な配合とは、面白い配合+見事な配合です。
前回は約150頭の繁殖オス馬から面白い配合の馬を厳選する方法を紹介しました。
今回は、自分の繁殖牝馬と見事な配合になるオス馬(面白い配合を持っている)を3世代に渡って計算してみたので、それを紹介したいと思います

見事な配合とは

見事な配合とは、父方の対象馬の系統構成と母方の対象馬の系統構成に大系統が3種類以上あり、一致している場合に成立する配合。
らしいです。

ここのサイトが分かりやすかったです!(https://gamerch.com/derby/entry/208593
つまり
オス馬の父
オス馬の父
オス馬の母
オス馬の母
の系統が

繁殖牝馬




の系統と同じなら見事な配合です(順番は問わず)

方法

先にソースコードです

func checkKanpekiHorse(b: Array<String>) -> [(Int, String)] {
    var kanpekiHorse: [(No: Int, name: String)] = []
    var checking = 0
    var multipleLines: Array<String> = []
    var multipleLine: String = ""
    for i in 0..<4 {
        for j in i + 1..<4 {
            if i != j {
                if b[i] == b[j] {
                    checking += 1
                    multipleLines.append(b[i])
                }
            }
        }
    }
    if checking == 1 {
        multipleLine = multipleLines[0]
    }
    
    if checking < 2 {
    
        for k in 0..<omoshiroHorses.count {
            var checkCount = 0
            var check2 = 0
            var omoshiroArray: Array<String> = []
            omoshiroArray = [omoshiroHorses[k].2,
                             omoshiroHorses[k].3,
                             omoshiroHorses[k].4,
                             omoshiroHorses[k].5]
            
            for l in 0..<4 {
                var doubleCheck = 0
                for m in 0..<4 {
                    if b[l] == omoshiroArray[m] {

                        checkCount += 1
                        doubleCheck += 1
                    }
                    if omoshiroArray[m] == multipleLine {
                        check2 += 1
                    }
                }
                if doubleCheck == 2 {
                    checkCount -= 1
                }
            }
            if multipleLine != "" && check2 != 8 {
                checkCount = 0
            }
            if checkCount == 4 {
                kanpekiHorse.append((No: omoshiroHorses[k].0,
                                     name: omoshiroHorses[k].1))
            }
        }
        return kanpekiHorse
    }
    return []
}

何をしているかと言うと、 まず繁殖牝馬




の系統の被りが2以上じゃないことを確認しています。

ここの系統は1回だけなら被っても良いのですが、2回以上だとおもしろ配合になりません。
ただ、2回以上被っても見事な配合にはなります。 今回は、完璧な配合を作るので除外しました!

その後, おもしろ配合のオス馬と比較し、 オス馬の父
オス馬の父
オス馬の母
オス馬の母
の系統が

繁殖牝馬




と全て合っていたら、完璧な配合としています。

今回は繁殖牝馬の系統がオス馬の系統と一致していたら、checkCountという変数の値を+1して、
checkCountが合計4になったら、完璧な配合とみなしています。

ただ、いろいろfor文を回すと条件があり。。 例えば、牝馬の方の系統でが被っているものがあったりすると、計算がおかしくなります。 また、オス馬の方で被っている系統があると、完璧な配合ではないのに、完璧な配合とされてしまう場合があるので、 その場合はcheckCountを-1にしています。

そのあとは、この関数を最大で3回、回すだけです 1回目の繁殖で完璧な配合ができなかった場合、 繁殖牝馬の 父
母 の部分を150頭ほどいる、オス馬の 父
母 に変えます。 そのあと、23頭ほどいる面白い配合のオス馬と比較して、完璧な配合かどうかを見極めます。

つまり何が言いたいかというと、めちゃめちゃ計算量半端ないっす。。

2頭までですめば、まあちょっと多いかなという感じですが、 3頭目までいくと、 繁殖牝馬
父 => 2頭目のオス馬の父 父母 => 2頭目のオス馬の母 母父 => 1頭目のオス馬の父 母
という風になるので、 150×150= 22,500通りくらいを計算しないといけません。。

なので、計算し終わるのが10秒くらいかかりました。。

でも計算が楽になったので、ダビスタ活動が進んでいます! ただ完璧な配合の馬を作っても、全然勝てませんw

意地になってダビスタしてたら投稿間隔が空いてしまいました。。。

最近ラズパイ買ったので、そちらの投稿を今後はしていきたいと思います。!

今年もよろしくお願いいたします!!