C++飞机大战

  1 #include<windows.h>
  2 #include"resource.h"
  3 #include<stdlib.h>
  4 #include<time.h>
  5 #include<stdio.h>
  6
  7 #define TIMER_DIREN 101      //定义定时器
  8 #define TIMER_DIRENMOVE 102
  9 #define TIMER_ZIDAN 103
 10 #define TIMER_DIRENRELEASE 104
 11
 12 typedef struct Node    //敌人,自己,子弹结构体
 13 {
 14   int x;
 15   int y;
 16   struct Node *pnext;
 17 }DiRen,FeiJi,ZiDan;
 18 void ZaoDiRen();                //造敌人
 19 void ShowDiRen(DiRen *pHead,HWND hWnd);     //显示敌人
 20 void ZaoZiDan();                //造子弹
 21 void ShowZiDan(ZiDan *pHead,HWND hWnd);     //显示子弹
 22 void DiRenMove(DiRen *pHead);          //敌人移动
 23 void ZiDanMove(DiRen *pHead);          //子弹移动
 24 void shoot(HWND hWnd,FeiJi *ziji,DiRen **diren,ZiDan **zidan);//判断是否射中
 25 void ReleaseDiren(DiRen **pHead);        //释放出去的敌人
 26 void ReleaseZidan(ZiDan **pHead);        //释放出去的子弹
 27 void ZaoZiJi(HWND hWnd);            //造自己
 28 LRESULT CALLBACK pp(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam);//回调函数
 29 int __stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
 30 {
 31   WNDCLASSEX wc;
 32   HWND hWnd;
 33   MSG msg;
 34   wc.hInstance=hInstance;
 35   wc.cbClsExtra=0;
 36   wc.cbSize=sizeof(WNDCLASSEX);
 37   wc.cbWndExtra=0;
 38   wc.hIcon=NULL ;
 39   wc.hCursor=NULL ;
 40   wc.hIconSm=NULL;
 41   wc.lpfnWndProc=pp;
 42   wc.lpszClassName="hello";
 43   wc.lpszMenuName=NULL;
 44   wc.style=CS_HREDRAW|CS_VREDRAW | CS_OWNDC ;
 45   wc.hbrBackground=(HBRUSH)5;
 46   RegisterClassEx(&wc);
 47   hWnd=CreateWindow("hello","world", WS_OVERLAPPEDWINDOW,100,100,600,600,NULL,NULL,hInstance,NULL);
 48   ShowWindow(hWnd,nCmdShow);
 49   while(GetMessage(&msg,NULL,0,0))
 50   {
 51     TranslateMessage(&msg);
 52     DispatchMessage(&msg);
 53   }
 54   return 0;
 55 }
 56 DiRen *pDiRen=NULL;  //敌人
 57 ZiDan *pZiDan=NULL;  //子弹
 58 FeiJi *pZiJi=NULL;   //自己
 59 static int score=0;   //分数
 60 static char sco[20];  //装分数的字符窜
 61 LRESULT CALLBACK pp(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
 62 {
 63   int i=1,  //位
 64     jscore;
 65   HDC hdc;
 66   HDC memdc;
 67   HBITMAP hbm;
 68   BITMAP bminfo;
 69   switch(msg)
 70   {
 71   case WM_TIMER:   //定时器
 72     hdc=GetDC(hWnd); //得到设备句柄
 73     hbm=LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_BITMAP4));//载入背景位图
 74     GetObject(hbm, sizeof(bminfo), &bminfo);
 75     memdc=CreateCompatibleDC(hdc);
 76     SelectObject(memdc,hbm);
 77     BitBlt(hdc,0,0,600,600,memdc,0,0,SRCCOPY);
 78     /*itoa(score,sco,10);*/
 79     sprintf(sco,"%d",score);  //将分数装入字符窜
 80     jscore=score;
 81     while((jscore=jscore/10)>0) //判断分数有几位
 82       i++;
 83     TextOut(hdc,0,0,"分数",4);
 84     TextOut(hdc,30,0,sco,i); //显示分数
 85     DeleteDC(memdc);
 86     ReleaseDC(hWnd,hdc);  //释放句柄
 87     DeleteObject(hbm);
 88     ZaoZiJi(hWnd);     //造自己
 89     if(TIMER_ZIDAN==wParam)  //定时器101
 90     {
 91       ZiDanMove(pZiDan);   //子弹移动
 92       ReleaseZidan(&pZiDan); //释放出屏幕的子弹
 93     }
 94     else if( TIMER_DIREN==wParam) //定时器102
 95     {
 96       ZaoDiRen();       //造敌人
 97     }
 98     else if(TIMER_DIRENRELEASE==wParam)  //定时器103
 99     {
100       ReleaseDiren(&pDiRen);  //释放出屏幕的敌人
101     }
102     ShowDiRen(pDiRen,hWnd);       //显示敌人
103     DiRenMove(pDiRen);       //敌人移动
104     ShowZiDan(pZiDan,hWnd);     //显示子弹
105     shoot(hWnd,pZiJi,&pDiRen,&pZiDan);   //是否射中
106     break;
107   case WM_CLOSE:    //关闭
108     PostQuitMessage(0);
109     break;
110   case WM_KEYDOWN:    //判断按键
111     switch(wParam)
112     {
113     case VK_LEFT:   //左移
114       if(pZiJi->x>0)
115         pZiJi->x-=20;
116       break;
117     case VK_RIGHT:  //右移
118       if(pZiJi->x<530)
119       pZiJi->x+=20;
120       break;
121     case VK_UP:   //上移
122       if(pZiJi->y>0)
123       pZiJi->y-=20;
124       break;
125     case VK_DOWN:  //下移
126       if(pZiJi->y<520)
127       pZiJi->y+=20;
128       break;
129     case VK_SPACE:  //空格发射子弹
130       ZaoZiDan();
131       break;
132     }
133     break;
134   case WM_CREATE:   //创建
135     srand(time(NULL));
136     pZiJi=(struct Node*)malloc(sizeof(struct Node));
137     pZiJi->x=200;     //自己的x
138     pZiJi->y=500;     //自己的y
139     SetTimer(hWnd,TIMER_DIREN,1000,NULL);  //设置定时器
140     SetTimer(hWnd,TIMER_DIRENMOVE,200,NULL);
141     SetTimer(hWnd,TIMER_ZIDAN,100,NULL);
142     SetTimer(hWnd,TIMER_DIRENRELEASE,300,NULL);
143     break;
144   }
145   return DefWindowProc(hWnd,msg,wParam,lParam);
146 }
147
148
149 void ZaoDiRen()  //造子弹
150 {
151   DiRen *u;
152   u=(struct Node*)malloc(sizeof(struct Node));
153   u->x=rand()%550;   //子弹的x随机出现
154   u->y=-10;      //出现的纵坐标固定
155   u->pnext=NULL;
156   if(NULL==pDiRen)
157   {
158     pDiRen=u;
159   }
160   else
161   {
162     u->pnext=pDiRen;   //将新产生的链表放在头
163     pDiRen=u;
164
165   }
166 }
167 void ShowDiRen(struct Node *pHead,HWND hWnd)  //显示敌人
168 {
169   HDC hdc;
170   HDC memdc;
171   HBITMAP hbm;
172   BITMAP bminfo;
173   hdc=GetDC(hWnd);
174   hbm=LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_BITMAP1));//载入敌人位图
175   GetObject(hbm, sizeof(bminfo), &bminfo);
176   memdc=CreateCompatibleDC(hdc);
177   SelectObject(memdc,hbm);
178   while(pHead!=NULL) //敌人链表不为空,显示敌机
179   {
180     BitBlt(hdc,pHead->x,pHead->y,40,40,memdc,0,0,SRCCOPY);
181     pHead=pHead->pnext;
182   }
183   DeleteDC(memdc);
184   ReleaseDC(hWnd,hdc);
185   DeleteObject(hbm);
186 }
187 void ZaoZiJi(HWND hWnd)
188 {
189   HDC hdc;
190   HDC memdc;
191   HBITMAP hbm;
192   BITMAP bminfo;
193   hdc=GetDC(hWnd);
194   hbm=LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_BITMAP3));//载入自己的位图
195   GetObject(hbm, sizeof(bminfo), &bminfo);
196   memdc=CreateCompatibleDC(hdc);
197   SelectObject(memdc,hbm);
198   BitBlt(hdc,pZiJi->x,pZiJi->y,40,40,memdc,0,0,SRCCOPY); //显示自己
199   DeleteDC(memdc);
200   ReleaseDC(hWnd,hdc);
201   DeleteObject(hbm);
202 }
203 void ZaoZiDan()   //造子弹
204 {
205   ZiDan *u;
206   u=(ZiDan*)malloc(sizeof(ZiDan));
207   u->x=pZiJi->x+15;
208   u->y=pZiJi->y+10;
209   u->pnext=NULL;
210   if(pZiDan==NULL)
211   {
212     pZiDan=u;
213   }
214   else
215   {
216     u->pnext=pZiDan;  //将子弹放在链表头
217     pZiDan=u;
218   }
219 }
220 void ShowZiDan(ZiDan *pHead,HWND hWnd) //显示子弹
221 {
222   HDC hdc;
223   HDC memdc;
224   HBITMAP hbm;
225   BITMAP bminfo;
226   hdc=GetDC(hWnd);
227   hbm=LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_BITMAP2)); //插入子弹位图
228   GetObject(hbm, sizeof(bminfo), &bminfo);
229   memdc=CreateCompatibleDC(hdc);
230   SelectObject(memdc,hbm);
231   while(pHead!=NULL)  //子弹链表不为空,显示子弹
232   {
233     /*Ellipse(hdc,pHead->x,pHead->y,pHead->x+5,pHead->y+5);*/
234     BitBlt(hdc,pHead->x,pHead->y,10,10,memdc,0,0,SRCCOPY);
235     pHead=pHead->pnext;
236   }
237   DeleteDC(memdc);
238   ReleaseDC(hWnd,hdc);
239   DeleteObject(hbm);
240 }
241
242 void DiRenMove(DiRen *pHead)  //敌人移动
243 {
244   while(pHead!=NULL)  //链表不为空,敌人移动
245   {
246     if(score<500)
247     {
248       pHead->y+=10;
249       pHead=pHead->pnext;
250     }
251     else
252     {
253       pHead->y+=20;
254       pHead=pHead->pnext;
255     }
256   }
257 }
258 void ZiDanMove(DiRen *pHead)  //子弹移动
259 {
260   while(pHead!=NULL)  //链表不为空子弹移动
261   {
262     pHead->y-=20;
263     pHead=pHead->pnext;
264   }
265 }
266
267 void shoot(HWND hWnd,FeiJi *ziji,DiRen **diren,ZiDan **zidan) //判断是否中
268 {
269   DiRen *js1=*diren;
270   ZiDan *js2=*zidan;
271   int n = 1;
272   while(js1!=NULL) //判断自己是否撞机
273   {
274     //撞击释放定时器游戏结束
275     if((ziji->x-js1->x<30&&ziji->x-js1->x>-38)&&(ziji->y-js1->y<25&&ziji->y-js1->y>-38))
276     {
277       KillTimer(hWnd,TIMER_DIREN);
278       KillTimer(hWnd,TIMER_ZIDAN);
279       KillTimer(hWnd,TIMER_DIRENMOVE);
280       KillTimer(hWnd,TIMER_DIRENRELEASE);
281       MessageBox(hWnd,"You Lose","窗口",MB_OK);
282       PostQuitMessage(0);
283       break;
284     }
285     else
286       js1=js1->pnext;  //没有判断下一个敌机
287   }
288   js1=*diren;  //敌机回到头
289   while((js1=*diren)!=NULL)  //判断敌人是否为空
290   {
291     zidan = &pZiDan;
292     n = 0;
293     while((js2=*zidan)!=NULL) //判断子弹是否为空
294     {
295       //敌机中弹
296       if((js2->x - js1->x <= 40&&js2->x - js1->x>=-5)&&(js2->y - js1->y <= 40&&js2->y - js1->y>=-8))
297       {
298         score+=100;
299         n = 1;
300         *zidan = js2->pnext;
301         if(js1->pnext!=NULL) //链表下节不为空,指向下一个释放中弹的飞机子弹
302         {
303           *diren = js1->pnext;
304           diren = &pDiRen;
305           free(js1);
306           free(js2);
307         }
308         else
309           *diren = NULL;
310         break;
311       }
312       else
313       {
314         zidan = &js2->pnext;  //没中看下一个
315       }
316     }
317     if(n != 1)  //判断是否是中弹出来的
318     {
319       diren = &js1->pnext;
320     }
321   }
322 }
323 void ReleaseDiren(DiRen **pHead) //释放飞出屏幕的敌人
324 {
325   DiRen *js=*pHead;
326   while((js=*pHead)!=NULL)
327   {
328     if(js->y>600)    //飞出屏幕释放
329     {
330       *pHead=js->pnext;
331       free(js);
332     }
333     else
334     {
335       pHead = &js->pnext;  //看下一个
336     }
337   }
338 }
339 void ReleaseZidan(ZiDan **pHead)  //释放子弹
340 {
341   ZiDan *js=*pHead;
342   while((js=*pHead)!=NULL)
343   {
344     if(js->y<0)    //飞出的子弹释放
345     {
346       *pHead=js->pnext;
347       free(js);
348     }
349     else
350       pHead=&js->pnext;  //没飞出看下一个
351   }
352 }

