45fan.com - 路饭网

搜索: 您的位置主页 > 电脑频道 > 电脑教程 > 阅读资讯:制作电脑游戏中的人工智能的方法

制作电脑游戏中的人工智能的方法

2016-09-01 07:28:44 来源:www.45fan.com 【

制作电脑游戏中的人工智能的方法

电脑游戏随着硬件执行效率与显示解析度等大幅提升,以往很多不可能或非常难以实现的电脑游戏如此都得以顺利完成。虽然电脑游戏的呈现是那么地多样化,然而却与我们今日所要探讨的主题,人工智能几乎都有着密不可分的关系。
在角色扮演游戏中,程序员与企划人员需要精确地在电脑上将一个个所谓的“怪物”在战门过程中栩栩如生地制作出来;所以半兽人受了重伤懂得逃跑,法师懂得施展攻性法术。
目前能让人立刻想到与人工智能有密切关系的游戏有两种:
一是所谓的战棋/策略模拟游戏,二则是棋弈游戏。人工智能的比重与深浅度,在不同的游戏类型中各有不一。有的电脑游戏非标榜着高人工智能不可,不然没有人买;有的则是几乎渺茫到让玩家无法感觉有任何人工智能的存在。

导向式思考

AI最容易制作的的方式,同时也是早期游戏AI发展的主要方向就是规则导向或称之为假设导向。在一些比较简单的电脑游戏中,程序员可以好不困难地将游戏中的规则与设定转化成一条条的规则,然后将它们写成电脑程序。让我们以角色扮演游戏为例。决大多数的企画在设定所谓电脑怪物时,所设定的属性通常有以下几种:

生命值攻击力防御力法力属性

最后一个“属性”是我在设定时喜欢增加的项目之一。透过这项属性的设定,我可以把怪物设定成“贪生怕死的”,也可以把战士设定为“视死如归”。以目前我们所掌握的资料,在战门系统中的大纲如是诞生了:

规则一

if(生命值<10)//边临死亡了吗
{if(属性==贪生怕死)
结果=试图逃跑
if(有任何恢复生命值的物品或法术可用)
结果=使用或施展相关物品或法术
}


规则二

if(可施攻击性法术&&有足够法力)
{
结果=施展攻攻击性法术
}

由以上一连串的“如果--就--”规则设定,建立了最基本的AI。说这样的制方式只能建立基本AI其实并不当然正确。只要建立足够及精确的规则,这样的方式仍然有一定水准的表现。
规则导向的最大优点就是易学易用。在没有深奥的理论概念的前提下,仍有广大的使用群。所以很多老道的玩家常常没两下就摸清楚敌人的攻击策略,移动方式等等。

推论式思考

相信曾经接触过电脑语言课程,或是自习过相关书籍的朋友们,都曾曾经听过一个著名的程序,那就是井字游戏。用井字游戏作为讨论AI的入门教材,我个人觉得是最适当的例子。或许有人还不知道井字游戏怎么玩。只要任何一方在三乘三的方格中先先成一线便胜利了。我们在前面谈过的规则导向,在这里也可以派得上用常

if任何一线已有我方两子&&另外一格仍空//我方即将成一线吗
结果=该空格
if任何一线已有敌方两子&&另外一格仍空//防止敌方作成一线
结果=该空格
if任何一线已有我方一子&&另外两格仍空//作成两子
结果=该空格

有一次我在某本电脑书上,同样地也看到某些以井字游戏为介绍的范例。不同的是,我几乎看不到任何规则导向的影子。但在仔细分析该程序码后,我得到了极大的启发,原来AI是可以不用这么多规则来制作的。它用的方法正是在电脑AI课程中重要的概念:极大极小法。我在这里只说明这法则的概念。继续以井字游戏为例,电脑先在某处下子,接着会以假设的方式,替对方下子,当然,必须假设对方下的是最佳位置,否则一切则毫无意义。在假设对方下子的过程中,自然又需要假设我方的下一步回应,如此一来一往,直到下完整局游戏为止。

底下是节录书中的程序片段:

bestMove(intp,int*v)
{inti;
intlastTie;
intlastMove;
intsubV;
/*First,checkforatie*/
if(isTie()){
*v=0;
return(0);
};
/*Ifnotatie,tryeachpotentialmove*/
for(*v=-1,lastTie=lastMove=-1,i=0;i<9;i++)
{
/*Ifthisisn'tapossible,skipit*/
if(board[i]!=0)continue;
/*Makethemove.*/
lastMove=i;
board[i]=p;
/*Diditwin?*/
if(hasWon(p))*v=1;
else{
/*Ifnot,findouthowgoodtheothersidecando*/
bestMove(-p,&subV);
/*Iftheycanonlylose,thisisstillawin.*/
if(subV==-1)*v=1;
/*Or,ifit'satie,rememberit.*/
elseif(subV==0){
*v=0;
lastTie=i;
};
};
/*Takebackthemove.*/
board[i]=0;
/*Ifwefoundawin,returnimmediately
(can'tdoanybetterthanthat)*/
if(*v==1)return(i);
/*Ifwedidn'tfindanywins,returnatiemove.*/
if(*v==0)return(lastTie);
/*Ifthereweren'tevenanyties,returnaloosingmove.*/
elsereturn(lastMove);
};

国外的一些论坛曾举行过256字节的游戏设计比赛。作品非常多,其中有一件作品正巧也是井字游戏。作者用区区两百多行就写了与上述程序演算方式完全相同的作品,可见功力确实了的。另外,我也很希望类似的活动能在国内推展起来。对了,在这样的比赛条件限制下,除了汇编语言外,几乎没有其它的选择了。

.386c
codesegmentbytepublicuse16
assumecs:code,ds:code

org100h

tictacprocfar

start:
pushcs
popds
movax,0B800h;清除屏幕
moves,ax;
xordi,di;
movcx,7D0h;
movax,0F20h;
repstosw;
xorcx,cx;
movdl,5
loc_1:
callprintBoard
loc_2:
movah,8;等待按键
int21h

movzxbx,al

subbl,31h;如果不是1..9
jcloc_2;则重新输入
cmpbl,8
jaloc_2
cmpdata_1[bx],al
jneloc_2
movbyteptrdata_1[bx],'x'
decdl
jzshortloc_3
moval,'o'
callbestMove
mov[si],al
callisWin;判断是否已取得胜利
jncloc_1
loc_3:
callprintBoard
movax,4C00h
int21h

data_1db'12'
data_2db'3456789'
data_3db0

tictacendp


printBoardprocnear
movsi,offsetdata_1
movdi,548h
movcl,3

locloop_4:
movsb
adddi,5
movsb
adddi,5
movsb
adddi,133h
looplocloop_4

retn
printBoardendp


isWinprocnear
movbx,1
movbp,3
callsub_3;检查横向是否完成
incbx
incbx
decbp
decbp
callsub_3;检查纵向是否完成
callsub_4;检查斜向是否完成
clc
retn
isWinendp

loc_5:
stc
retn


sub_3procnear
movah,3
movsi,offsetdata_1
loc_6:
movdi,si
callsub_5
addsi,bp
decah
jnzloc_6
retn
sub_3endp

sub_4procnear
movdi,offsetdata_1
incbx
callsub_5
movdi,offsetdata_2
decbx
decbx
callsub_5
retn
sub_4endp


sub_5procnear
movcl,3

locloop_7:
cmp[di],al
jneshortloc_ret_8
adddi,bx
looplocloop_7

add&
 

本文地址:http://www.45fan.com/dnjc/70660.html
Tags: 中的 人工智能 电脑游戏
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部