3D游戏编程与设计 HW 3.5 牧师与恶魔

2024-01-24 21:40

本文主要是介绍3D游戏编程与设计 HW 3.5 牧师与恶魔,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 3D游戏编程与设计 HW 3.5 牧师与恶魔
    • 1.游戏介绍
    • 2.题目要求
    • 3.MVC结构
    • 4.游戏对象表,玩家动作表,事件表
    • 5.类设计
      • (一)Models
        • ① Boat
        • ② Coast
        • ③ Character
      • (二)Views
        • ① UserGUI
      • (三)Controllers
        • ① Director
        • ② ISceneController
        • ③ IUserAction
        • ④ Moveable
        • ⑤ GameController
        • ⑥ FirstController
    • 6.游戏结果展示
      • (一) 游戏界面
      • (二)游戏失败
      • (三)游戏胜利

3D游戏编程与设计 HW 3.5 牧师与恶魔


完整游戏过程可见以下视频:
https://www.bilibili.com/video/BV1Vk4y117J2/

完整代码可见以下仓库:
https://gitee.com/beilineili/game3-d

1.游戏介绍

  • 牧师和恶魔是一款益智游戏
  • 你将帮助神父和恶魔在限定的时间内过河。河的一边有三个牧师和三个魔鬼。他们都想到河的另一边去,但是只有一条船,每次只能载两个人。必须有一个人把船从一边转向另一边。如果牧师们被河两岸的恶魔们打败(在岸上的牧师数量少于恶魔),他们就会被杀死,游戏也就结束了。
  • 在游戏中,你可以点击它们来移动它们,点击go按钮来移动船到另一个方向。你可以用很多的方法来尝试。让所有的牧师活下去! 祝你好运!

2.题目要求

在这里插入图片描述

3.MVC结构

  • MVC是模型(model)-视图(view)-控制器(controller)的缩写,它是一种软件设计模式,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
  • MVC基本结构图:

在这里插入图片描述

  • 在牧师与恶魔游戏设计中,可以分为
    ① SSDirector:整个结构的管理者,控制各个场景的切换协调;
    ② ISceneController(抽象):每个场景的管理者,是Director用来向场景控制器传递要求的接口
    ③ IUserAction(抽象):负责管理行为之间的交互,对于玩家的每个动作产生相应的响应结果
  • 通过这样基于职责的设计,实现了赋予不同对象特定的职责,使游戏程序的结构更加清晰、可复用性更高。

4.游戏对象表,玩家动作表,事件表

游戏对象对象类型
Priest 牧师Cube
Devil 魔鬼Sphere
Boat 船Cube
River 河流Cube
Coast 河岸Cube
动作触发事件
点击 Character 人物人物上船,下船
点击 Boat 船只船只过河
事件结果
其中一边恶魔数量大于牧师(包括船上和岸上的)玩家失败
所有牧师和恶魔都到了另一岸玩家成功

5.类设计

基于职责设计,使用面向对象技术设计游戏。
项目的程序代码采用MVC结构,根据功能将代码文件分别放入Controllers, Models, Views文件夹中。

(一)Models

① Boat
  • 有 location(船位置坐标)属性,有起点和终点,此外还需要维护船上的空位坐标以及角色信息
② Coast
  • 同 Boat,需要维护岸上的空位坐标和角色信息
③ Character
  • 有 name,location 和 isOnBoard 属性;其中 name 用于区分角色是牧师还是恶魔,IsOnBoat 用于区分是否在船上

(二)Views

