牧师与魔鬼

一、游戏介绍

         牧师和魔鬼是一款益智游戏,您将在其中帮助牧师和魔鬼过河。河的一侧有3个祭司和3个魔鬼。他们都想去这条河的另一边,但只有一条船,这条船每次只能载两个人。而且必须有一个人将船从一侧驾驶到另一侧。您可以单击按钮来移动它们,然后单击移动按钮将船移动到另一个方向。如果靠岸的船上和同一侧岸上的牧师被岸上的魔鬼人数所淹没,他们就会被杀死,游戏就结束了。您可以通过多种方式尝试它。让所有的祭司活着!最后所有牧师和魔鬼都成功过河,则表示游戏胜利。 

        本次将使用unity引擎制作,使用mvc框架

玩家动作表如下:

玩家动作(事件)条件结果
点击牧师游戏未结束,牧师处于静止,牧师在岸上并与船在同一侧牧师上船
 
点击牧师游戏未结束,牧师处于静止,牧师在船上牧师上同一侧的岸
点击魔鬼游戏未结束,魔鬼处于静止,魔鬼在岸上并与船在同一侧 魔鬼上船
点击魔鬼 游戏未结束,魔鬼处于静止,魔鬼在船上魔鬼上同一侧的岸
点击Restart游戏已结束重新开始游戏

二、架构介绍

MVC架构:

模型(Model):游戏中的所有对象,包括船、牧师、魔鬼、河岸。每个对象都写在一个对应的类里面,由该类控制对象的各种行为。
控制器(Controller):控制场景,使用单例模式创建导演类,导演只有一个,管理本次场景所有的游戏对象并控制着场景的切换,角色的移动,游戏结果的判断,对外界输入事件的响应。
界面(View):
接受用户输入,展示游戏结果。

本次实现游戏的框架如下:

游戏文件架构,分为四个文件

三、代码简介:

  • SSDirector 类
    public class SSDirector : System.Object
        {
            private static SSDirector _instance;
            public ISceneController CurrentScenceController { get; set; }
            public static SSDirector GetInstance()
            {
                if (_instance == null)
                {
                    _instance = new SSDirector();
                }
                return _instance;
            }
        }
    

    导演类是单实例的,其继承至 C# 根对象,导演类一直存在,不会受 Unity 引擎管理。可以控制场景运行、切换并管理游戏全局状态。

  • ISceneController接口
    public interface ISceneController
        {
            void LoadResources();
        }

  • IUserAction接口
      public interface IUserAction
        {
            void MoveRole(Role role);
            void MoveBoat();
            void Restart();
            int check();
        }
    

    该接口定义了一组用户操作,通过实现该接口,用户可以通过这些操作去对游戏对象发出相应的指令,使其响应。

  • Move类                                                                                                                                        移动组件,可以挂载到游戏对象种实现游戏对象的移动

  • Click类                                                                                                                                         可以挂载到游戏对象中,用来检测游戏对象是否被点击

  • 游戏对象类 对游戏对象进行封装,包含对象需要的状态和move和click两个组件

  • Controll类

        public Role[] roles;
        public Boat boat;
        public Bank left_bank;
        public Bank right_bank;
        UserGUI User;
    
        void Start()
        {
            SSDirector director = SSDirector.GetInstance();//得到导演实例
            director.CurrentScenceController = this;
            User = gameObject.AddComponent<UserGUI>() as UserGUI;
            LoadResources();  //加载场景
        }
        public void LoadResources(){
        	//实现资源的加载
        }
        public void MoveBoat(){
    		//控制船的移动
    	}
        public void MoveRole(Role role){
    		//控制角色的移动
    	}
        public int check(){
    		//检查游戏结果
    	}
        public void Restart(){
    		//重新开始游戏
    	}
    

  • UserGUI
    包含规则的介绍,游戏的重新开始
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using Model;
    public class UserGUI : MonoBehaviour
    {
        private IUserAction action;
        public int check = 0;
        void Start()
        {
            action = SSDirector.GetInstance().CurrentScenceController as IUserAction;
        }
    
        void OnGUI()
        {
            GUIStyle fontStyle = new GUIStyle();
            fontStyle.fontSize = 30;
            GUI.Label(new Rect(Screen.width / 2 - 300, 10, 420, 30), "红色代表恶魔,白色代表牧师。");
            GUI.Label(new Rect(Screen.width / 2 - 300, 40, 420, 30), "游戏目标:将所有牧师和恶魔移到河对岸。");
            GUI.Label(new Rect(Screen.width / 2 - 300, 70, 420, 30), "规则一:船一次最多载两个人,至少要有一个人才能开船。");
            GUI.Label(new Rect(Screen.width / 2 - 300, 100, 420, 30), "规则二:两岸边若有牧师,则对应岸边恶魔的数量不能多于牧师的数量。");
            
            if(check == 1){    //success
                GUI.Label(new Rect(Screen.width / 2 - 50, 30, 60, 40), "You Win!", fontStyle);
                if (GUI.Button(new Rect(Screen.width / 2 - 40, Screen.height-100, 70, 40), "Restart")){
                    action.Restart();
                    check = 0;
                }
            }
            else if(check == 2){   //fail
                GUI.Label(new Rect(Screen.width / 2 - 50, 30, 60, 40), "Game Over!", fontStyle);
                if (GUI.Button(new Rect(Screen.width / 2 - 40, Screen.height-100, 70, 40), "Restart")){
                    action.Restart();
                    check = 0;
                }
            }
            
        }
    }
    
    

    类的大体结构已经完成,只需对各方法进行完善即可                                                                   大致代码介绍如上,具体还请看详细代码。

  • 游戏运行截图

  • GitHub代码地址:wujf37/3d-game: 3d game code (github.com)
  • 演示视频地址:牧师与魔鬼-其他-高清完整正版视频在线观看-优酷 (youku.com)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值