
维游戏的编程技术-2.ppt
24页VC++游戏编程,第二章 二维游戏的编程技术,VC++游戏编程——游戏的编程技术,第九节 人工智能应用 一、移动型人工智能 移动型人工智能主要包括三类:固定模式移动、追逐移动、躲避移动 固定模式移动 在程序里,我们给物体定义一个移动路径公式,物体就会按照这个公式来移动,这种方式就属于固定模式的移动固定模式移动的设计重点在于为游戏中每一类移动路径类似的对象建立一个共享移动路径的结构,由此共享结构所声明的对象则拥有类似的移动方式,但通过设置不同的初始值,这些物体的移动路径就会有所不同2. 追逐移动 追逐移动最常见的情况是计算机怪物追逐玩家,算法如下: if(怪物X玩家X) 怪物X- -; else 怪物X++; if(怪物Y玩家Y) 怪物Y- -; else 怪物Y+ +;,VC++游戏编程——游戏的编程技术,对上面的算法作如下修改: if(怪物HP200) //生命值大于200时才追 { p=rand()%3; if(p!=1) // 余数不为1时进行追逐 { if(怪物X玩家X) 怪物X- -; else 怪物X++; If(怪物Y玩家Y) 怪物Y- -; else 怪物Y+ +; } else 怪物HP+=5; //怪物不动,休息补血 },VC++游戏编程——游戏的编程技术,3. 躲避移动 if(怪物X玩家X) 怪物X++; else 怪物X- -; if(怪物Y玩家Y) 怪物Y++; else 怪物Y- -;,VC++游戏编程——游戏的编程技术,二、行为型人工智能 行为型AI的基本原理是物体会随着不同的情况而改变,并作出一些特有的行为动作,而这些物体可以包含游戏中的主角、怪物,或四周环境中的物品。
物体的动作行为 在游戏中加入AI,要预先想好一些可能会发生的状况和物体所要执行的动作,并利用if语句来让物体根据各种情况产生相应的行为例如以一盏灯为例,它的行为只有两种:亮与不亮,但是使亮或不亮的情况有多种,如:停电了、电灯坏了、没按开关等等考虑到这些情况后,我们就可以利用if语句来赋予一盏灯相应的行为型AI了我们有如下算法:,VC++游戏编程——游戏的编程技术,if(停电) 灯不亮 else { if(灯坏了) 灯不亮 else { if(没按开关) 灯不亮 else 灯亮 } },VC++游戏编程——游戏的编程技术,假设一只怪物有以下几种行为: 普通攻击 施放攻击魔法 使劲全力攻击 补血 逃跑 我们可以编写如下算法,VC++游戏编程——游戏的编程技术,if(生命值100) { if(rand()%9) 实施魔法攻击 (1/10的几率使用魔法攻击) else 实施普通攻击 } else { swich(rand()%5) { case 0: 普通攻击 break; case 1: 魔法攻击 break; case 2: 使尽全力攻击 break; case 3: 补血 break; case 4: 逃跑 if(rand()%2==0) (1/2几率成功) 逃跑成功; else 逃跑失败 break; } },VC++游戏编程——游戏的编程技术,2. 路径查找 以迷宫为例,设计路径查找时必须赋予物体一些走迷宫的法则,如:前面的路走过就往没有走过的地方走等,这些法则必须可以让物体探索迷宫中的每一块区域来找到出口,若走迷宫的法则定得不完整,那么物体可能在一个地方兜圈子,永远也找不到出口。
在迷宫程序中,定义一个二维数组maze[8][8]用于存储整个迷宫状态,如下图所示:并设置入口的元素值为3,入口的元素值为2,墙的元素值为1,通路的元素值为0代表入口的数组元素maze[1][0]VC++游戏编程——游戏的编程技术,VC++游戏编程——游戏的编程技术,程序中使用一个双向链表来记录小球所走过的路径,结构声明如下: struct list { int m; int n; struct list *next; struct list *back; }; typedef struct list node; typedef node *pointer; 数组pass[8][8]用来记录迷宫中的格子是否已走过,当小球走向没有走过的格子时,这一格就会被加到链表中,当小球走到其上下左右都有墙或都已走过时,就必须倒退,而每倒退一格就表示那一个是错误的路,因此要将其从链表中删除直到走出迷宫,链表中的每一个节点便是正确的行进路线VC++游戏编程——游戏的编程技术,VC++游戏编程——游戏的编程技术,走迷宫规则: 步骤1:先试着往下走,如果下一格有墙或走过,则试着往右走; 步骤2:如果右一格有墙或走过,则试着往左走; 步骤3:如果左一格有墙或走过,则试着往上走; 步骤4:如果上一格有墙或走过,则表示上下左右都没有未走过的路,这时必须回退,即回到上一个节点的位置,并删除目前的节点。
VC++游戏编程——游戏的编程技术,3.策略型人工智能 策略型人工智能是所有AI中最复杂的一种,常见的是棋盘类游戏就是这种策略的典范这类游戏通常是由计算机根据目前的情况分析计算机所有可走棋步和可能获胜的几率,并计算玩家走棋步和至胜的几率,最后选择一个最佳走法VC++游戏编程——游戏的编程技术,VC++游戏编程——游戏的编程技术,(1)计算所有获胜组合: 60+60+2x(6+(5+4+3+2+1)x2)=192,VC++游戏编程——游戏的编程技术,(2)定义数组 设左图的排列为192种获胜方式中的第8种,那么初始化ptable时数组元素的值设置如下: ptable[0][0][8]=false ptable[0][1][8]=false ptable[2][1][8]=true ptable[3][2][8]=true ptable[4][3][8]=true ptable[5][4][8]=true ptable[6][5][8]=true ………. ptable[9][9][8]=false,如果在程序运行中玩家棋子占住了(3,2),那么计算机的ctable[3][2][8]的值便会被设为false,因为计算机的棋子不可能再下到(3,2)上,因此第8种的获胜组合对计算机来说就变的不可能了。
反之,若计算机的棋子占住了(3,2)的位置,则玩家的ptable[3][2][8]元素的值也会被设为false win[2][192]数组用来记录玩家或计算机在其各个获胜组合中所填入的棋子数假设玩家在数组中的下标为0,若玩家已在第8种获胜组合中填入了4颗棋子,那么win[0][8]便等于4,在运行时,程序会判断win[2][192]数组中是否有一个元素的值为5,若是则表示已经完成了5颗棋子的连线,玩家(或计算机)获胜VC++游戏编程——游戏的编程技术,(3)分数设置 在游戏中,为了让计算机能够决定下一步的最佳走法,必须先计算出计算机将棋子下到棋盘上任意一格的分数,而其中的最高分便是计算机下一步的最佳走法如下图所示 从图中我们可以看到,右边的棋子(粉色)阻绝了左边棋子在右边方向的连线,因此右边方格的分数为0而在左边所可以达成连线的格子内,分数各不同,以最左上角的格子与绿色棋子达成连线的组合只有一种,因此把这一格子定为5,而右上方的那一格与棋子达成连线的组合有4种,所以该格子的分数为5x4=20,其他格子的分数依此类推VC++游戏编程——游戏的编程技术,若空格子可以与一颗棋子达成连线,每有一种获胜组合就将该格子的分数累加5,如果空格子可以与2、3、4颗棋子达成连线,那么所要加上的分数就更高了。
计算机在下每颗棋子之前,必须按照这样的方法来计算每一个空格的分数,分数最高的那个格就是计算机下棋子的最佳位置VC++游戏编程——游戏的编程技术,(4)攻击与防守 在上述方式中,计算机实际上只是计算出了最佳的“攻击位置”,也就是让计算机可以达成连线的最佳进攻方式在玩家快获胜的时候,计算机还是去找自己的最佳位置,也就是说计算机不会防守为了让计算机能够知道玩家目前的状态,程序同样要计算玩家目前在所有空格子上的获胜分数,其中分数最高的就是玩家下棋子的最佳位置如果玩家最佳攻击位置上的分数大于计算机最佳位置上的分数,那么计算机就将下一步的棋子摆在玩家的最佳攻击位置上以阻绝玩家的攻击,从而进行防守,否则,便将棋子下在自己的最佳位置上去进行攻击VC++游戏编程——游戏的编程技术,。