rs:

//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by 打飞机.rc
//
#define IDB_BITMAP1                     101
#define IDB_BITMAP2                     102
#define IDB_BITMAP3                     103
#define IDB_BITMAP4                     104
#define IDB_BITMAP5                     105
#define IDB_BITMAP6                     108
#define IDB_BITMAP7                     109

// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        110
#define _APS_NEXT_COMMAND_VALUE         40001
#define _APS_NEXT_CONTROL_VALUE         1001
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif
时间: 2025-01-02 09:06:58

C++飞机大战的相关文章

基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(下)

在飞机大战游戏开发中遇到的问题和解决方法: 1.在添加菜单时,我要添加一个有背景的菜单,需要在菜单pMenu中添加一个图片精灵,结果编译过了但是运行出错,如下图: 查了很多资料,调试了很长时间,整个人都要崩溃了. 最后发现引擎中CCMenu::itemForTouch函数中有遍历子节点的行为,但是循环中没有判断子节点类型是否为CCMenuItem.如图:码,这样一来,加入到pMenu中的图片精灵被当作菜单项取了出来使用,导致报错.老版本的果然又不完善的地方,整个人都不好了...果断修改引擎里的源

安卓飞机大战(二) SurfaceView实现自制背景

用SurfaceView写一个自制的背景图,并且可以移动,加上安卓飞机大战(一)中的BackgroundManager类,可以直接使用 GameView代码: public class GameView extends SurfaceView implements SurfaceHolder.Callback,Runnable{    private SurfaceHolder hd=null;    private Canvas canvas=null;    private Backgrou

android:“新版飞机大战”源代码开源啦!

今天10.24,为了纪念程序员的节日,把之前写过的一个"飞机大战"的一个源代码开源了. 源代码地址:https://github.com/nuptboyzhb/newplanegame 豌豆荚Demo:http://www.wandoujia.com/apps/edu.njupt.zhb.planegame 截图: ------------------------------------------------------------------- 更多交流,Android开发联盟QQ

android:如何用一天时间,写出“飞机大战”这样的游戏!(无框架-SurfaceView绘制)

序言作为一个android开发者,时常想开发一个小游戏娱乐一下大家,今天就说说,我是怎么样一天写出一个简单的"飞机大战"的.体验地址:http://www.wandoujia.com/apps/edu.njupt.zhb.planegame游戏分析玩过"飞机大战"游戏的都知道,飞机大战中的主要"角色"有:1.玩家飞机2.敌方飞机3.玩家飞机发送的子弹4.敌方Boss飞机发送的子弹我们需要控制的有:1.绘制屏幕内的角色2.控制角色的逻辑,比如:敌方

js实例--飞机大战

<!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>飞机大战</title> <style> #did{ width:500px;height:500px; background:url("./images/bg2.png") no-repeat 0px -1036px; position:relative;ove

java之线程飞机大战制作

import java.awt.Graphics; import java.util.ArrayList; import javax.swing.JFrame; import javax.swing.JPanel; public class PlaneMain extends JPanel { public static void main(String[] args) { new PlaneMain(); } private ArrayList<View> list; public Plan

飞机大战

这几天都在做飞机大战的小游戏,巩固了一些基础知识,还更加熟练地运用了面向对象的一些东西.之前的一些难点,也在这几天中得到了解决. 还学会了一个新知识: function sortNumber(a,b) { return b - a}key = key.sort(sortNumber);将数据从大到小排列.

cocos2dx 3.0 飞机大战

因为课程须要.然后又水平有限.所以写了个飞机大战.加上不会画画.所以图片资源也是从微信apk解压出来的,设计思路參考的偶尔e网事. 闲话不说.先讲一下设计.大体上一共分为3个场景.场景以下是Layer 開始场景:WelcomeScene -->WelcomeLayer  类似欢迎界面 游戏主场景:GameScene  --> GameLayer  游戏元素加入 和 碰撞检測 结束场景:GameOverScene -->GameOverLayer 然后是游戏的元素,在GameLayer加入

基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(中)

接<基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(上)> 三.代码分析 1.界面初始化 1 bool PlaneWarGame::init() 2 { 3 bool bRet = false; 4 do 5 { 6 CC_BREAK_IF(! CCLayer::init()); 7 8 _size = CCDirector::sharedDirector()->getWinSize(); 9 10 // 设置触摸可用 11 this->setIsTouchEnabled

基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(上)

最近接触过几个版本的cocos2dx,决定每个大变动的版本都尝试一下.本实例模仿微信5.0版本中的飞机大战游戏,如图: 一.工具 1.素材:飞机大战的素材(图片.声音等)来自于网络 2.引擎:cocos2d-1.0.1-x-0.9.2 3.环境:vs2010 二.使用的类 1.游戏菜单界面类:PlaneWarMenu——派生自CCLayer类. 1 // 游戏菜单界面类 2 class PlaneWarMenu: public CCLayer 3 { 4 public: 5 virtual bo