Visual C++游戏开发笔记十五 游戏人工智能一 运动型游戏AIWord文件下载.docx
《Visual C++游戏开发笔记十五 游戏人工智能一 运动型游戏AIWord文件下载.docx》由会员分享,可在线阅读,更多相关《Visual C++游戏开发笔记十五 游戏人工智能一 运动型游戏AIWord文件下载.docx(18页珍藏版)》请在冰豆网上搜索。
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.
x
300;
109.
y
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.
w
55;
158.
h
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(
0
//结束程序
238.
239.
VK_UP:
//按下【↑】键
240.
//先按照目前的移动方向来进行贴图坐标修正,并加入人物往上移动的量(每次按下一次按键移动10个单位),来决定人物贴图坐标的X与Y值,接着判断坐标是否超出窗口区域,若有则再次修正
241.
242.
243.
244.
10;
245.
246.
247.