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

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

犬猫将棋の駒の動きをガイドするロジックを、一番ベーシックな金将から考えていきたいと思います。まずは、駒台から盤面に置く場合は、自分の陣地にしか置けないので、マスの番号が16~25の間にしか打てないようにします。


DirectionDeterminatorというオブジェクトを作り、DirectionDeterminator.csをアタッチします。そして、特定のboxcollider2dとMeshRendererをオフにするように記載します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DirectionDeterminator : MonoBehaviour
{
    MasuHandler masuHandler;
    MeshRenderer meshRenderer;

    public GameObject[] Masu;
    public int[] movableMasu;

    // Start is called before the first frame update
    void Start()
    {
        masuHandler = GameObject.Find("MasuHandler").GetComponent<MasuHandler>();
    }

    public void DirectionDetermine(bool Naru, int Shu)
    {
        if (Naru == false && Shu == 0)//金の場合
        {
            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;
                }
            }

マスを配列のGameObjectとして扱い、マスをインスペクター上にドラッグアンドドロップします。この時、マスの名前と番号が一致するように0番にダミーを入れています。このほうが後々わかりやすいと思いました。

さて、ここで金将の動きですが、金は自分のいるマス か
ら、 -4、-5、-6,-1、+1、+5の範囲に動くことができます。例外としては盤面の縁に来た場合がありますが、それ以外は一定です。

盤面の縁に来た場合は動けなくなる方向が制限されるので、それを場合分けでif文を使用して書き分けました。

if (Naru == false && Shu == 0)//金の場合
        {
            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 if (masuHandler.masuNum < 6)//上段の場合
            {
                if (masuHandler.masuNum % 5 == 2 || masuHandler.masuNum % 5 == 3 || masuHandler.masuNum % 5 == 4)//真ん中にいるとき
                {
                    Masu[masuHandler.masuNum + 1].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum + 1].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum - 1].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum - 1].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum + 5].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum + 5].GetComponent<MeshRenderer>().enabled = false;
                }
                else if (masuHandler.masuNum % 5 == 1) //左端にいるとき
                {
                    Masu[masuHandler.masuNum + 1].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum + 1].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum + 5].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum + 5].GetComponent<MeshRenderer>().enabled = false;
                }
                else if (masuHandler.masuNum % 5 == 0 && masuHandler.masuNum != 0) //右端にいるとき
                {
                    Masu[masuHandler.masuNum].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum - 1].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum - 1].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum + 5].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum + 5].GetComponent<MeshRenderer>().enabled = false;
                }
            }
            else if (masuHandler.masuNum > 20)//下段の場合
            {
                if (masuHandler.masuNum % 5 == 2 || masuHandler.masuNum % 5 == 3 || masuHandler.masuNum % 5 == 4)//真ん中にいるとき
                {
                    Masu[masuHandler.masuNum - 4].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum - 4].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum - 5].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum - 5].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum - 6].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum - 6].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum + 1].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum + 1].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum - 1].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum - 1].GetComponent<MeshRenderer>().enabled = false;
                }
                else if (masuHandler.masuNum % 5 == 1) //左端にいるとき
                {
                    Masu[masuHandler.masuNum - 4].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum - 4].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum - 5].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum - 5].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum + 1].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum + 1].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum].GetComponent<MeshRenderer>().enabled = false;

                }
                else if (masuHandler.masuNum % 5 == 0 && masuHandler.masuNum != 0) //右端にいるとき
                {
                    Masu[masuHandler.masuNum - 5].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum - 5].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum - 6].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum - 6].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum - 1].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum - 1].GetComponent<MeshRenderer>().enabled = false;

                }
            }
            else//中段の場合
            {
                if (masuHandler.masuNum % 5 == 2 || masuHandler.masuNum % 5 == 3 || masuHandler.masuNum % 5 == 4)//真ん中にいるとき
                {

                    Masu[masuHandler.masuNum - 4].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum - 4].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum - 5].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum - 5].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum - 6].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum - 6].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum + 1].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum + 1].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum - 1].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum - 1].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum + 5].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum + 5].GetComponent<MeshRenderer>().enabled = false;

                }
                else if (masuHandler.masuNum % 5 == 1)//左端にいるとき
                {
                    Masu[masuHandler.masuNum - 5].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum - 5].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum - 4].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum - 4].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum + 1].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum + 1].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum + 5].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum + 5].GetComponent<MeshRenderer>().enabled = false;

                }
                else if (masuHandler.masuNum % 5 == 0 && masuHandler.masuNum != 0)//右端にいるとき
                {
                    Masu[masuHandler.masuNum - 6].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum - 6].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum - 5].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum - 5].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum - 1].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum - 1].GetComponent<MeshRenderer>().enabled = false;
                    Masu[masuHandler.masuNum + 5].GetComponent<BoxCollider2D>().enabled = false;
                    Masu[masuHandler.masuNum + 5].GetComponent<MeshRenderer>().enabled = false;
                }
            }

        }

上段にいる場合の左端、右端の例外処理、中段にいる場合の、左端右端の例外処理、下段にいる場合の同様の処理。それぞれマニュアルで書き分けて、金の動きをガイドすることができました。もっと簡単に書けるのだと思いますが、私のスペックではこれくらいが限界です。

次回は飛車の動きを考えていきたいと思います。

おすすめの記事