UnityとPhotonで対戦型ボードゲーム「犬猫将棋」を作成したい(7):角の動きを考える

犬猫将棋ソースコード、素材、遊べるリンクはこちら

角の動きは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時間ぐらいかかりました。疲れましたね、まったく。。。

おすすめの記事