Unity3d HW4-動作分離版牧師與魔鬼


一、基本操作演練

下載 Fantasy Skybox FREE, 構建自己的遊戲場景

首先上Assert Store下載Skybox,我下載的是這一個:

Skybox
之後我在unity中,把下載好的天空盒拖入攝像機中:
天空盒
插入天空盒
最後成品如下:
成品圖


二、編程實踐

牧師與魔鬼 動作分離版
【2019新要求】:設計一個裁判類,當遊戲達到結束條件時,通知場景控制器遊戲結束
根據老師給出的類圖:
類圖

我們新建的SSActionManager類需要將動作與遊戲場景分離出來,其中包含的方法是characterIsClicked方法,這樣能夠將FirstController的功能減少:

//動作管理基類 – SSActionManager
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class SSActionManager : MonoBehaviour
{
    public Judge jd;
    public void icharacterIsClicked(CharacterModel characterCtrl,BoatModel boat,CoastModel to_Coast,CoastModel from_Coast, UserGUI userGUI)
    {
        if (characterCtrl.isOnBoat())
        {
            CoastModel whichCoast;
            // -1to、1from
            if (boat.get_to_from() == -1)
            {
                whichCoast = to_Coast;
            }
            else
            {
                whichCoast = from_Coast;
            }

            boat.GetOffBoat(characterCtrl.getName());
            characterCtrl.moveToPosition(whichCoast.getEmptyPosition());
            characterCtrl.getOnCoast(whichCoast);
            whichCoast.getOnCoast(characterCtrl);

        }
        else//Character在岸上
        {
            CoastModel whichCoast = characterCtrl.getCoastController();

            //船是滿的
            if (boat.getEmptyNum() == -1)
            {
                return;
            }

            //船和目標岸位置不同
            if (whichCoast.get_to_or_from() != boat.get_to_from())
                return;

            whichCoast.getOffCoast(characterCtrl.getName());
            characterCtrl.moveToPosition(boat.getEmptyPosition());
            characterCtrl.getOnBoat(boat);
            boat.GetOnBoat(characterCtrl);
        }
        userGUI.status = jd.icheck_game_status(boat,to_Coast, from_Coast);
    }

}

另外新增的裁判類Judge判斷遊戲的狀態:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class Judge : MonoBehaviour
{
    public int icheck_game_status(BoatModel boat, CoastModel to_Coast, CoastModel from_Coast)
    {
        int from_priest = 0;
        int from_devil = 0;
        int to_priest = 0;
        int to_devil = 0;

        int[] fromCount = from_Coast.getCharacterNum();
        from_priest += fromCount[0];
        from_devil += fromCount[1];

        int[] toCount = to_Coast.getCharacterNum();
        to_priest += toCount[0];
        to_devil += toCount[1];

        //勝利
        if (to_priest + to_devil == 6)
            return 2;

        int[] boatCount = boat.getCharacterNum();

        //遊戲繼續
        //船在對岸
        if (boat.get_to_from() == -1)
        {
            to_priest += boatCount[0];
            to_devil += boatCount[1];
        }
        //船在初始岸
        else
        {
            from_priest += boatCount[0];
            from_devil += boatCount[1];
        }

        //失敗
        if (from_priest < from_devil && from_priest > 0)
        {
            return 1;
        }
        if (to_priest < to_devil && to_priest > 0)
        {
            return 1;
        }

        return 0;
    }

}

運行結果爲:傳送門
代碼倉庫:傳送門

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章