Unity3D——牧师与魔鬼AI版

这次作业是在上次牧师与魔鬼的基础上加了AI的版本,实现的场景图如下:
这里写图片描述
在点击Next之后,自动完成游戏的下一步。
AI实现的各个状态转化图如下:(偷懒了一下下,把师兄的搬过来了)
这里写图片描述
需要添加的代码其实不多主要是一下几个:

1、状态记录:
public enum BoatAction { P, D, PP, DD, PD};
//表示下一状态需要用船运走的人

//记录船的状态以及下一步的动作
public struct NextPassenger
{
    public bool isRight;
    public BoatAction boataction;
}
2、寻找下一个状态

由于有些状态有两个可行解,所以下面采用随机数来选择到底使用哪个解:

private int randomValue()
{
    float num = Random.Range(0f, 1f);
    if (num <= 0.5f)
        return 1;
    else
        return 2;
}

用下面这个函数来寻找下一步解:

public void GetNextPassager()
{
    int from_priest = 0;
    int from_devil = 0;
    int to_priest = 0;
    int to_devil = 0;

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

    int[] toCount = toCoast.getCharacterNum();
    to_priest += toCount[0];
    to_devil += toCount[1];
    if (from_priest == 3 && from_devil == 3 && next.isRight)
    {
        int turn = randomValue();
        if (turn == 1)
        {
            next.boataction = BoatAction.PD;
        }
        else
        {
            next.boataction = BoatAction.DD;
        }
    }
    else if (next.isRight == false && from_priest == 2 && from_devil == 2)
    {
        next.boataction = BoatAction.P;
    }
    else if (next.isRight == false && from_priest == 3 && from_devil == 2)
    {
        next.boataction = BoatAction.D;
    }
    else if (next.isRight == false && from_priest == 3 && from_devil == 1)
    {
        next.boataction = BoatAction.D;
    }
    else if (next.isRight == true && from_priest == 3 && from_devil == 2)
    {
        next.boataction = BoatAction.DD;
    }
    else if (next.isRight == false && from_priest == 3 && from_devil == 0)
    {
        next.boataction = BoatAction.D;
    }
    else if(next.isRight == true && from_priest == 3 && from_devil == 1)
    {
        next.boataction = BoatAction.PP;
    }
    else if (next.isRight == false && from_priest == 1 && from_devil == 1)
    {
        next.boataction = BoatAction.PD;
    }
    else if(next.isRight == true && from_priest == 2 && from_devil == 2)
    {
        next.boataction = BoatAction.PP;
    }
    else if(next.isRight == false && from_priest == 0 && from_devil == 0)
    {
        next.boataction = BoatAction.D;
    }
    else if(next.isRight == true && from_priest == 0 && from_devil == 3)
    {
        next.boataction = BoatAction.DD;
    }
    else if(next.isRight == false && from_priest == 0 && from_devil == 1)
    {
        int turn = randomValue();
        if(turn == 1)
        {
            next.boataction = BoatAction.D;
        }
        else
        {
            next.boataction = BoatAction.P;
        }
    }
    else if(next.isRight == false && from_priest == 0 && from_devil == 2)
    {
        next.boataction = BoatAction.D;
    }
    else if(next.isRight == true && from_priest == 2 && from_devil == 1)
    {
        next.boataction = BoatAction.P;
    }
    else if(next.isRight == true && from_priest == 0 && from_devil == 2)
    {
        next.boataction = BoatAction.DD;
    }
    else if(next.isRight == true && from_priest == 1 && from_devil == 1)
    {
        next.boataction = BoatAction.PD;
    }
}
3、完成动作的函数:
public void NextMove()
{
    Debug.Log(next.boataction);
    Debug.Log(gameStatus);
    if (gameStatus == 0)
    {
        GetNextPassager();
        if (next.isRight == true && next.boataction == BoatAction.PP)
        {
            MyCharacterController priest1 = fromCoast.FindCharacterOnTheCoast(0);
            characterIsClicked(priest1);
            MyCharacterController priest2 = fromCoast.FindCharacterOnTheCoast(0);
            characterIsClicked(priest2);
        }
        else if (next.isRight == true && next.boataction == BoatAction.P)
        {
            MyCharacterController priest1 = fromCoast.FindCharacterOnTheCoast(0);
            characterIsClicked(priest1);
        }
        else if (next.isRight == true && next.boataction == BoatAction.PD)
        {
            MyCharacterController priest1 = fromCoast.FindCharacterOnTheCoast(0);
            characterIsClicked(priest1);
            MyCharacterController devil1 = fromCoast.FindCharacterOnTheCoast(1);
            characterIsClicked(devil1);
        }
        else if (next.isRight == true && next.boataction == BoatAction.D)
        {
            MyCharacterController devil1 = fromCoast.FindCharacterOnTheCoast(1);
            characterIsClicked(devil1);
        }
        else if (next.isRight == true && next.boataction == BoatAction.DD)
        {
            MyCharacterController devil1 = fromCoast.FindCharacterOnTheCoast(1);
            characterIsClicked(devil1);
            MyCharacterController devil2 = fromCoast.FindCharacterOnTheCoast(1);
            characterIsClicked(devil2);
        }
        else if (next.isRight == false && next.boataction == BoatAction.PP)
        {
            MyCharacterController priest1 = toCoast.FindCharacterOnTheCoast(0);
            characterIsClicked(priest1);
            MyCharacterController priest2 = toCoast.FindCharacterOnTheCoast(0);
            characterIsClicked(priest2);
        }
        else if (next.isRight == false && next.boataction == BoatAction.P)
        {
            MyCharacterController priest1 = toCoast.FindCharacterOnTheCoast(0);
            characterIsClicked(priest1);
        }
        else if (next.isRight == false && next.boataction == BoatAction.PD)
        {
            MyCharacterController priest1 = toCoast.FindCharacterOnTheCoast(0);
            characterIsClicked(priest1);
            MyCharacterController devil1 = toCoast.FindCharacterOnTheCoast(1);
            characterIsClicked(devil1);
        }
        else if (next.isRight == false && next.boataction == BoatAction.D)
        {
            MyCharacterController devil1 = toCoast.FindCharacterOnTheCoast(1);
            characterIsClicked(devil1);
        }
        else if (next.isRight == false && next.boataction == BoatAction.DD)
        {
            MyCharacterController devil1 = toCoast.FindCharacterOnTheCoast(1);
            characterIsClicked(devil1);
            MyCharacterController devil2 = toCoast.FindCharacterOnTheCoast(1);
            characterIsClicked(devil2);
        }
        next.isRight = !next.isRight;
        gameStatus = 1;
    }
    else if(gameStatus == 1)
    {
        moveBoat();
        gameStatus = 2;
    }
    else if(gameStatus == 2)
    {
        MyCharacterController[] pass = boat.GetPassengerOnTheBoat();
        for(int i = 0; i < pass.Length; i++)
        {
            if(pass[i] != null)
                characterIsClicked(pass[i]);
        }
        gameStatus = 0;
    }
}
4、给next的button添加函数:
void OnGUI() {
    if (status == 1)
    {
    //输了,游戏重来
        GUI.Label(new Rect(Screen.width / 2 - 50, Screen.height / 2 - 85, 100, 50), "Gameover!", style);
        if (GUI.Button(new Rect(Screen.width / 2 - 70, Screen.height / 2, 140, 70), "Restart", buttonStyle))
        {
            status = 0;
            action.restart();
        }
    }
    else if (status == 2)
    {
    //赢了,游戏重来
        GUI.Label(new Rect(Screen.width / 2 - 50, Screen.height / 2 - 85, 100, 50), "You win!", style);
        if (GUI.Button(new Rect(Screen.width / 2 - 70, Screen.height / 2, 140, 70), "Restart", buttonStyle))
        {
            status = 0;
            action.restart();
        }
    }
    else if (status == 0)
    {
    //游戏正在继续,点击了next按钮
        if (GUI.Button(new Rect(Screen.width / 2 - 50, Screen.height / 2 - 200, 100, 50), "Next", buttonStyle))
        {
            action.NextMove();
        }
    }
}

以上就是需要添加的代码,下面是github传送门
这是视频传送门

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值