P&D 过河游戏智能帮助实现

需求

  • 实现状态图的自动生成
  • 讲解图数据在程序中的表示方法
  • 利用算法实现下一步的计算

实现过程

实现状态图的自动生成&讲解图数据在程序中的表示方法

牧师与魔鬼状态可以用一个三元组(O,P,D)来表示,分别表示当前船的位置(0表示在出发地,1表示在目的地),出发地牧师数量和出发地魔鬼数量,状态数一共是2∗4∗4=322 * 4*4=322∗4∗4=32

我先用c++写了一个小程序构造出状态转移矩阵

首先求出每个状态下转移的邻接矩阵,转移表存储在数组a[32][32]a[32][32]a[32][32]中,如果状态i可以一步到达状态j,则a[i][j]=1a[i][j]=1a[i][j]=1,否则a[i][j]=0a[i][j]=0a[i][j]=0

int get(int o,int i,int j){ //将三元组转化成状态编号return o*16+i*4+j;
}
bool jud(int o,int i,int j){ //判断当前状态是否合法if (i<0||i>3||j<0||j>3) return 0;if ((i<j)&&(i!=0)) return 0;if ((3-i<3-j)&&(3-i!=0)) return 0;return 1;
}
#define rep(i,l,r) for (int i=l;i<=r;i++)
rep(o,0,1){rep(i,0,3){rep(j,0,3){int st=get(o,i,j);if (!jud(o,i,j)) continue;if (o==0){  //from 出发地的牧师和魔鬼只可能减少rep(dx,-2,0) rep(dy,-2,0) if (1<=abs(dx+dy)&&abs(dx+dy)<=2){if (!jud(o^1,i+dx,j+dy)) continue;a[get(o,i,j)][get(o^1,i+dx,j+dy)]=1;}}else { //to 出发地的牧师和魔鬼只可能增加rep(dx,0,2) rep(dy,0,2) if (1<=dx+dy&&dx+dy<=2){if (!jud(o^1,i+dx,j+dy)) continue;a[get(o,i,j)][get(o^1,i+dx,j+dy)]=1;}}}}
}

然后用最短路算法spfa求出所有状态到终点(1,0,0)的最短路距离

rep(o,0,1) rep(i,0,3) rep(j,0,3) dis[get(o,i,j)]=inf;
dis[get(1,0,0)]=0;
queue<int> q; q.push(get(1,0,0)); vis[get(1,0,0)]=1;
while (!q.empty()){int u=q.front(); q.pop(); vis[u]=0;int uo=u/16,ux=(u%16)/4,uy=u%4;rep(i,-2,2) rep(j,-2,2) {int vo=uo^1,vx=ux+i,vy=uy+j;int v=get(vo,ux+i,uy+j);if (jud(vo,vx,vy)&&a[v][u]&&dis[v]>dis[u]+1){  //如果状态v能到达状态u且能够更新状态v的距离dis[v]=dis[u]+1;if (!vis[v]) vis[v]=1,q.push(v);}}
}

我们只需要保留在最短路图上的边并输出

rep(o,0,1) rep(i,0,3) rep(j,0,3){rep(x,0,3) rep(y,0,3) {if (dis[get(o,x,y)]==dis[get(o^1,i,j)]+1&&a[get(o,x,y)][get(o^1,i,j)]) a[get(o,x,y)][get(o^1,i,j)]=1;else a[get(o,x,y)][get(o^1,i,j)]=0;}
}
rep(o,0,1) rep(i,0,3) rep(j,0,3){printf("{");rep(no,0,1) rep(x,0,3) rep(y,0,3) {printf("%d",a[get(o,i,j)][get(no,x,y)]);if (x==3&&y==3&&no==1) printf("},\n");else printf(",");}
}

状态转移矩阵

{{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}

在游戏中通过这张状态表就可以得知下一步应该到达哪一个状态了。

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

在之前作业5中(https://blog.csdn.net/ctlchild/article/details/101454426)

加入类AI,其中实现了函数tip,读取起点终点的牧师魔鬼数量,船的状态,计算出当前的状态,并根据转移表选择下一步的选择。

public int tip(CoastCon fromCoast,CoastCon toCoast,BoatCon boat) {   int fromP = 0, fromD = 0, toP = 0, toD = 0, boatst = 0;int[] fromCount = fromCoast.getCharacterNum();fromP += fromCount[0];fromD += fromCount[1];int[] toCount = toCoast.getCharacterNum ();toP += toCount[0];toD += toCount[1];int[] boatCount = boat.getCharacterNum ();if (boat.getStatus ()==-1) boatst=1;else boatst=0;if (boat.getStatus () == -1) {toP += boatCount[0]; toD += boatCount[1];   // boat at toCoast}else {fromP += boatCount[0]; fromD += boatCount[1];  // boat at fromCoast    }Debug.Log(fromP.ToString()+' '+fromD.ToString()+' '+get(boatst,fromP,fromD).ToString());for (int o=0;o<=1;o++)for (int i=0;i<=3;i++) for (int j=0;j<=3;j++) if (trans[get(boatst,fromP,fromD),get(o,i,j)]==1) return get(boatst,i,j);return -1;
}

运行效果

3D游戏编程实践——PD 过河游戏智能帮助实现相关推荐

  1. 【Unity 3D学习笔记】PD 过河游戏智能实现

    P&D 过河游戏智能帮助实现 实现状态图的自动生成 讲解图数据在程序中的表示方法 利用算法实现下一步的计算 对于过河游戏,首先需要知道其中各个状态之间的转换关系,绘制状态转移图如下: 其中,P ...

  2. Python游戏编程实践2:魔塔

    Python游戏编程实践2:魔塔 前言 运行 前言 在逗游游戏盒上玩了一个名叫<魔塔>的游戏,感觉颇有心得体会."与其临渊羡鱼,不如退而结网",使用Python语言编写 ...

  3. Python游戏编程实践3:魔法洞穴2

    Python游戏编程实践3:魔法洞穴2 前言 运行 前言 之前在TapTap上玩了一个名叫<魔法洞穴2>的小游戏,感觉很有意思,就使用Python语言编写了一个类似的命令行小游戏,为了简单 ...

  4. Python游戏编程实践1:鲁蒂亚的世界

    Python游戏编程实践1:鲁蒂亚的世界 前言 运行 前言 在逗游游戏盒上玩了一个名叫<鲁蒂亚的世界>的小游戏,感觉颇有心得体会."与其临渊羡鱼,不如退而结网",使用P ...

  5. iPhone游戏编程实例:分享成功游戏开发人员的锦囊妙计

    iPhone游戏编程实例:分享成功游戏开发人员的锦囊妙计 基本信息 原书名: iPhone Games Projects 原出版社: Apress 作者: (美)Dave Mark    PJ Cab ...

  6. python游戏编程入门源代码_python游戏编程入门源代码

    [实例简介] <Python游戏编程入门>的源代码,作者Jonathan S.Harbour 很好的资源,希望对学习python的同学有帮助,代码都可以运行 [实例截图] [核心代码] p ...

  7. Unity学习之PD 过河游戏智能帮助实现

    Unity学习之P&D 过河游戏智能帮助实现 根据之前设计好的动作分离版过河游戏,我们进行一个简单的状态图AI实现. 转移状态图 状态图老师已经给出: 该状态图只记录了游戏过程中左岸的情况.P ...

  8. unity:PD 过河游戏智能帮助实现

    P&D 过河游戏智能帮助实现 github传送门 状态图 状态图课件有 状态图(Statechart Diagram)是描述一个实体基于事件反应的动态行为,显示了该实体如何根据当前所处的状态对 ...

  9. Unity3d入门之路-PD 过河游戏智能帮助

    文章目录 P&D 过河游戏智能帮助 状态图 实现方法 图的表示方法 广度优先搜索 P&D 过河游戏拓展 结果展示 P&D 过河游戏智能帮助 本次作业基本要求是三选一,我选择了P ...

最新文章

  1. python hibernate_将Java/MVC/Hibernate webapp移植到Python
  2. MySQL复制类型介绍
  3. JavaScript基础3——关于运算符
  4. 准确率,召回率,F值,ROC,AUC
  5. weblogic 的一些说明
  6. Coursera Algorithms week1 算法分析 练习测验: Egg drop 扔鸡蛋问题
  7. 日志库EasyLogging++学习系列(1)—— 简要介绍
  8. 滤波器开发之二:基于算数平均的带阻平滑滤波器
  9. 最简单的NamedPiep程序[秋镇菜]-初学者看看
  10. 第一阶段冲刺 第八天
  11. matlab将图片旋转的代码_【MATLAB】钟表
  12. 高级 Vue 组件模式 (6)
  13. noip2017提高组初赛c语言,NOIP2017提高组比赛体验篇一(干货)
  14. 【C语言】之实现俄罗斯方块游戏
  15. PowerPoint 中缺少think-cell 加载项怎么解决?
  16. 可编程渲染管线10 多细节层次(LOD)
  17. 【JAVA操作系统——可变式分区分配】首次适应算法
  18. edge浏览器突然不能播放视频解决办法
  19. 永辉私域流量模式案例:如何利用商域流量打造好企业自己的私域流量池?
  20. 中国(吉林)首批援萨摩亚医疗队凯旋

热门文章

  1. 微信小程序仿支付宝年账单页面滑动的效果展示
  2. 【8086】中国电力出版社 微机原理实验与课程设计指导书 实验二 数据处理实验程序设计 答案
  3. 从Google Map爬数据
  4. http://www.cnblogs.com/procoder/archive/2012/03/27/Windows-8-First-Try.html
  5. 浅谈数据仓库的基本架构(转)
  6. 滴普技术荟:OpenKube重塑企业统一管控平台
  7. 江民科技创始人王江民:传奇一生
  8. 互联网数据泛滥下,你的隐私数据要如何保护?
  9. 责任链模式 Chain of Responsibility
  10. 如何有效提升英文口语水平?这 15 个方法值得学习!