角の動きは5x5の盤面の場合4の倍数と6の倍数が基本的には動ける場所になります。しかし、角が真ん中にいるときは良いのですが、すこしずれるだけで、折り返しポイントが発生し、不要な4の倍数と6の倍数のラインができてしまいます。これについて規則性を発見すべくダイアグラム化したのが下記になります。
●が現在地で、〇が動けるマスxが動けないマスなのに4の倍数*が6の倍数です。□は後に説明する折り返しポイント(特異点)になります。
これを見ながら場合分けをしていかないといけなかったのですが、まず4の倍数の折り返しポイントを発見して、それの倍数列を消してしまえという荒っぽいやり方でアプローチすることにしました。
折り返しポイント(□マークがついているマス)に特異点という名前を付けて、for文で特異点を探しています。幸いにも特異点は横の列に2つ4の倍数が並ぶときにしか起こらないのでそれを数式化して求めています。
ダイアグラムの分析によると特異点が盤面の下のほうにできる場合と、上のほうにできる場合の2通りがあったので、それは場合分けを行いました。
それから、12の倍数と24の倍数は必ず動けるマスになるので、それは除外してあります。
}else if(Naru == false && Shu == 3)//角の場合 { if (masuHandler.masuNum == 26 || masuHandler.masuNum == 0) { int i; for (i = 16; i < 26; i++) { Masu[i].GetComponent<BoxCollider2D>().enabled = false; Masu[i].GetComponent<MeshRenderer>().enabled = false; } } else { int i; for (i = 1; i < 26; i++) { int k; int tokuiten1; int tokuiten2; if (masuHandler.masuNum % 6 == i % 6 || masuHandler.masuNum % 4 == i % 4) { Masu[i].GetComponent<BoxCollider2D>().enabled = false; Masu[i].GetComponent<MeshRenderer>().enabled = false; if (masuHandler.masuNum < 10 || masuHandler.masuNum == 11 || masuHandler.masuNum == 12 || masuHandler.masuNum == 16) { for (k = 0; k < 6; k++) { if (((masuHandler.masuNum + 4 * k) - 1) / 5 == ((masuHandler.masuNum + 4 * (k + 1) - 1) / 5)) { break; } } tokuiten2 = masuHandler.masuNum + (4 * (k + 1)); Debug.Log(tokuiten2 + "tokuiten2"); int j; for (j = 0; j < 6; j++) { if (tokuiten2 + 4 * j > 0 && tokuiten2 + 4 * j < 26) { if(tokuiten2 + 4 * j == masuHandler.masuNum + 12 || tokuiten2 + 4 * j == masuHandler.masuNum + 24) { }else { Masu[tokuiten2 + 4 * j].GetComponent<BoxCollider2D>().enabled = true; Masu[tokuiten2 + 4 * j].GetComponent<MeshRenderer>().enabled = true; } } } } else { for (k = 0; k < 6; k++) { if (((masuHandler.masuNum - 4 * k) - 1) / 5 == ((masuHandler.masuNum - 4 * (k + 1) - 1) / 5)) { break; } } tokuiten1 = masuHandler.masuNum - (4 * (k + 1)); Debug.Log(tokuiten1 + "tokuiten1"); int j; for (j = 0; j < masuHandler.masuNum / 4; j++) { if (tokuiten1 - 4 * j > 0 && tokuiten1 - 4 * j < 26) { if(tokuiten1 - 4 * j == masuHandler.masuNum - 12 || tokuiten1 - 4 * j == masuHandler.masuNum - 24) { } else { Masu[tokuiten1 - 4 * j].GetComponent<BoxCollider2D>().enabled = true; Masu[tokuiten1 - 4 * j].GetComponent<MeshRenderer>().enabled = true; } } } }
ここまででなんとか10通りを除いて正しい結果が得られるようになりました。残り10通りは6の倍数の特異点が発生する場合なのですが、たった10通りしかないので、これは素直にケースバイケースで潰すことにしました。
if(masuHandler.masuNum == 3) { Masu[21].GetComponent<BoxCollider2D>().enabled = true; Masu[21].GetComponent<MeshRenderer>().enabled = true; } if (masuHandler.masuNum == 4) { Masu[22].GetComponent<BoxCollider2D>().enabled = true; Masu[22].GetComponent<MeshRenderer>().enabled = true; } if (masuHandler.masuNum == 5) { Masu[1].GetComponent<BoxCollider2D>().enabled = true; Masu[1].GetComponent<MeshRenderer>().enabled = true; Masu[11].GetComponent<BoxCollider2D>().enabled = true; Masu[11].GetComponent<MeshRenderer>().enabled = true; Masu[23].GetComponent<BoxCollider2D>().enabled = true; Masu[23].GetComponent<MeshRenderer>().enabled = true; } if (masuHandler.masuNum == 9) { Masu[1].GetComponent<BoxCollider2D>().enabled = true; Masu[1].GetComponent<MeshRenderer>().enabled = true; } if (masuHandler.masuNum == 10) { Masu[16].GetComponent<BoxCollider2D>().enabled = true; Masu[16].GetComponent<MeshRenderer>().enabled = true; } if (masuHandler.masuNum == 11) { Masu[5].GetComponent<BoxCollider2D>().enabled = true; Masu[5].GetComponent<MeshRenderer>().enabled = true; } if (masuHandler.masuNum == 15) { Masu[21].GetComponent<BoxCollider2D>().enabled = true; Masu[21].GetComponent<MeshRenderer>().enabled = true; } if (masuHandler.masuNum == 16) { Masu[10].GetComponent<BoxCollider2D>().enabled = true; Masu[10].GetComponent<MeshRenderer>().enabled = true; } if (masuHandler.masuNum == 17) { Masu[25].GetComponent<BoxCollider2D>().enabled = true; Masu[25].GetComponent<MeshRenderer>().enabled = true; } if (masuHandler.masuNum == 21) { Masu[3].GetComponent<BoxCollider2D>().enabled = true; Masu[3].GetComponent<MeshRenderer>().enabled = true; Masu[15].GetComponent<BoxCollider2D>().enabled = true; Masu[15].GetComponent<MeshRenderer>().enabled = true; Masu[25].GetComponent<BoxCollider2D>().enabled = true; Masu[25].GetComponent<MeshRenderer>().enabled = true; } if (masuHandler.masuNum == 22) { Masu[4].GetComponent<BoxCollider2D>().enabled = true; Masu[4].GetComponent<MeshRenderer>().enabled = true; } if (masuHandler.masuNum == 23) { Masu[5].GetComponent<BoxCollider2D>().enabled = true; Masu[5].GetComponent<MeshRenderer>().enabled = true; }
これで角を攻略することができました。これを解くのにまるまる24時間ぐらいかかりました。疲れましたね、まったく。。。