三目並べ(まるばつゲーム)を作成。Part2.交互にマークと勝利判定|Unityゲーム制作

Unity2Dで「三目並べ(まるばつゲーム)」を作成。Part2では交互にマークするのと勝利判定を実装していきます。

はじめに

part1は下記から。

今回やる事

Part1ではUIとクリックしたときにマークを付けるのを作成しました。Part2では「交互にマークをセット」、「勝利判定」を実装していきます。

実装開始

はじめに、Buttonを複製して各マス目にボタンを配置します。

ボタン位置はPosで調整しておきます。

現状だと同じ場所(同じボタン)が何度も選択できてしまうので、一度選択したらボタンを押せなくします。下記を「OnButtonClick」内に追加します。

btn.interactable = false;

実行すると、下記のように「×」→「〇」→「×」と順番にマークできるようになります。

勝利判定

次に勝利判定のスクリプトを考えていきます。先ほどの画像の番号で、3つ同じマークが並んだ時に勝利とします。下記が「勝利判定関数のイメージ」です。

    private bool IsWinner()
    {
            // 横で一致
        if (IsMatched(0, 1, 2)
            || IsMatched(3, 4, 5)
            || IsMatched(6, 7, 8)
            // 縦で一致
            || IsMatched(0, 3, 6)
            || IsMatched(1, 4, 7)
            || IsMatched(2, 5, 8)
            // 斜めで一致
            || IsMatched(0, 4, 8)
            || IsMatched(6, 4, 2))
        {
            //一致
            return true;
        }
        //不一致
        return false;
    }

    private bool IsMatched(int i, int j, int k)
    {
        // i,j,kが同じマークならtrue
        return matched;
    }

各ボタンの画像(マーク)を取得する必要があるため、最終的なスクリプトは下記のように変更します。

using UnityEngine;
using UnityEngine.UI;

public class GameManager : MonoBehaviour
{
    [SerializeField] private Sprite spriteX;
    [SerializeField] private Sprite spriteO;
    [SerializeField] private Color colorX;
    [SerializeField] private Color colorO;

    [SerializeField] private Button[] buttons;

    private bool isPlayer;

    private void Awake()
    {
        isPlayer = true;
    }

    public void OnButtonClick(Button btn)
    {
        Image img = btn.GetComponent<Image>();
        img.sprite = isPlayer ? spriteX : spriteO;
        img.color = isPlayer ? colorX : colorO;

        btn.interactable = false;

        if (IsWinner(img.sprite))
            Debug.Log(isPlayer ? "X Win" : "O Win");

        isPlayer = !isPlayer;
    }

    private bool IsWinner(Sprite sprite)
    {

        if (IsMatched(0, 1, 2, sprite)
            || IsMatched(3, 4, 5, sprite)
            || IsMatched(6, 7, 8, sprite)
            || IsMatched(0, 3, 6, sprite)
            || IsMatched(1, 4, 7, sprite)
            || IsMatched(2, 5, 8, sprite)
            || IsMatched(0, 4, 8, sprite)
            || IsMatched(6, 4, 2, sprite))
        {
            return true;
        }
        return false;
    }

    private bool IsMatched(int i, int j, int k, Sprite sprite)
    {
        Image img1 = buttons[i].GetComponent<Image>();
        Image img2 = buttons[j].GetComponent<Image>();
        Image img3 = buttons[k].GetComponent<Image>();

        bool matched = (img1.sprite == sprite
                    && img2.sprite == sprite
                    && img3.sprite == sprite);

        return matched;
    }
}

Buttonsパラメータにすべてのボタンをセットすると勝利判定が出来るようになります。

現状だと「Debug.log」で出力しているだけなので、勝利後もマークを付けることが出来ます。第2回目はここまで。

タイトルとURLをコピーしました