① UserGUI
  • Start 函数,通过获得 Director 的单例,初始化获得当前场记 CurrentSecnController
        // 得到 GameControllervoid Start () {status = 0;action = Director.GetInstance().CurrentSecnController as IUserAction;}
  • OnGUI 函数,渲染游戏界面;
	    void OnGUI () {textStyle = new GUIStyle {fontSize = 40,alignment = TextAnchor.MiddleCenter};hintStyle = new GUIStyle {fontSize = 15,fontStyle = FontStyle.Normal};btnStyle = new GUIStyle("button") {fontSize = 30};// 打印标题和规则提示信息GUI.Label(new Rect(Screen.width / 2 - 50, Screen.height / 2 - 195, 100, 50), "Priest And Devil", textStyle);GUI.Label(new Rect(Screen.width / 2 - 400, Screen.height / 2 - 125, 100, 50), "White Cube: Periest\n Red Sphere: Devil\n\n" + rule, hintStyle);// 打印游戏结果和重开游戏的按钮if (status == 1) {// LoseGUI.Label(new Rect(Screen.width / 2 - 50, Screen.height / 2 - 85, 100, 50), "You Lose!", textStyle);if (GUI.Button(new Rect(Screen.width / 2 - 70, Screen.height / 2, 140, 70), "Restart", btnStyle)) {status = 0;action.Restart();}} else if (status == 2) {// WinGUI.Label(new Rect(Screen.width / 2 - 50, Screen.height / 2 - 85, 100, 50), "You Win!", textStyle);if (GUI.Button(new Rect(Screen.width / 2 - 70, Screen.height / 2, 140, 70), "Restart", btnStyle)) {status = 0;action.Restart();}}}
  • OnMouseDown 函数,监听捕捉用户的点击动作,转至 Controller 处理
        void OnMouseDown() {if (gameObject.name == "boat") {action.MoveBoat();} else {action.CharacterClicked(characterCtrl);}}

(三)Controllers

① Director
  • 获取当前游戏的场景
  • 管理游戏全局状态
    public class Director : System.Object{// Singlton instance.private static Director instance;public ISceneController CurrentSecnController { get; set; }// get instance anytime anywhere!public static Director GetInstance(){if (instance == null){instance = new Director();}return instance;}public int getFPS(){return Application.targetFrameRate;}public void setFPS(int fps){Application.targetFrameRate = fps;}}
② ISceneController
  • 场记 GameController 与导演 Director 交互的接口
public interface ISceneController{void LoadResources();}
③ IUserAction
  • 玩家与 GameController 互动的用户交互接口
    public interface IUserAction {void MoveBoat();void CharacterClicked(CharacterController characterCtrl);void Restart();}
④ Moveable
  • SetDestination 用于控制对应游戏对象的运动
        public void SetDestination(Vector3 pos) {destination = pos;middle = pos;if (pos.y == transform.position.y) {          // 移动船status = 2;} else if (pos.y < transform.position.y) {    // 将角色从岸上移到船上middle.y = transform.position.y;} else {                                      // 将角色从船上移到岸上middle.x = transform.position.x;}status = 1;}
⑤ GameController
  • CoastController
    GetEmptyIndex:岸上空位的下标
    GetEmptyPosition:岸上空位的坐标
    GetOnCoast:上岸
    GetOffCoast:离岸
    GetCharacterNum:计算岸上角色的数量
  • BoatController
    Move:移动船
    GetEmptyIndex:船上空位的下标
    IsEmpty:船是否有空位
    GetEmptyPosition:船上空位的坐标
    GetOnBoat:当玩家点击牧师或魔鬼,使之上船时,被调用。
    GetOffBoat:当玩家点击牧师或魔鬼,使之上岸时,被调用。
    GetCharacterNum:计算船上角色的数量
  • CharacterController
    配合 CoastController 和 BoatController
⑥ FirstController
  • 在场景被加载唤醒(awake)时,它会自动注入导演,设置当前场景
    void Awake() {Director director = Director.GetInstance();director.CurrentSecnController = this;userGUI = gameObject.AddComponent<UserGUI>() as UserGUI;characters = new MyNamespace.CharacterController[6];LoadResources();}
  • CheckGameOver 判断游戏胜负
    private int CheckGameOver() {int rightPriest = 0;int rightDevil = 0;int leftPriest = 0;int leftDevil = 0;int status = 0;rightPriest += rightCoastCtrl.GetCharacterNum()[0];rightDevil += rightCoastCtrl.GetCharacterNum()[1];leftPriest += leftCoastCtrl.GetCharacterNum()[0];leftDevil += leftCoastCtrl.GetCharacterNum()[1];// Winif (leftPriest + leftDevil == 6) {status = 2; }if (boatCtrl.boat.Location == Location.right) {rightPriest += boatCtrl.GetCharacterNum()[0];rightDevil += boatCtrl.GetCharacterNum()[1];} else {leftPriest += boatCtrl.GetCharacterNum()[0];leftDevil += boatCtrl.GetCharacterNum()[1];}// Loseif ((rightPriest < rightDevil && rightPriest > 0) ||(leftPriest < leftDevil && leftPriest > 0)) {status = 1;}return status;}

6.游戏结果展示

完整游戏过程可见以下视频:
https://www.bilibili.com/video/BV1Vk4y117J2/

(一) 游戏界面

在这里插入图片描述

(二)游戏失败

在这里插入图片描述

(三)游戏胜利

在这里插入图片描述

这篇关于3D游戏编程与设计 HW 3.5 牧师与恶魔的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/641088

相关文章

C#反射编程之GetConstructor()方法解读

《C#反射编程之GetConstructor()方法解读》C#中Type类的GetConstructor()方法用于获取指定类型的构造函数,该方法有多个重载版本,可以根据不同的参数获取不同特性的构造函... 目录C# GetConstructor()方法有4个重载以GetConstructor(Type[]

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

4B参数秒杀GPT-3.5:MiniCPM 3.0惊艳登场!

​ 面壁智能 在 AI 的世界里,总有那么几个时刻让人惊叹不已。面壁智能推出的 MiniCPM 3.0,这个仅有4B参数的"小钢炮",正在以惊人的实力挑战着 GPT-3.5 这个曾经的AI巨人。 MiniCPM 3.0 MiniCPM 3.0 MiniCPM 3.0 目前的主要功能有: 长上下文功能:原生支持 32k 上下文长度,性能完美。我们引入了

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry

国产游戏崛起:技术革新与文化自信的双重推动

近年来,国产游戏行业发展迅猛,技术水平和作品质量均得到了显著提升。特别是以《黑神话:悟空》为代表的一系列优秀作品,成功打破了过去中国游戏市场以手游和网游为主的局限,向全球玩家展示了中国在单机游戏领域的实力与潜力。随着中国开发者在画面渲染、物理引擎、AI 技术和服务器架构等方面取得了显著进展,国产游戏正逐步赢得国际市场的认可。然而,面对全球游戏行业的激烈竞争,国产游戏技术依然面临诸多挑战,未来的

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机