ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:281.56KB ,
资源ID:12012833      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12012833.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(VC++游戏开发随记之十五.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

VC++游戏开发随记之十五.docx

1、VC+游戏开发随记之十五【Visual C+】游戏开发笔记十五 游戏人工智能运动型游戏AI我们常常听闻AI(ArtificialIntelligence人工智能)这个名词,比如Dota里面的AI地图。写这篇文章的时候,最新版的DotaAI是6.72f,估计过几天6.73的AI也要出来了。很多Dota玩家喜欢玩AI地图练练感觉和补刀,可以这样说,Dota地图成功的加入了AI元素,是近几年Dota风靡全球不可缺少的因素之一。一、知识点讲解那么,到底什么是AI呢?首先我们来了解一下人工智能(AI)的具体定义。“人工智能”(ArtificialIntelligence)简称AI。它是研究、开发用于模拟

2、、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能研究如何用计算机去模拟、延伸和扩展人的智能;如何把计算机用得更聪明;如何设计和建造具有高智能水平的计算机应用系统;如何设计和制造更聪明的计算机以及智能水平更高的智能计算机等。人工智能是计算机科学的一个分支,人工智能是计算机科学技术的前沿科技领域。人工智能与计算机软件有密切的关系。一方面,各种人工智能应用系统都要用计算机软件去实现,另一方面,许多聪明的计算机软件也应用了人工智能的理论方法和技术。而我们要讲解的游戏人工智能,只是渊博的人工智能领域里面的冰山一角。我们不会用到那些类似于神经网络,基因算法,模糊逻辑等复杂的人工

3、智能理论,我们只需利用自己本身的思考模式去赋予游戏中角色判断的能力,来进行某些特定的行为。今天我们主角是运动型的AI,下面就开始正题吧。凡是在游戏中会移动的物体,几乎都涉及到了运动型的游戏AI,例如游戏中怪物的追逐或者躲避玩家和游戏中NPC角色的移动都是移动型AI的例子。追逐移动下面我们以移动型AI里的追逐移动型AI来作为例子讲解。追逐移动一般是通过控制一角色朝某一目标接近来实现,简单点说,就是两个物体的空间坐标相互接近。比如我们要设计一个怪物追逐玩家的游戏,只要在每次进行贴图时,将怪物坐在坐标与玩家角色所在的坐标进行比较,自增或者自减怪物X,Y轴上的贴图坐标,就可产生追逐移动的效果。下面就是

4、一个典型的怪物追逐外加的移动AI算法,其中“枭兽X”、“枭兽Y”,“幻影刺客X”,“幻影刺客Y”分别用来表示怪物及玩家在X与Y轴上的贴图坐标。【算法1】cppview plaincopyprint?1. If(枭兽X幻影刺客X)2. 枭兽X-;3. else4. 枭兽X+;5. If(枭兽Y200)/生命值大于200时才追2. (3. P=rand()%3;/取随机数除以3的余数4. If(p!=1)/余数不为1时进行追逐5. 6. If(枭兽X幻影刺客X)7. 枭兽X-;8. else9. 枭兽X+;10. If(枭兽Y幻影刺客Y)11. 枭兽Y+;12. else13. 枭兽Y-;14.

5、15. else16. 枭兽HP+=5/怪物不动,自动补5点血17. )这样的怪物就比较有灵性了,要继续创造出更聪明的AI,只要继续完善代码,写出更多的功能就行了。躲避移动其实躲避移动和追逐移动的算法差不多,就是把+的地方和-对调就行了,让怪物与人物的空间坐标相互远离。具体代码如下:【算法3】cppview plaincopyprint?1. If(枭兽X幻影刺客X)2. 枭兽X+;3. else4. 枭兽X-;5. If(枭兽Y幻影刺客Y)6. 枭兽Y-;7. else8. 枭兽Y+;二、在实例中将知识融会贯通依旧,我们看一个实例,来将本节的知识融会贯通。这是一个小鸟追逐小女孩的场景,我们需

6、要用键盘的【】【】【】【】键来躲避小鸟的追击,具体键盘输入消息的知识点还不太了解的朋友,请移步笔记十二,这里给出链接:【Visual C+】游戏开发笔记十二 游戏输入消息处理(一) 键盘消息处理下面依旧是贴图详细注释的源代码:cppview plaincopyprint?1. #includestdafx.h2. #include3. 4. /全局变量声明5. HINSTANCEhInst;6. HBITMAPgirl4,bg,bird;7. HDChdc,mdc,bufdc;8. HWNDhWnd;9. 10. DWORDtPre,tNow,nowX,nowY;11. POINTp3;/用于

7、记录3只小鸟的贴图坐标12. intnum,dir,x,y;/x,y变量为人物贴图坐标,dir为人物移动方向,这里我们中以0,1,2,3代表人物上,下,左,右方向上的移动:num为连续贴图中的小图编号13. 14. /全局函数声明15. ATOMMyRegisterClass(HINSTANCEhInstance);16. BOOLInitInstance(HINSTANCE,int);17. LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);18. voidMyPaint(HDChdc);19. 20. /*WinMain函数,程序入口点函数*2

8、1. intAPIENTRYWinMain(HINSTANCEhInstance,22. HINSTANCEhPrevInstance,23. LPSTRlpCmdLine,24. intnCmdShow)25. 26. MSGmsg;27. 28. MyRegisterClass(hInstance);29. 30. /初始化31. if(!InitInstance(hInstance,nCmdShow)32. 33. returnFALSE;34. 35. 36. GetMessage(&msg,NULL,NULL,NULL);/初始化msg37. /消息循环38. while(msg.m

9、essage!=WM_QUIT)39. 40. if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)41. 42. TranslateMessage(&msg);43. DispatchMessage(&msg);44. 45. else46. 47. tNow=GetTickCount();48. if(tNow-tPre=40)49. MyPaint(hdc);50. 51. 52. 53. returnmsg.wParam;54. 55. 56. /*设计一个窗口类,类似填空题,使用窗口结构体*57. ATOMMyRegisterClass(HINSTANCEh

10、Instance)58. 59. WNDCLASSEXwcex;60. 61. wcex.cbSize=sizeof(WNDCLASSEX);62. wcex.style=CS_HREDRAW|CS_VREDRAW;63. wcex.lpfnWndProc=(WNDPROC)WndProc;64. wcex.cbClsExtra=0;65. wcex.cbWndExtra=0;66. wcex.hInstance=hInstance;67. wcex.hIcon=NULL;68. wcex.hCursor=NULL;69. wcex.hCursor=LoadCursor(NULL,IDC_AR

11、ROW);70. wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);71. wcex.lpszMenuName=NULL;72. wcex.lpszClassName=canvas;73. wcex.hIconSm=NULL;74. 75. returnRegisterClassEx(&wcex);76. 77. 78. /*初始化函数*79. /加载位图并设定各种初始值80. BOOLInitInstance(HINSTANCEhInstance,intnCmdShow)81. 82. HBITMAPbmp;83. hInst=hInstance;84.

12、 85. hWnd=CreateWindow(canvas,浅墨的绘图窗口,WS_OVERLAPPEDWINDOW,86. CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL);87. 88. if(!hWnd)89. 90. returnFALSE;91. 92. 93. MoveWindow(hWnd,10,10,640,480,true);94. ShowWindow(hWnd,nCmdShow);95. UpdateWindow(hWnd);96. 97. hdc=GetDC(hWnd);98. mdc=CreateComp

13、atibleDC(hdc);99. bufdc=CreateCompatibleDC(hdc);100. 101. 102. /建立空的位图并置入mdc中103. bmp=CreateCompatibleBitmap(hdc,640,480);104. SelectObject(mdc,bmp);105. 106. 107. /设定人物贴图初始位置和移动方向108. x=300;109. y=250;110. dir=0;111. num=0;112. nowX=300;113. nowY=300;114. 115. 116. /载入各连续移动位图及背景图117. girl0=(HBITMAP

14、)LoadImage(NULL,girl0.bmp,IMAGE_BITMAP,440,148,LR_LOADFROMFILE);118. girl1=(HBITMAP)LoadImage(NULL,girl1.bmp,IMAGE_BITMAP,424,154,LR_LOADFROMFILE);119. girl2=(HBITMAP)LoadImage(NULL,girl2.bmp,IMAGE_BITMAP,480,148,LR_LOADFROMFILE);120. girl3=(HBITMAP)LoadImage(NULL,girl3.bmp,IMAGE_BITMAP,480,148,LR_L

15、OADFROMFILE);121. bg=(HBITMAP)LoadImage(NULL,bg.bmp,IMAGE_BITMAP,640,480,LR_LOADFROMFILE);122. 123. 124. bird=(HBITMAP)LoadImage(NULL,bird.bmp,IMAGE_BITMAP,122,122,LR_LOADFROMFILE);125. 126. p0.x=30;127. p0.y=100;128. 129. p1.x=250;130. p1.y=250;131. 132. p2.x=500;133. p2.y=400;134. 135. 136. MyPain

16、t(hdc);137. 138. returnTRUE;139. 140. 141. /*自定义绘图函数*142. /1.人物贴图坐标修正及窗口贴图143. /进行AI行为判断并贴图144. voidMyPaint(HDChdc)145. 146. intw,h,i;147. 148. /先在mdc中贴上背景图149. SelectObject(bufdc,bg);150. BitBlt(mdc,0,0,640,480,bufdc,0,0,SRCCOPY);151. 152. /按照目前的移动方向取出对应人物的连续走动图,并确定截取人物图的宽度与高度153. SelectObject(bufd

17、c,girldir);154. switch(dir)155. 156. case0:157. w=55;158. h=74;159. break;160. case1:161. w=53;162. h=77;163. break;164. case2:165. w=60;166. h=74;167. break;168. case3:169. w=60;170. h=74;171. break;172. 173. /按照目前的X,Y的值在mdc上进行透明贴图,然后显示在窗口画面上174. BitBlt(mdc,x,y,w,h,bufdc,num*w,h,SRCAND);175. BitBlt

18、(mdc,x,y,w,h,bufdc,num*w,0,SRCPAINT);176. 177. 178. 179. 180. /贴出鸟的图片181. SelectObject(bufdc,bird);182. 183. 184. for(i=0;iy-16)190. pi.y-=5;191. else192. pi.y+=5;193. 194. if(pi.xx-25)195. pi.x-=5;196. else197. pi.x+=5;198. 199. 200. if(pi.xx-25)/判断小鸟的移动方向,从而选择合适的位图朝向201. 202. BitBlt(mdc,pi.x,pi.y,

19、61,61,bufdc,61,61,SRCAND);203. BitBlt(mdc,pi.x,pi.y,61,61,bufdc,0,61,SRCPAINT);204. 205. else206. 207. BitBlt(mdc,pi.x,pi.y,61,61,bufdc,61,0,SRCAND);208. BitBlt(mdc,pi.x,pi.y,61,61,bufdc,0,0,SRCPAINT);209. 210. 211. 212. BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY);213. 214. 215. 216. 217. tPre=GetTickCo

20、unt();/记录此次绘图时间218. 219. num+;220. if(num=8)221. num=0;222. 223. 224. 225. /*消息处理函数*226. /1.按下【Esc】键结束程序227. /2.按下方向键重设贴图坐标228. LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)229. 230. switch(message)231. 232. caseWM_KEYDOWN:/按下键盘消息233. /判断按键的虚拟键码234. switch(wParam)235. 236. caseVK_ESCAPE:/按下【Esc】键237. PostQuitMessage(0);/结束程序238. break;239. caseVK_UP:/按下【】键240. /先按照目前的移动方向来进行贴图坐标修正,并加入人物往上移动的量(每次按下一次按键移动10个单位),来决定人物贴图坐标的X与Y值,接着判断坐标是否超出窗口区域,若有则再次修正241. switch(dir)242. 243. case0:244. y-=10;245. break;246. case1:247. x-=1;248. y-=8;249. break;250.

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1