C++编写简易的飞机大战
初学C/C++的小伙伴可以用做这个小游戏来熟悉一下编程的乐趣。
#include<windows.h> #include"resource.h" #include<stdlib.h> #include<time.h> #include<stdio.h> #defineTIMER_DIREN101//定义定时器 #defineTIMER_DIRENMOVE102 #defineTIMER_ZIDAN103 #defineTIMER_DIRENRELEASE104 typedefstructNode//敌人,自己,子弹结构体 { intx; inty; structNode*pnext; }DiRen,FeiJi,ZiDan; voidZaoDiRen();//造敌人 voidShowDiRen(DiRen*pHead,HWNDhWnd);//显示敌人 voidZaoZiDan();//造子弹 voidShowZiDan(ZiDan*pHead,HWNDhWnd);//显示子弹 voidDiRenMove(DiRen*pHead);//敌人移动 voidZiDanMove(DiRen*pHead);//子弹移动 voidshoot(HWNDhWnd,FeiJi*ziji,DiRen**diren,ZiDan**zidan);//判断是否射中 voidReleaseDiren(DiRen**pHead);//释放出去的敌人 voidReleaseZidan(ZiDan**pHead);//释放出去的子弹 voidZaoZiJi(HWNDhWnd);//造自己 LRESULTCALLBACKpp(HWNDhWnd,UINTmsg,WPARAMwParam,LPARAMlParam);//回调函数 int__stdcallWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow) { WNDCLASSEXwc; HWNDhWnd; MSGmsg; wc.hInstance=hInstance; wc.cbClsExtra=0; wc.cbSize=sizeof(WNDCLASSEX); wc.cbWndExtra=0; wc.hIcon=NULL; wc.hCursor=NULL; wc.hIconSm=NULL; wc.lpfnWndProc=pp; wc.lpszClassName="hello"; wc.lpszMenuName=NULL; wc.style=CS_HREDRAW|CS_VREDRAW|CS_OWNDC; wc.hbrBackground=(HBRUSH)5; RegisterClassEx(&wc); hWnd=CreateWindow("hello","world",WS_OVERLAPPEDWINDOW,100,100,600,600,NULL,NULL,hInstance,NULL); ShowWindow(hWnd,nCmdShow); while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return0; } DiRen*pDiRen=NULL;//敌人 ZiDan*pZiDan=NULL;//子弹 FeiJi*pZiJi=NULL;//自己 staticintscore=0;//分数 staticcharsco[20];//装分数的字符窜 LRESULTCALLBACKpp(HWNDhWnd,UINTmsg,WPARAMwParam,LPARAMlParam) { inti=1,//位 jscore; HDChdc; HDCmemdc; HBITMAPhbm; BITMAPbminfo; switch(msg) { caseWM_TIMER://定时器 hdc=GetDC(hWnd);//得到设备句柄 hbm=LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_BITMAP4));//载入背景位图 GetObject(hbm,sizeof(bminfo),&bminfo); memdc=CreateCompatibleDC(hdc); SelectObject(memdc,hbm); BitBlt(hdc,0,0,600,600,memdc,0,0,SRCCOPY); /*itoa(score,sco,10);*/ sprintf(sco,"%d",score);//将分数装入字符窜 jscore=score; while((jscore=jscore/10)>0)//判断分数有几位 i++; TextOut(hdc,0,0,"分数",4); TextOut(hdc,30,0,sco,i);//显示分数 DeleteDC(memdc); ReleaseDC(hWnd,hdc);//释放句柄 DeleteObject(hbm); ZaoZiJi(hWnd);//造自己 if(TIMER_ZIDAN==wParam)//定时器101 { ZiDanMove(pZiDan);//子弹移动 ReleaseZidan(&pZiDan);//释放出屏幕的子弹 } elseif(TIMER_DIREN==wParam)//定时器102 { ZaoDiRen();//造敌人 } elseif(TIMER_DIRENRELEASE==wParam)//定时器103 { ReleaseDiren(&pDiRen);//释放出屏幕的敌人 } ShowDiRen(pDiRen,hWnd);//显示敌人 DiRenMove(pDiRen);//敌人移动 ShowZiDan(pZiDan,hWnd);//显示子弹 shoot(hWnd,pZiJi,&pDiRen,&pZiDan);//是否射中 break; caseWM_CLOSE://关闭 PostQuitMessage(0); break; caseWM_KEYDOWN://判断按键 switch(wParam) { caseVK_LEFT://左移 if(pZiJi->x>0) pZiJi->x-=20; break; caseVK_RIGHT://右移 if(pZiJi->x<530) pZiJi->x+=20; break; caseVK_UP://上移 if(pZiJi->y>0) pZiJi->y-=20; break; caseVK_DOWN://下移 if(pZiJi->y<520) pZiJi->y+=20; break; caseVK_SPACE://空格发射子弹 ZaoZiDan(); break; } break; caseWM_CREATE://创建 srand(time(NULL)); pZiJi=(structNode*)malloc(sizeof(structNode)); pZiJi->x=200;//自己的x pZiJi->y=500;//自己的y SetTimer(hWnd,TIMER_DIREN,1000,NULL);//设置定时器 SetTimer(hWnd,TIMER_DIRENMOVE,200,NULL); SetTimer(hWnd,TIMER_ZIDAN,100,NULL); SetTimer(hWnd,TIMER_DIRENRELEASE,300,NULL); break; } returnDefWindowProc(hWnd,msg,wParam,lParam); } voidZaoDiRen()//造子弹 { DiRen*u; u=(structNode*)malloc(sizeof(structNode)); u->x=rand()%550;//子弹的x随机出现 u->y=-10;//出现的纵坐标固定 u->pnext=NULL; if(NULL==pDiRen) { pDiRen=u; } else { u->pnext=pDiRen;//将新产生的链表放在头 pDiRen=u; } } voidShowDiRen(structNode*pHead,HWNDhWnd)//显示敌人 { HDChdc; HDCmemdc; HBITMAPhbm; BITMAPbminfo; hdc=GetDC(hWnd); hbm=LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_BITMAP1));//载入敌人位图 GetObject(hbm,sizeof(bminfo),&bminfo); memdc=CreateCompatibleDC(hdc); SelectObject(memdc,hbm); while(pHead!=NULL)//敌人链表不为空,显示敌机 { BitBlt(hdc,pHead->x,pHead->y,40,40,memdc,0,0,SRCCOPY); pHead=pHead->pnext; } DeleteDC(memdc); ReleaseDC(hWnd,hdc); DeleteObject(hbm); } voidZaoZiJi(HWNDhWnd) { HDChdc; HDCmemdc; HBITMAPhbm; BITMAPbminfo; hdc=GetDC(hWnd); hbm=LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_BITMAP3));//载入自己的位图 GetObject(hbm,sizeof(bminfo),&bminfo); memdc=CreateCompatibleDC(hdc); SelectObject(memdc,hbm); BitBlt(hdc,pZiJi->x,pZiJi->y,40,40,memdc,0,0,SRCCOPY);//显示自己 DeleteDC(memdc); ReleaseDC(hWnd,hdc); DeleteObject(hbm); } voidZaoZiDan()//造子弹 { ZiDan*u; u=(ZiDan*)malloc(sizeof(ZiDan)); u->x=pZiJi->x+15; u->y=pZiJi->y+10; u->pnext=NULL; if(pZiDan==NULL) { pZiDan=u; } else { u->pnext=pZiDan;//将子弹放在链表头 pZiDan=u; } } voidShowZiDan(ZiDan*pHead,HWNDhWnd)//显示子弹 { HDChdc; HDCmemdc; HBITMAPhbm; BITMAPbminfo; hdc=GetDC(hWnd); hbm=LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_BITMAP2));//插入子弹位图 GetObject(hbm,sizeof(bminfo),&bminfo); memdc=CreateCompatibleDC(hdc); SelectObject(memdc,hbm); while(pHead!=NULL)//子弹链表不为空,显示子弹 { /*Ellipse(hdc,pHead->x,pHead->y,pHead->x+5,pHead->y+5);*/ BitBlt(hdc,pHead->x,pHead->y,10,10,memdc,0,0,SRCCOPY); pHead=pHead->pnext; } DeleteDC(memdc); ReleaseDC(hWnd,hdc); DeleteObject(hbm); } voidDiRenMove(DiRen*pHead)//敌人移动 { while(pHead!=NULL)//链表不为空,敌人移动 { if(score<500) { pHead->y+=10; pHead=pHead->pnext; } else { pHead->y+=20; pHead=pHead->pnext; } } } voidZiDanMove(DiRen*pHead)//子弹移动 { while(pHead!=NULL)//链表不为空子弹移动 { pHead->y-=20; pHead=pHead->pnext; } } voidshoot(HWNDhWnd,FeiJi*ziji,DiRen**diren,ZiDan**zidan)//判断是否中 { DiRen*js1=*diren; ZiDan*js2=*zidan; intn=1; while(js1!=NULL)//判断自己是否撞机 { //撞击释放定时器游戏结束 if((ziji->x-js1->x<30&&ziji->x-js1->x>-38)&&(ziji->y-js1->y<25&&ziji->y-js1->y>-38)) { KillTimer(hWnd,TIMER_DIREN); KillTimer(hWnd,TIMER_ZIDAN); KillTimer(hWnd,TIMER_DIRENMOVE); KillTimer(hWnd,TIMER_DIRENRELEASE); MessageBox(hWnd,"YouLose","窗口",MB_OK); PostQuitMessage(0); break; } else js1=js1->pnext;//没有判断下一个敌机 } js1=*diren;//敌机回到头 while((js1=*diren)!=NULL)//判断敌人是否为空 { zidan=&pZiDan; n=0; while((js2=*zidan)!=NULL)//判断子弹是否为空 { //敌机中弹 if((js2->x-js1->x<=40&&js2->x-js1->x>=-5)&&(js2->y-js1->y<=40&&js2->y-js1->y>=-8)) { score+=100; n=1; *zidan=js2->pnext; if(js1->pnext!=NULL)//链表下节不为空,指向下一个释放中弹的飞机子弹 { *diren=js1->pnext; diren=&pDiRen; free(js1); free(js2); } else *diren=NULL; break; } else { zidan=&js2->pnext;//没中看下一个 } } if(n!=1)//判断是否是中弹出来的 { diren=&js1->pnext; } } } voidReleaseDiren(DiRen**pHead)//释放飞出屏幕的敌人 { DiRen*js=*pHead; while((js=*pHead)!=NULL) { if(js->y>600)//飞出屏幕释放 { *pHead=js->pnext; free(js); } else { pHead=&js->pnext;//看下一个 } } } voidReleaseZidan(ZiDan**pHead)//释放子弹 { ZiDan*js=*pHead; while((js=*pHead)!=NULL) { if(js->y<0)//飞出的子弹释放 { *pHead=js->pnext; free(js); } else pHead=&js->pnext;//没飞出看下一个 } }
同时分享一个网友的方法
//mytestView.cpp:Cmytest; //; #include"stdafx.h; #include"mytest.h; #include"mytestDoc; #include"mytestView; #ifdef_DEBUG; #definenewDEBUG_NEW; #endif;//CmytestVie //mytestView.cpp:CmytestView类的实现 // #include"stdafx.h" #include"mytest.h" #include"mytestDoc.h" #include"mytestView.h" #ifdef_DEBUG #definenewDEBUG_NEW #endif //CmytestView IMPLEMENT_DYNCREATE(CmytestView,CView) BEGIN_MESSAGE_MAP(CmytestView,CView) ON_WM_CREATE() ON_WM_TIMER() ON_WM_KEYDOWN() END_MESSAGE_MAP() //CmytestView构造/析构 CmytestView::CmytestView() { //TODO:在此处添加构造代码 m_x_me=0; m_x_enemy=0; m_y_enemyone=0; m_y_enemytwo=0; m_y_bomb=0; m_x_bomb=0; m_x_ball=0; m_y_ball=0; m_x_explsion=0; } CmytestView::~CmytestView() { } BOOLCmytestView::PreCreateWindow(CREATESTRUCT&cs) { //TODO:在此处通过修改 //CREATESTRUCTcs来修改窗口类或样式 returnCView::PreCreateWindow(cs); } //CmytestView绘制 voidCmytestView::OnDraw(CDC*pDC) { CmytestDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); if(!pDoc) return; //TODO:在此处为本机数据添加绘制代码 /*CBitmapbitmap; bitmap.LoadBitmapW(IDB_ME); */ //画图 /*pDC->BitBlt(100,50,50,60,&MemDC,0,0,SRCCOPY);*/ /*POINTpt; pt.x=200; pt.y=200; CImageListimageList; imageList.Create(50,60,ILC_COLOR24|ILC_MASK,1,0); imageList.Add(&bitmap,RGB(0,0,0)); imageList.Draw(pDC,0,pt,ILD_TRANSPARENT); CDCMemDC; MemDC.CreateCompatibleDC(NULL); MemDC.SelectObject(&bitmap);*/ //RECTrc; //GetClientRect(&rc); //CBrushbrush; //brush.CreateSolidBrush(RGB(3,108,254)); //pDC->SelectObject(&brush); //CBrush*oldbrush=pDC->SelectObject(&brush); //pDC->Rectangle(&rc); //pDC->SelectObject(oldbrush); //CBitmapbitmap; //bitmap.LoadBitmapW(IDB_ME); //POINTpt; //pt.x=200; //pt.y=200; //CImageListimageList; //imageList.Create(60,50,ILC_COLOR24|ILC_MASK,1,0); //imageList.Add(&bitmap,RGB(0,0,0)); //imageList.Draw(pDC,0,pt,ILD_TRANSPARENT); //CDCMemDC; //MemDC.CreateCompatibleDC(NULL); //MemDC.SelectObject(&bitmap); //刷新 RECTrc; GetClientRect(&rc); CBrushbrush; brush.CreateSolidBrush(RGB(3,108,254)); pDC->SelectObject(&brush); CBrush*oldbrush=pDC->SelectObject(&brush); pDC->Rectangle(&rc); pDC->SelectObject(oldbrush); //敌机 CBitmapbitmap1; bitmap1.LoadBitmapW(IDB_enemy); POINTpt1; pt1.x=200; pt1.y=m_y_enemyone; POINTpt1_2; pt1_2.x=300; pt1_2.y=m_y_enemytwo; CImageListimageList1; imageList1.Create(35,35,ILC_COLOR24|ILC_MASK,1,0); imageList1.Add(&bitmap1,RGB(0,0,0)); imageList1.Draw(pDC,0,pt1,ILD_TRANSPARENT); imageList1.Draw(pDC,1,pt1_2,ILD_TRANSPARENT); //战机 CBitmapbitmap2; bitmap2.LoadBitmapW(IDB_ME); POINTpt2; pt2.x=m_x_me; pt2.y=100; CImageListimageList2; imageList2.Create(50,60,ILC_COLOR24|ILC_MASK,1,0); imageList2.Add(&bitmap2,RGB(0,0,0)); imageList2.Draw(pDC,0,pt2,ILD_TRANSPARENT); //子弹 CBitmapbitmap3; bitmap3.LoadBitmapW(IDB_ball); POINTpt3; pt3.x=150; pt3.y=m_y_ball; CImageListimageList3; imageList3.Create(8,8,ILC_COLOR24|ILC_MASK,1,0); imageList3.Add(&bitmap3,RGB(0,0,0)); imageList3.Draw(pDC,0,pt3,ILD_TRANSPARENT); //炸弹 CBitmapbitmap4; bitmap4.LoadBitmapW(IDB_bomb); POINTpt4; pt4.x=m_x_bomb; pt4.y=250; CImageListimageList4; imageList4.Create(10,20,ILC_COLOR24|ILC_MASK,1,0); imageList4.Add(&bitmap4,RGB(0,0,0)); imageList4.Draw(pDC,0,pt4,ILD_TRANSPARENT); //爆炸 CBitmapbitmap5; bitmap5.LoadBitmapW(IDB_explsion); POINTpt5_1; pt5_1.x=310; pt5_1.y=310; POINTpt5_2; pt5_2.x=330; pt5_2.y=330; POINTpt5_3; pt5_3.x=350; pt5_3.y=450; POINTpt5_4; pt5_4.x=470; pt5_4.y=470; POINTpt5_5; pt5_5.x=510; pt5_5.y=510; POINTpt5_6; pt5_6.x=530; pt5_6.y=530; POINTpt5_7; pt5_7.x=540; pt5_7.y=540; POINTpt5_8; pt5_8.x=450; pt5_8.y=250; CImageListimageList5; imageList5.Create(66,66,ILC_COLOR24|ILC_MASK,1,0); imageList5.Add(&bitmap5,RGB(0,0,0)); imageList5.Draw(pDC,0,pt5_1,ILD_TRANSPARENT); imageList5.Draw(pDC,1,pt5_2,ILD_TRANSPARENT); imageList5.Draw(pDC,2,pt5_3,ILD_TRANSPARENT); imageList5.Draw(pDC,3,pt5_4,ILD_TRANSPARENT); imageList5.Draw(pDC,4,pt5_5,ILD_TRANSPARENT); imageList5.Draw(pDC,5,pt5_6,ILD_TRANSPARENT); imageList5.Draw(pDC,6,pt5_7,ILD_TRANSPARENT); imageList5.Draw(pDC,7,pt5_8,ILD_TRANSPARENT); /*CDCMemDC; MemDC.CreateCompatibleDC(NULL); MemDC.SelectObject(&bitmap2);*/ } //CmytestView诊断 #ifdef_DEBUG voidCmytestView::AssertValid()const { CView::AssertValid(); } voidCmytestView::Dump(CDumpContext&dc)const { CView::Dump(dc); } CmytestDoc*CmytestView::GetDocument()const//非调试版本是内联的{ ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CmytestDoc)));return(CmytestDoc*)m_pDocument; } #endif//_DEBUG //CmytestView消息处理程序 intCmytestView::OnCreate(LPCREATESTRUCTlpCreateStruct) { if(CView::OnCreate(lpCreateStruct)==-1) return-1; //TODO:在此添加您专用的创建代码 SetTimer(1,30,NULL); return0; } voidCmytestView::OnTimer(UINT_PTRnIDEvent) { //TODO:在此添加消息处理程序代码和/或调用默认值 CView::OnTimer(nIDEvent); CDC*pDC=GetDC(); //刷新背景 RECTrc; GetClientRect(&rc); CBrushbrush; brush.CreateSolidBrush(RGB(3,108,254)); pDC->SelectObject(&brush); CBrush*oldbrush=pDC->SelectObject(&brush); pDC->Rectangle(&rc); pDC->SelectObject(oldbrush); //战机 CBitmapbitmap2; bitmap2.LoadBitmapW(IDB_ME); POINTpt2; pt2.x=m_x_me; pt2.y=100; CImageListimageList2; imageList2.Create(50,60,ILC_COLOR24|ILC_MASK,1,0); imageList2.Add(&bitmap2,RGB(0,0,0)); imageList2.Draw(pDC,0,pt2,ILD_TRANSPARENT); //子弹
欢迎试玩一下游戏方向键:w,a,s,d 控制键:J,K