一、游戏介绍
牧师和魔鬼是一款益智游戏,您将在其中帮助牧师和魔鬼过河。河的一侧有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)