3D游戏编程设计作业九

2023-11-02

P&D 过河游戏智能帮助实现,程序具体要求:

  • 实现状态图的自动生成

  • 讲解图数据在程序中的表示方法

  • 利用算法实现下一步的计算

状态图分析

此次作业的代码基于第三次作业--牧师与魔鬼的动作分离版代码进行改进,加入了智能提示功能,实现效果图如下

要实现智能提示实际上就是通过对游戏中的每个可能状态进行分析,寻找当前状态下的下一个可能状态并给出提示即可,对于3个牧师和魔鬼的P&D游戏,可以仅对左岸的牧师和魔鬼数量和船的位置进行状态记录,即可表示当前的游戏状态,对游戏中的所有可能状态进行分析绘制状态图如下(此图引用自博客https://blog.csdn.net/kiloveyousmile/article/details/71727667

 

图状态的代码表示

由状态图所示,每一个状态可以通过左侧河岸的牧师和魔鬼数量和船停靠的位置进行记录,注意当船停靠在左岸时,需要统计的牧师和魔鬼的数量包括船上牧师和魔鬼的数量

public class PDState {
	//左侧河岸的牧师和魔鬼数量
	public int start_priest;
    public int start_devil;
    public int boat_pos;//0表示开始岸,1表示结束岸
    public PDState() { }
    public PDState(int start_priest, int start_devil, int boat_priest, int boat_devil, int boat_pos){
        if(boat_pos == 1){
			this.start_priest = start_priest;
			this.start_devil = start_devil;
		}
		//需要统计船上的数量
		else{
			this.start_priest = start_priest + boat_priest;
			this.start_devil = start_devil + boat_devil;
		}
        this.boat_pos = boat_pos;
    }

下一状态的获取

作业要求中的状态图自动生成和下一个节点的查找实际上应该是需要将每个状态表示为图节点的形式,通过邻接矩阵或者邻接表建立一个状态图的数据结构,然后再通过BFS对下一个状态进行搜索,但实际上本次实现的提示操作可以仅通过枚举法对下一个状态进行确定,实现会比采用邻接矩阵在采用BFS的方法简便很多,本着从简原则我此处采用了枚举法进行下一个状态的获取

船上的状态有五种情形,分别是分别只搭载一个牧师和一个魔鬼,两个牧师、两个魔鬼和一个牧师一个魔鬼,代码中表示如下

public enum BoatAction { P, D, PP, DD, PD, empty }

 接下来就是根据状态图,对当前的状态进行分析,并且获取下一个状态船上的状态,根据提示改变船上的状态并移动船即可获取到下一个新状态,对于状态图中下一状态存在多种情况的状态,采取随机数随机选择即可,代码实现如下

public BoatAction getNextBoatAction(){
		BoatAction next = BoatAction.empty;
		//船在左边的情况
		if(boat_pos == 0){
			if(start_priest == 3 && start_devil == 3){
				if(Random.Range(0f,1f) <= 0.5f){
					next = BoatAction.PD;
				}
				else{
					next = BoatAction.DD;
				}
			}
			if(start_priest == 3 && start_devil == 2){
				next = BoatAction.DD;
			}
			if(start_priest == 3 && start_devil == 1){
				next = BoatAction.PP;
			}
			if(start_priest == 2 && start_devil == 2){
				next = BoatAction.PP;
			}
			if(start_priest == 0 && start_devil == 3){
				next = BoatAction.DD;
			}
			if(start_priest == 2 && start_devil == 1){
				next = BoatAction.P;
			}
			if(start_priest == 0 && start_devil == 2){
				next = BoatAction.DD;
			}
			if(start_priest == 1 && start_devil == 1){
				next = BoatAction.PD;
			}
		}
		//船在右边的情况
		else{
			if(start_priest == 2 && start_devil == 2){
				next = BoatAction.P;
			}
			if(start_priest == 3 && start_devil == 2){
				next = BoatAction.D;
			}
			if(start_priest == 3 && start_devil == 1){
				next = BoatAction.D;
			}
			if(start_priest == 3 && start_devil == 0){
				next = BoatAction.D;
			}
			if(start_priest == 1 && start_devil == 1){
				next = BoatAction.PD;
			}
			if(start_priest == 0 && start_devil == 2){
				next = BoatAction.D;
			}
			if(start_priest == 0 && start_devil == 1){
				if(Random.Range(0f,1f) <= 0.5f){
					next = BoatAction.D;
				}
				else{
					next = BoatAction.P;
				}
			}
		}
		return next;
	}

接下来只需要在GUI界面获取当前状态并增加一个按钮,根据获取的下一状态显示相应的提示信息即可

            BoatAction bation = curr_state.getNextBoatAction();
            if(bation == BoatAction.P){
                tips = "Move one Priest to boat";
            }
            else if(bation == BoatAction.D){
                tips = "Move one Devil to boat";
            }
            else if(bation == BoatAction.DD){
                tips = "Move two Devil to boat";
            }
            else if(bation == BoatAction.PD){
                tips = "Move one Devil and one Priest to boat";
            }
            else if(bation == BoatAction.PP){
                tips = "Move two Priest to boat";
            }
            else{
                tips = "state error";
            }

在显示提示的时候加入一个秒计数器,计数每次提示只显示5秒,让游戏可玩性更高

//5秒后清空提示
            if(cnt == 5){
                tips = "";
                cnt = 0;
            }
            GUI.Label(new Rect(Screen.width / 2 - 250, 150, 100, 50), tips,             timeStyle);

详细代码见github

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

3D游戏编程设计作业九 的相关文章

  • AIGC图像生成的原理综述与落地畅想

    AIGC 这个当前的现象级词语 本文尝试从文生图的发展 对其当前主流的 Stable Diffusion 做一个综述 以下为实验按要求生成的不同场景 风格控制下的生成作品 概述 技术演进一 昙花初现 GAN 家族 GAN 系列算法开启了图片
  • Android中Application类用法

    Application类 Application和Activity Service一样是Android框架的一个系统组件 当Android程序启动时系统会创建一个 Application对象 用来存储系统的一些信息 Android系统自动会
  • Unity查找物体方法的详细对比

    Unity查找物体方法的详细对比 我们开发中常用的查找物体的方法有 GameObject Find transform Find FindGameObjectWithTag FindGameObjectsWithTag FindObject
  • Ubuntu系统里使用gcc和Makefile编译c程序

    1 在windows环境下通过虚拟机软件 比如Vmware VirtualBox 安装Ubuntu 16 04 18 04 Desktop 并设置网络参数保证系统能上网 熟练掌握Ubuntu常用命令 并学习使用vi vim 或nano 或g
  • Visual Studio 2017 集成Crystal Report为ASP.NET MVC呈现报表

    最近项目需要实现报表功能 平衡各方面的因素 还是使用Crystal Report 水晶报表 下载较新版本 http downloads businessobjects com akdlm cr4vs2010 CRforVS 13 0 21
  • GetBytes的长度区别

    C 的GetBytes的长度区别 string s 欧 耶 string ss abc defg Encoding Default 是指当前系统设置的 默认字符集编码方式 Encoding ASCII 将 Unicode 字符编码为单个 7
  • Android动态化UI框架一、Virtualview-Android

    Android动态化UI框架一 Virtualview Android GitHub alibaba Virtualview Android 简介 A light way to build UI in custom XML Virtualv
  • 华为OD机试真题-机房布局/栈解法【2023.Q1】

    小明正在规划一个大型数据中心机房 需要满足的条件是 确保在每个机柜边上至少要有一个电箱 已知 机房排成1排 我们用M表示机柜 I表示间隔 请你返回这整排机房 至少需要多少个电箱 如果无解请返回 1 输入描述 第一行输入一个字符串 由 M 和
  • 人与计算机通信,需要达到哪些要求?

    目前人们使用计算机时 大多是用计算机的高级语言 如C Java等语言 编制程序来告诉计算 做什么 以及 怎么做 的 这对计算机的利用带来了诸多不便 严重阻碍了计算机应用的进一步推广 如果能让计算机 听懂 看懂 人类语言 如汉语 英语等 那将
  • 深度对抗学习在图像分割和超分辨率中的应用

    原文 http blog csdn net shenziheng1 article details 72821001 深度对抗学习在图像分割和超分辨率中的应用 原创 2017年05月31日 16 43 15 1982 1 前言 深度学习已经
  • Flutter 屏幕适配

    志当存高远 诸葛亮 屏幕尺寸大全 菜单栏共有5个选项 包括手机 平板 手表 电脑 显示器 分别显示屏幕尺寸 PPI 纵横比 dp和px 单位下的宽 高 以及DPI 官方设计规范 适配原理 屏幕尺寸 严格来说 屏幕尺寸实际被物理尺寸和显示分辨
  • sqlserver 如何备份或恢复一个表_MS SQL Server

    如果只想备份或恢复单个表而不想备份或恢复整个数据库的话 往往有以下方法 1 在Sql server2000 中可以使用DTS来将该表的数据导出成另外的文件格式 当需要恢复时 可以将该文件中数据再通过DTS导入 或者建立DTS脚本来完成 2
  • C语言操作寄存器的方法总结

    1 C语言位操作操作寄存器 操作位有两种方法 一种是位字段 另一种是使用按位运算符 下表为几种位操作符及其含义 不改变其他位的值的状况下 对某几个位进行设值 在嵌入式编程中 常常需要对一些寄存器进行配置 有的情况下需要改变一个字节中的某一位
  • 12步让Windows变成Linux

    趣味教程 12步让Windows变成Linux 作者 ZNXF 编辑 ZNXF 2005 11 26 16 21 00 在pocketpcthoughts网站我们发现了一个趣味Flash教程 声称能够12步让Windows变成Linux 可
  • C++的关键字

    关键字也称保留字 是预先定义好的标识符 有其特殊的含义 auto break case char const continue default do double else enum extern float for goto if int
  • myisam和innodb索引实现的不同

    转载 http www 2cto com database 201211 172380 html myisam和innodb索引实现的不同 MyISAM引擎使用B Tree作为索引结构 叶节点的data域存放的是数据记录的地址 下图是MyI
  • ❤️测试新人如何编写测试用例?一文从3个方面带你写一个合格的测试用例❤️

    前言 作为一个测试新人 刚开始接触测试 对于怎么写测试用例很头疼 无法接触需求 只能根据站在用户的角度去做测试 但是这样情况会导致不能全方位的测试APP 这种情况就需要一份测试用例了 但是不会写 求指教 还有就是测试出来的bug该如何追踪
  • 【笔记】公钥密码学之RSA

    数论基础 素数 1 定义 一个大于1的自然数 除了1和它本身外 不能被其他自然数整除 除0以外 的数称之为素数 质数 否则称为合数 如 3 4 12 不是素数 11除了等于11 1以外 不能表示为其它任何两个整数的乘积 所以11是一个素数
  • 目标检测之数据预处理

    一 数据介绍 AI识虫数据集结构如下 提供了2183张图片 其中训练集1693张 验证集245 测试集245张 包含7种昆虫 分别是Boerner Leconte Linnaeus acuminatus armandi coleoptera
  • Apache下设置整站变灰方法

    本文转载自http www sapub net Apache 感谢作者分享 Web服务器下设置变灰的方法比较简单 总结如下 1 安装mod ext filter模块 此模块用来在所有的输出页面插入你想要的内容 比如css 广告头之类 这里假

随机推荐

  • centos7设置静态IP地址

    有时候我们电脑 老是换网线 这个时候虚拟机ip就会跟着变 所以这里我建议大家直接配置静态ip 这样可以避免ip变化 目录 1 查看IP配置信息 从中获取网卡名称 2 编辑网卡名称对应的配置文件 3 修改 etc sysconfig netw
  • QT父窗口和子窗口互相通信

    这个问题上网查了好多 大神们都说的很简单 对于我这样的小白来说 理解起来就有点吃力了 下面记录一下 给自己留给笔记 也是给正在摸索中的小白们一点参考 一 大家要明白如何建立子窗口 1 利用新建ui的方式来新建 我没有用这种方式 这里就先不说
  • php 命令执行中 PHPSESSID 妙用

    php 命令执行中 PHPSESSID 妙用 前言 题目地址 查看源码 使用PHPSESSID绕过限制 使用反引号绕过限制 前言 之前刷CTF的时候 遇到一个命令执行的题 看大佬的WP是通过PHPSESSID传值 绕过waf 最近有时间复现
  • Python时间格式转换

    一 标准库 1 import time time模块中时间表现的格式主要有三种 a timestamp时间戳 时间戳表示的是从1970年1月1日00 00 00开始按秒计算的偏移量 b struct time时间元组 共有九个元素组 c f
  • 【解答】CSDN的c认证有含金量么?

    我就从考试难度 报名费用 企业认可度这几个点介绍一下吧 一 考试难度 C认证分 c1 c4 c5 三个等级 c1认证 是最基础的入门考试 以前端知识居多 考试内容多以 块状元素有哪些 行级元素有哪些居多 考试最后大题是用 html css
  • property_exists 检查对象或类是否具有该属性

    bool property exists mixed class string property 1 class myClass public mine private xpto static protected test static f
  • 有一行字符,统计其中的单词个数(单词之间以空格分隔),并将每一个单词的第一个字母改为大写。

    每天自己做的作业 不喜勿喷 define CRT SECURE NO WARNINGS include stdio h include stdlib h include string h int myStr char p int n int
  • Android:Namespace not specified. Please specify a namespace in the module‘s build.gradle file like

    文章目录 问题描述 解决方法 参考链接 问题描述 问题 接上文 解决方案记录 Could not find com android tools build gradle 8 0 在修改完对应的文件之后 并将compileSdk 版本号改为3
  • ./configure: error: C compiler cc is not found

    1 报错信息 configure error C compiler cc is not found 2 原因 没有下载gcc编译器 3 解决办法 用以下命令下载gcc编译器 yum y install gcc gcc c autoconf
  • 建立 PyQt6 窗口

    建立 PyQt6 窗口 这篇教学会介绍如何开始使用 PyQt6 建立基本的应用程序窗口 以及通过常用的窗口参数 进行窗口的相关设定 快速导航 建立 PyQt6 窗口 调整窗口样式 在窗口中放入其他组件 建立 PyQt6 窗口 PyQt6 创
  • ASP.NETCore WebApp + EFCore +Docker +MSSQL(Docker for Window)

    文章目录 一 本机环境 二 创建ASP NET Core WebApp 创建项目 添加模型 搭建基架 使用CoreFirst方式初始数据库架构 三 MSSQL Docker 拉取MSSQL Docker镜像 启动容器 环境要求 参数解析 连
  • socket failed: EPERM (Operation not permitted) 解决方法

    1 网络权限没有开启 2 不支持http 在AndroidManifest xml 中添加网络权限
  • 安全HCIP之IPX

    IPX Internetwork Packet Exchange protocol 互联网分组交换协议 IPX 是指互联网分组交换协议 提供分组寻址和选择路由的功能 保证可靠到达 相当于数据报的功能 SPX 是顺序报文分组交换协议 它可保证
  • C/C++ 代码编译过程【复习】

    C C 代码编译过程 很久很久没用过 C C 突然碰到编译过程 竟有些想不起来 这里复习一下 C 语言的编译链接过程要把我们编写的一个 C 程序 源代码 转换成可以在硬件上运行的程序 可执行代码 如汇编语言 机器语言 分两个部分 编译和链接
  • LLM系列

    简介 小伙伴们好 我是 小窗幽记机器学习 的小编 卖热干面的小女孩 紧接前文 万字长文细说ChatGPT的前世今生 后续会尝试以理论 实践的方式逐步对主流的各大LLM进行实测和汉化 今天这篇关于Llama2的小作文其实比较长 所以分为上下两
  • Python爬虫实战(3)-爬取豆瓣音乐Top250数据(超详细)

    前言 首先我们先来回忆一下上两篇爬虫实战文章 第一篇 讲到了requests和bs4和一些网页基本操作 Python爬虫实战 1 爬取 房天下 租房信息 超详细 第二篇 用到了正则表达式 re模块 Python爬虫实战 2 爬取小说 斗罗大
  • linux磁盘虚拟化

    1 LVM Logical Volume Manager 逻辑滚动条管理员 LVM可以将几个实体的partions 或disk 透过软件组合成为一块看起来是独立的大磁盘 VG 然后将这块大磁盘再经过分割成为可使用分隔槽 LV 最终就能够挂载
  • 【SQL注入-可回显】报错注入:简介、相关函数、利用方法

    目录 一 定义 1 1 简介 1 2 利用 1 3 利用过程 1 4示例 注 二 相关函数 2 1 最常用的三种是 2 2 Xpath语法错误 extractvalue updatexml 2 3 数据溢出 exp 2 4 主键重复 原理
  • php 大转盘抽奖概率 角度,在线抽奖大转盘和概率计算

    html gt 抽奖效果演示 rotary position relative width 854px height 504px margin 0 auto background d71f2e url p w picpaths bg1 pn
  • 3D游戏编程设计作业九

    P D 过河游戏智能帮助实现 程序具体要求 实现状态图的自动生成 讲解图数据在程序中的表示方法 利用算法实现下一步的计算 状态图分析 此次作业的代码基于第三次作业 牧师与魔鬼的动作分离版代码进行改进 加入了智能提示功能 实现效果图如下 要实