>_<:AI introduction.
>_<:According the plane position (nowX,nowY) relative to birds‘ position
(p[i].x,p[i].y) automaticly change birds‘
position.
1 //贴上小鸟
2 SelectObject(bufdc,bird);
3 for(i=0;i<3;i++){
4 if(rand()%3!=1){
5 if(p[i].y>nowY-16)
6 p[i].y-=5;
7 else
8 p[i].y+=5;
9
10 if(p[i].x>nowX-25)
11 p[i].x-=5;
12 else
13 p[i].x+=5;
14 }
15 if(p[i].x>nowX-25){ //判断小鸟移动方向
16 BitBlt(mdc,p[i].x,p[i].y,61,61,bufdc,61,61,SRCAND);
17 BitBlt(mdc,p[i].x,p[i].y,61,61,bufdc,0,61,SRCPAINT);
18 }else{
19 BitBlt(mdc,p[i].x,p[i].y,61,61,bufdc,61,0,SRCAND);
20 BitBlt(mdc,p[i].x,p[i].y,61,61,bufdc,0,0,SRCPAINT);
21 }
22 }
>_<:resource
1 #include <windows.h>
2 // C 运行时头文件
3 #include <stdlib.h>
4 #include <cstdio>
5 #include <malloc.h>
6 #include <memory.h>
7 #include <tchar.h>
8 #include <string>
9
10
11 //定义结构,飞机子弹
12 struct BULLET{
13 int x,y;
14 bool exist;
15 };
16
17 // 全局变量:
18 HINSTANCE hInst; // 当前实例
19
20 HBITMAP bg,ship,bullet,bird;//背景图,飞机图,子弹图,鸟
21 HDC hdc,mdc,bufdc;
22 HWND hWnd;
23 int x,y,nowX,nowY;//鼠标坐标,飞机坐标(贴图坐标)
24 int w=0,bcount;//滚动背景所要剪切的宽度,子弹数目
25 BULLET b[30];//存储飞机发出的子弹
26 POINT p[3];//鸟的位置
27
28 // 此代码模块中包含的函数的前向声明:
29 ATOM MyRegisterClass(HINSTANCE hInstance);
30 BOOL InitInstance(HINSTANCE, int);
31 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
32 INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
33 void MyPaint(HDC hdc);
34
35 int APIENTRY _tWinMain(HINSTANCE hInstance,
36 HINSTANCE hPrevInstance,
37 LPTSTR lpCmdLine,
38 int nCmdShow){
39
40 MSG msg;
41 MyRegisterClass(hInstance);
42 // 执行应用程序初始化:
43 if (!InitInstance (hInstance, nCmdShow)){
44 return FALSE;
45 }
46 // 主消息循环:
47 while (GetMessage(&msg, NULL, 0, 0)){
48 TranslateMessage(&msg);
49 DispatchMessage(&msg);
50 }
51 return (int) msg.wParam;
52 }
53
54 // 函数: MyRegisterClass()
55 //
56 // 目的: 注册窗口类。
57 ATOM MyRegisterClass(HINSTANCE hInstance){
58 WNDCLASSEX wcex;
59
60 wcex.cbSize = sizeof(WNDCLASSEX);
61
62 wcex.style = CS_HREDRAW | CS_VREDRAW;
63 wcex.lpfnWndProc = WndProc;
64 wcex.cbClsExtra = 0;
65 wcex.cbWndExtra = 0;
66 wcex.hInstance = hInstance;
67 wcex.hIcon = NULL;
68 wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
69 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
70 wcex.lpszMenuName = "Beautifulzzzz";
71 wcex.lpszClassName = "Beautifulzzzz";
72 wcex.hIconSm = NULL;
73
74 return RegisterClassEx(&wcex);
75 }
76
77 // 函数: InitInstance(HINSTANCE, int)
78 //
79 // 目的: 保存实例句柄并创建主窗口
80 //
81 // 注释:
82 //
83 // 在此函数中,我们在全局变量中保存实例句柄并
84 // 创建和显示主程序窗口。
85 // 1.设定飞机的初始位置
86 // 2.设定鼠标位置及隐藏
87 // 3.设定鼠标光标移动区域
88 //
89 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow){
90
91 HBITMAP bmp;
92 POINT pt,lt,rb;
93 RECT rect;
94
95 hInst = hInstance; // 将实例句柄存储在全局变量中
96
97 hWnd = CreateWindow("Beautifulzzzz","Beautifulzzzz", WS_OVERLAPPEDWINDOW,
98 CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
99
100 if (!hWnd)
101 {
102 return FALSE;
103 }
104
105 MoveWindow(hWnd,10,10,640,480,true);
106 ShowWindow(hWnd, nCmdShow);
107 UpdateWindow(hWnd);
108
109 hdc=GetDC(hWnd);
110 mdc=CreateCompatibleDC(hdc);
111 bufdc=CreateCompatibleDC(hdc);
112
113 bmp=CreateCompatibleBitmap(hdc,640,480);
114 SelectObject(mdc,bmp);
115
116 bg=(HBITMAP)LoadImageA(NULL,"bg.bmp",IMAGE_BITMAP,648,480,LR_LOADFROMFILE);
117 ship=(HBITMAP)LoadImageA(NULL,"ship.bmp",IMAGE_BITMAP,100,148,LR_LOADFROMFILE);
118 bullet=(HBITMAP)LoadImageA(NULL,"bullet.bmp",IMAGE_BITMAP,10,20,LR_LOADFROMFILE);
119 bird=(HBITMAP)LoadImageA(NULL,"bird.bmp",IMAGE_BITMAP,122,122,LR_LOADFROMFILE);
120
121 x=300;
122 y=300;
123 nowX=300;
124 nowY=300;
125
126 //设定鼠标光标位置
127 pt.x=300;
128 pt.y=300;
129 ClientToScreen(hWnd,&pt);
130 SetCursorPos(pt.x,pt.y);
131
132 ShowCursor(false);//隐藏鼠标光标
133
134 //限制鼠标光标移动区域
135 GetClientRect(hWnd,&rect);
136 lt.x=rect.left;
137 lt.y=rect.top;
138 rb.x=rect.right;
139 rb.y=rect.bottom;
140 ClientToScreen(hWnd,<);
141 ClientToScreen(hWnd,&rb);
142 rect.left=lt.x;
143 rect.top=lt.y;
144 rect.right=rb.x;
145 rect.bottom=rb.y;
146 ClipCursor(&rect);
147
148
149 SetTimer(hWnd,1,50,NULL);
150 MyPaint(hdc);
151
152 return TRUE;
153 }
154
155 //
156 // 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
157 //
158 // 目的: 处理主窗口的消息。
159 //
160 // WM_COMMAND - 处理应用程序菜单
161 // WM_PAINT - 绘制主窗口
162 // WM_DESTROY - 发送退出消息并返回
163 //
164 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
165 int i;
166 int wmId, wmEvent;
167 PAINTSTRUCT ps;
168
169 switch (message)
170 {
171 case WM_KEYDOWN: //按下消息
172 if(wParam==VK_ESCAPE) //按下[esc]
173 PostQuitMessage(0);
174 break;
175 case WM_LBUTTONDOWN: //单击鼠标左键消息
176 for(i=0;i<30;i++)
177 {
178 if(!b[i].exist)
179 {
180 b[i].x=nowX;
181 b[i].y=nowY+30;
182 b[i].exist=true;
183 bcount++;
184 break;
185 }
186 }
187 case WM_MOUSEMOVE:
188 x=LOWORD(lParam); //取得鼠标x坐标
189 if(x>530)
190 x=530;
191 else if(x<0)
192 x=0;
193
194 y=HIWORD(lParam);
195 if(y>380)
196 y=380;
197 else if(y<0)
198 y=0;
199
200 break;
201 case WM_TIMER:
202 A:MyPaint(hdc);
203 break;
204 case WM_PAINT:
205 hdc = BeginPaint(hWnd, &ps);
206 // TODO: 在此添加任意绘图代码...
207 EndPaint(hWnd, &ps);
208 break;
209 case WM_DESTROY:
210 ClipCursor(NULL);//回复鼠标移动区域
211
212 DeleteDC(mdc);
213 DeleteDC(bufdc);
214 DeleteObject(bg);
215 DeleteObject(bullet);
216 DeleteObject(ship);
217 ReleaseDC(hWnd,hdc);
218
219 PostQuitMessage(0);
220 break;
221 default:
222 return DefWindowProc(hWnd, message, wParam, lParam);
223 }
224 return 0;
225 }
226
227 //1.设定飞机坐标并进行贴图
228 //2.设定所有子弹坐标并进行贴图
229 //3.显示真正的鼠标坐标所在的坐标
230 void MyPaint(HDC hdc){
231 char str[20]="";
232 int i;
233
234 //贴上背景图
235 SelectObject(bufdc,bg);
236 BitBlt(mdc,0,0,w,480,bufdc,640-w,0,SRCCOPY);
237 BitBlt(mdc,w,0,640-w,480,bufdc,0,0,SRCCOPY);
238
239
240 //飞机坐标向鼠标坐标位置靠近
241 if(nowX<x){
242 nowX+=10;
243 if(nowX>x)
244 nowX=x;
245 }else{
246 nowX-=10;
247 if(nowX<x)
248 nowX=x;
249 }
250
251 if(nowY<y){
252 nowY-=10;
253 if(nowY<y)
254 nowY=y;
255 }else{
256 nowY+=10;
257 if(nowY>y)
258 nowY=y;
259 }
260
261 //贴上飞机图
262 SelectObject(bufdc,ship);
263 BitBlt(mdc,nowX,nowY,100,74,bufdc,0,74,SRCAND);
264 BitBlt(mdc,nowX,nowY,100,74,bufdc,0,0,SRCPAINT);
265
266 SelectObject(bufdc,bullet);
267 if(bcount!=0){
268 for(i=0;i<30;i++){
269 if(b[i].exist){
270 //贴上子弹图
271 BitBlt(mdc,b[i].x,b[i].y,10,10,bufdc,0,10,SRCAND);
272 BitBlt(mdc,b[i].x,b[i].y,10,10,bufdc,0,0,SRCPAINT);
273
274 b[i].x-=10;
275 if(b[i].x<0){
276 bcount--;
277 b[i].exist=false;
278 }
279 }
280 }
281 }
282
283 //贴上小鸟
284 SelectObject(bufdc,bird);
285 for(i=0;i<3;i++){
286 if(rand()%3!=1){
287 if(p[i].y>nowY-16)
288 p[i].y-=5;
289 else
290 p[i].y+=5;
291
292 if(p[i].x>nowX-25)
293 p[i].x-=5;
294 else
295 p[i].x+=5;
296 }
297 if(p[i].x>nowX-25){ //判断小鸟移动方向
298 BitBlt(mdc,p[i].x,p[i].y,61,61,bufdc,61,61,SRCAND);
299 BitBlt(mdc,p[i].x,p[i].y,61,61,bufdc,0,61,SRCPAINT);
300 }else{
301 BitBlt(mdc,p[i].x,p[i].y,61,61,bufdc,61,0,SRCAND);
302 BitBlt(mdc,p[i].x,p[i].y,61,61,bufdc,0,0,SRCPAINT);
303 }
304 }
305
306 //显示鼠标坐标
307 sprintf(str,"x坐标: %d ",x);
308 TextOutA(mdc,0,0,str,strlen(str));
309 sprintf(str,"y坐标: %d ",y);
310 TextOutA(mdc,0,20,str,strlen(str));
311
312 BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY);
313
314 w+=10;
315 if(w==640)
316 w=0;
317 }
时间: 2024-11-02 23:23:45