Visual C++游戏开发笔记十五 游戏人工智能一 运动型游戏AIWord文件下载.docx

上传人:b****5 文档编号:18972050 上传时间:2023-01-02 格式:DOCX 页数:18 大小:281.99KB
下载 相关 举报
Visual C++游戏开发笔记十五 游戏人工智能一 运动型游戏AIWord文件下载.docx_第1页
第1页 / 共18页
Visual C++游戏开发笔记十五 游戏人工智能一 运动型游戏AIWord文件下载.docx_第2页
第2页 / 共18页
Visual C++游戏开发笔记十五 游戏人工智能一 运动型游戏AIWord文件下载.docx_第3页
第3页 / 共18页
Visual C++游戏开发笔记十五 游戏人工智能一 运动型游戏AIWord文件下载.docx_第4页
第4页 / 共18页
Visual C++游戏开发笔记十五 游戏人工智能一 运动型游戏AIWord文件下载.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

Visual C++游戏开发笔记十五 游戏人工智能一 运动型游戏AIWord文件下载.docx

《Visual C++游戏开发笔记十五 游戏人工智能一 运动型游戏AIWord文件下载.docx》由会员分享,可在线阅读,更多相关《Visual C++游戏开发笔记十五 游戏人工智能一 运动型游戏AIWord文件下载.docx(18页珍藏版)》请在冰豆网上搜索。

Visual C++游戏开发笔记十五 游戏人工智能一 运动型游戏AIWord文件下载.docx

2.( 

3.P=rand()%3;

//取随机数除以3的余数 

4.If(p!

=1) 

//余数不为1时进行追逐 

5.{ 

6.If(枭兽X>

7.枭兽X--;

8.else 

9.枭兽X++;

10.If(枭兽Y<

11.枭兽Y++;

12.else 

13.枭兽Y--;

14.} 

15.else 

16. 

枭兽HP+=5 

//怪物不动,自动补5点血 

17.) 

这样的怪物就比较有灵性了,要继续创造出更聪明的AI,只要继续完善代码,写出更多的功能就行了。

2>

躲避移动

其实躲避移动和追逐移动的算法差不多,就是把++的地方和--对调就行了,让怪物与人物的空间坐标相互远离。

具体代码如下:

【算法3】

2.枭兽X++;

4.枭兽X--;

6.枭兽Y--;

8.枭兽Y++;

二、在实例中将知识融会贯通

依旧,我们看一个实例,来将本节的知识融会贯通。

这是一个小鸟追逐小女孩的场景,我们需要用键盘的【↑】【↓】【←】【→】键来躲避小鸟的追击,具体键盘输入消息的知识点还

不太了解的朋友,请移步笔记十二,这里给出链接:

【VisualC++】游戏开发笔记十二游戏输入消息处理

(一)键盘消息处理

下面依旧是贴图详细注释的源代码:

1.#include 

"

stdafx.h"

2.#include 

stdio.h>

3. 

4.//全局变量声明 

5.HINSTANCE 

hInst;

6.HBITMAP 

girl[4],bg,bird;

7.HDC 

hdc,mdc,bufdc;

8.HWND 

hWnd;

9. 

10.DWORD 

tPre,tNow,nowX,nowY;

11.POINT 

p[3];

//用于记录3只小鸟的贴图坐标 

12.int 

num,dir,x,y;

//x,y变量为人物贴图坐标,dir为人物移动方向,这里我们中以0,1,2,3代表人物上,下,左,右方向上的移动:

num为连续贴图中的小图编号 

13. 

14.//全局函数声明 

15.ATOM 

MyRegisterClass(HINSTANCE 

hInstance);

16.BOOL 

InitInstance(HINSTANCE, 

int);

17.LRESULT 

CALLBACK 

WndProc(HWND, 

UINT, 

WPARAM, 

LPARAM);

18.void 

MyPaint(HDC 

hdc);

19. 

20.//****WinMain函数,程序入口点函数*********************** 

21.int 

APIENTRY 

WinMain(HINSTANCE 

hInstance, 

22. 

HINSTANCE 

hPrevInstance, 

23. 

LPSTR 

lpCmdLine, 

24. 

int 

nCmdShow) 

25.{ 

26. 

MSG 

msg;

27. 

28. 

MyRegisterClass(hInstance);

29. 

30. 

//初始化 

31. 

if 

(!

InitInstance 

(hInstance, 

nCmdShow)) 

32. 

33. 

return 

FALSE;

34. 

35. 

36. 

GetMessage(&

msg,NULL,NULL,NULL);

//初始化msg 

37. 

//消息循环 

38. 

while( 

msg.message!

=WM_QUIT 

) 

39. 

40. 

if( 

PeekMessage( 

&

msg, 

NULL, 

0,0 

PM_REMOVE) 

41. 

42. 

TranslateMessage( 

msg 

);

43. 

DispatchMessage( 

44. 

45. 

else 

46. 

47. 

tNow 

GetTickCount();

48. 

if(tNow-tPre 

>

40) 

49. 

MyPaint(hdc);

50. 

51. 

52. 

53. 

msg.wParam;

54.} 

55. 

56.//****设计一个窗口类,类似填空题,使用窗口结构体******************* 

57.ATOM 

hInstance) 

58.{ 

59. 

WNDCLASSEX 

wcex;

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 

66. 

wcex.hInstance 

hInstance;

67. 

wcex.hIcon 

NULL;

68. 

wcex.hCursor 

69. 

LoadCursor(NULL, 

IDC_ARROW);

70. 

wcex.hbrBackground 

(HBRUSH)(COLOR_WINDOW+1);

71. 

wcex.lpszMenuName 

72. 

wcex.lpszClassName 

canvas"

;

73. 

wcex.hIconSm 

74. 

75. 

RegisterClassEx(&

wcex);

76.} 

77. 

78.//****初始化函数************************************* 

79.// 

加载位图并设定各种初始值 

80.BOOL 

InitInstance(HINSTANCE 

81.{ 

82. 

HBITMAP 

bmp;

83. 

hInst 

84. 

85. 

hWnd 

CreateWindow("

 

浅墨的绘图窗口"

WS_OVERLAPPEDWINDOW, 

86. 

CW_USEDEFAULT, 

0, 

NULL);

87. 

88. 

hWnd) 

89. 

90. 

91. 

92. 

93. 

MoveWindow(hWnd,10,10,640,480,true);

94. 

ShowWindow(hWnd, 

nCmdShow);

95. 

UpdateWindow(hWnd);

96. 

97. 

hdc 

GetDC(hWnd);

98. 

mdc 

CreateCompatibleDC(hdc);

99. 

bufdc 

100. 

101. 

102. 

//建立空的位图并置入mdc中 

103. 

bmp 

CreateCompatibleBitmap(hdc,640,480);

104. 

SelectObject(mdc,bmp);

105. 

106. 

107. 

//设定人物贴图初始位置和移动方向 

108. 

300;

109. 

250;

110. 

dir 

111. 

num 

112. 

nowX 

113. 

nowY 

114. 

115. 

116. 

//载入各连续移动位图及背景图 

117. 

girl[0] 

(HBITMAP)LoadImage(NULL,"

girl0.bmp"

IMAGE_BITMAP,440,148,LR_LOADFROMFILE);

118. 

girl[1] 

girl1.bmp"

IMAGE_BITMAP,424,154,LR_LOADFROMFILE);

119. 

girl[2] 

girl2.bmp"

IMAGE_BITMAP,480,148,LR_LOADFROMFILE);

120. 

girl[3] 

girl3.bmp"

121. 

bg 

bg.bmp"

IMAGE_BITMAP,640,480,LR_LOADFROMFILE);

122. 

123. 

124. 

bird 

bird.bmp"

IMAGE_BITMAP,122,122,LR_LOADFROMFILE);

125. 

126. 

p[0].x 

30;

127. 

p[0].y 

100;

128. 

129. 

p[1].x 

130. 

p[1].y 

131. 

132. 

p[2].x 

500;

133. 

p[2].y 

400;

134. 

135. 

136. 

137. 

138. 

TRUE;

139.} 

140. 

141.//****自定义绘图函数********************************* 

142.// 

1.人物贴图坐标修正及窗口贴图 

143.//进行AI行为判断并贴图 

144.void 

hdc) 

145.{ 

146. 

w,h,i;

147. 

148. 

//先在mdc中贴上背景图 

149. 

SelectObject(bufdc,bg);

150. 

BitBlt(mdc,0,0,640,480,bufdc,0,0,SRCCOPY);

151. 

152. 

//按照目前的移动方向取出对应人物的连续走动图,并确定截取人物图的宽度与高度 

153. 

SelectObject(bufdc,girl[dir]);

154. 

switch(dir) 

155. 

156. 

case 

0:

157. 

55;

158. 

74;

159. 

break;

160. 

1:

161. 

53;

162. 

77;

163. 

164. 

2:

165. 

60;

166. 

167. 

168. 

3:

169. 

170. 

171. 

172. 

173. 

//按照目前的X,Y的值在mdc上进行透明贴图,然后显示在窗口画面上 

174. 

BitBlt(mdc,x,y,w,h,bufdc,num*w,h,SRCAND);

175. 

BitBlt(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;

i<

3;

i++) 

185. 

186. 

187. 

if(rand()%3 

!

1) 

//有2/3几率进行追踪 

188. 

189. 

if(p[i].y 

y-16) 

190. 

p[i].y 

-= 

5;

191. 

192. 

+= 

193. 

194. 

if(p[i].x 

x-25) 

195. 

p[i].x 

196. 

197. 

198. 

199. 

200. 

//判断小鸟的移动方向,从而选择合适的位图朝向 

201. 

202. 

BitBlt(mdc,p[i].x,p[i].y,61,61,bufdc,61,61,SRCAND);

203. 

BitBlt(mdc,p[i].x,p[i].y,61,61,bufdc,0,61,SRCPAINT);

204. 

205. 

206. 

207. 

BitBlt(mdc,p[i].x,p[i].y,61,61,bufdc,61,0,SRCAND);

208. 

BitBlt(mdc,p[i].x,p[i].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 

//记录此次绘图时间 

218. 

219. 

num++;

220. 

if(num 

== 

8) 

221. 

222. 

223.} 

224. 

225.//****消息处理函数*********************************** 

226.// 

1.按下【Esc】键结束程序 

227.// 

2.按下方向键重设贴图坐标 

228.LRESULT 

WndProc(HWND 

hWnd, 

UINT 

message, 

WPARAM 

wParam, 

LPARAM 

lParam) 

229.{ 

230. 

switch 

(message) 

231. 

232. 

WM_KEYDOWN:

//按下键盘消息 

233. 

//判断按键的虚拟键码 

234. 

(wParam) 

235. 

236. 

VK_ESCAPE:

//按下【Esc】键 

237. 

PostQuitMessage( 

//结束程序 

238. 

239. 

VK_UP:

//按下【↑】键 

240. 

//先按照目前的移动方向来进行贴图坐标修正,并加入人物往上移动的量(每次按下一次按键移动10个单位),来决定人物贴图坐标的X与Y值,接着判断坐标是否超出窗口区域,若有则再次修正 

241. 

242. 

243. 

244. 

10;

245. 

246. 

247. 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 冶金矿山地质

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

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