详解C++编程简易飞机战
来源:爱站网时间:2020-11-02编辑:网友分享
说到C++语言,相信大家都比较熟悉,但是真的要运用到项目开发中,除了经验之外,还要有很好的洞察能力,这是程序员的必备素养之一,今天爱站技术频道小编就为大家带来了详解C++编程简易飞机战,一起来了解一下吧!
说到C++语言,相信大家都比较熟悉,但是真的要运用到项目开发中,除了经验之外,还要有很好的洞察能力,这是程序员的必备素养之一,今天爱站技术频道小编就为大家带来了详解C++编程简易飞机战,一起来了解一下吧!
初学C/C++的小伙伴可以用做这个小游戏来熟悉一下编程的乐趣。
#include#include"resource.h" #include #include #include #define TIMER_DIREN 101 //定义定时器 #define TIMER_DIRENMOVE 102 #define TIMER_ZIDAN 103 #define TIMER_DIRENRELEASE 104 typedef struct Node //敌人,自己,子弹结构体 { int x; int y; struct Node *pnext; }DiRen,FeiJi,ZiDan; void ZaoDiRen(); //造敌人 void ShowDiRen(DiRen *pHead,HWND hWnd); //显示敌人 void ZaoZiDan(); //造子弹 void ShowZiDan(ZiDan *pHead,HWND hWnd); //显示子弹 void DiRenMove(DiRen *pHead); //敌人移动 void ZiDanMove(DiRen *pHead); //子弹移动 void shoot(HWND hWnd,FeiJi *ziji,DiRen **diren,ZiDan **zidan);//判断是否射中 void ReleaseDiren(DiRen **pHead); //释放出去的敌人 void ReleaseZidan(ZiDan **pHead); //释放出去的子弹 void ZaoZiJi(HWND hWnd); //造自己 LRESULT CALLBACK pp(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam);//回调函数 int __stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { WNDCLASSEX wc; HWND hWnd; MSG msg; 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); } return 0; } DiRen *pDiRen=NULL; //敌人 ZiDan *pZiDan=NULL; //子弹 FeiJi *pZiJi=NULL; //自己 static int score=0; //分数 static char sco[20]; //装分数的字符窜 LRESULT CALLBACK pp(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) { int i=1, //位 jscore; HDC hdc; HDC memdc; HBITMAP hbm; BITMAP bminfo; switch(msg) { case WM_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); //释放出屏幕的子弹 } else if( TIMER_DIREN==wParam) //定时器102 { ZaoDiRen(); //造敌人 } else if(TIMER_DIRENRELEASE==wParam) //定时器103 { ReleaseDiren(&pDiRen); //释放出屏幕的敌人 } ShowDiRen(pDiRen,hWnd); //显示敌人 DiRenMove(pDiRen); //敌人移动 ShowZiDan(pZiDan,hWnd); //显示子弹 shoot(hWnd,pZiJi,&pDiRen,&pZiDan); //是否射中 break; case WM_CLOSE: //关闭 PostQuitMessage(0); break; case WM_KEYDOWN: //判断按键 switch(wParam) { case VK_LEFT: //左移 if(pZiJi->x>0) pZiJi->x-=20; break; case VK_RIGHT: //右移 if(pZiJi->xx+=20; break; case VK_UP: //上移 if(pZiJi->y>0) pZiJi->y-=20; break; case VK_DOWN: //下移 if(pZiJi->yy+=20; break; case VK_SPACE: //空格发射子弹 ZaoZiDan(); break; } break; case WM_CREATE: //创建 srand(time(NULL)); pZiJi=(struct Node*)malloc(sizeof(struct Node)); 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; } return DefWindowProc(hWnd,msg,wParam,lParam); } void ZaoDiRen() //造子弹 { DiRen *u; u=(struct Node*)malloc(sizeof(struct Node)); u->x=rand()%550; //子弹的x随机出现 u->y=-10; //出现的纵坐标固定 u->pnext=NULL; if(NULL==pDiRen) { pDiRen=u; } else { u->pnext=pDiRen; //将新产生的链表放在头 pDiRen=u; } } void ShowDiRen(struct Node *pHead,HWND hWnd) //显示敌人 { HDC hdc; HDC memdc; HBITMAP hbm; BITMAP bminfo; 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); } void ZaoZiJi(HWND hWnd) { HDC hdc; HDC memdc; HBITMAP hbm; BITMAP bminfo; 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); } void ZaoZiDan() //造子弹 { 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; } } void ShowZiDan(ZiDan *pHead,HWND hWnd) //显示子弹 { HDC hdc; HDC memdc; HBITMAP hbm; BITMAP bminfo; 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); } void DiRenMove(DiRen *pHead) //敌人移动 { while(pHead!=NULL) //链表不为空,敌人移动 { if(scorey+=10; pHead=pHead->pnext; } else { pHead->y+=20; pHead=pHead->pnext; } } } void ZiDanMove(DiRen *pHead) //子弹移动 { while(pHead!=NULL) //链表不为空子弹移动 { pHead->y-=20; pHead=pHead->pnext; } } void shoot(HWND hWnd,FeiJi *ziji,DiRen **diren,ZiDan **zidan) //判断是否中 { DiRen *js1=*diren; ZiDan *js2=*zidan; int n = 1; while(js1!=NULL) //判断自己是否撞机 { //撞击释放定时器游戏结束 if((ziji->x-js1->xx-js1->x>-38)&&(ziji->y-js1->yy-js1->y>-38)) { KillTimer(hWnd,TIMER_DIREN); KillTimer(hWnd,TIMER_ZIDAN); KillTimer(hWnd,TIMER_DIRENMOVE); KillTimer(hWnd,TIMER_DIRENRELEASE); MessageBox(hWnd,"You Lose","窗口",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 x - js1->x>=-5)&&(js2->y - js1->y 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; } } } void ReleaseDiren(DiRen **pHead) //释放飞出屏幕的敌人 { DiRen *js=*pHead; while((js=*pHead)!=NULL) { if(js->y>600) //飞出屏幕释放 { *pHead=js->pnext; free(js); } else { pHead = &js->pnext; //看下一个 } } } void ReleaseZidan(ZiDan **pHead) //释放子弹 { ZiDan *js=*pHead; while((js=*pHead)!=NULL) { if(js->ypnext; 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
#define new DEBUG_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()
{
}
BOOL CmytestView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此处通过修改
// CREATESTRUCT cs 来修改窗口类或样式
return CView::PreCreateWindow(cs);
}
// CmytestView 绘制
void CmytestView::OnDraw(CDC* pDC)
{
CmytestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
/*CBitmap bitmap;
bitmap.LoadBitmapW(IDB_ME);
*/
//画图
/*pDC->BitBlt(100,50,50,60,&MemDC,0,0,SRCCOPY);*/
/*POINT pt;
pt.x=200;
pt.y=200;
CImageList imageList;
imageList.Create(50,60,ILC_COLOR24|ILC_MASK,1,0);
imageList.Add(&bitmap,RGB(0,0,0));
imageList.Draw(pDC,0,pt,ILD_TRANSPARENT);
CDC MemDC;
MemDC.CreateCompatibleDC(NULL);
MemDC.SelectObject(&bitmap);*/
//RECT rc;
//GetClientRect(&rc);
//CBrush brush;
//brush.CreateSolidBrush(RGB(3,108,254));
//pDC->SelectObject(&brush);
//CBrush *oldbrush=pDC->SelectObject(&brush);
//pDC->Rectangle(&rc);
//pDC->SelectObject(oldbrush);
//CBitmap bitmap;
//bitmap.LoadBitmapW(IDB_ME);
//POINT pt;
//pt.x=200;
//pt.y=200;
//CImageList imageList;
//imageList.Create(60,50,ILC_COLOR24|ILC_MASK,1,0);
//imageList.Add(&bitmap,RGB(0,0,0));
//imageList.Draw(pDC,0,pt,ILD_TRANSPARENT);
// CDC MemDC;
//MemDC.CreateCompatibleDC(NULL);
//MemDC.SelectObject(&bitmap);
//刷新
RECT rc;
GetClientRect(&rc);
CBrush brush;
brush.CreateSolidBrush(RGB(3,108,254));
pDC->SelectObject(&brush);
CBrush *oldbrush=pDC->SelectObject(&brush);
pDC->Rectangle(&rc);
pDC->SelectObject(oldbrush);
//敌机
CBitmap bitmap1;
bitmap1.LoadBitmapW(IDB_enemy);
POINT pt1;
pt1.x=200;
pt1.y=m_y_enemyone;
POINT pt1_2;
pt1_2.x=300;
pt1_2.y=m_y_enemytwo;
CImageList imageList1;
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);
//战机
CBitmap bitmap2;
bitmap2.LoadBitmapW(IDB_ME);
POINT pt2;
pt2.x=m_x_me;
pt2.y=100;
CImageList imageList2;
imageList2.Create(50,60,ILC_COLOR24|ILC_MASK,1,0);
imageList2.Add(&bitmap2,RGB(0,0,0));
imageList2.Draw(pDC,0,pt2,ILD_TRANSPARENT);
//子弹
CBitmap bitmap3;
bitmap3.LoadBitmapW(IDB_ball);
POINT pt3;
pt3.x=150;
pt3.y=m_y_ball;
CImageList imageList3;
imageList3.Create(8,8,ILC_COLOR24|ILC_MASK,1,0);
imageList3.Add(&bitmap3,RGB(0,0,0));
imageList3.Draw(pDC,0,pt3,ILD_TRANSPARENT);
//炸弹
CBitmap bitmap4;
bitmap4.LoadBitmapW(IDB_bomb);
POINT pt4;
pt4.x=m_x_bomb;
pt4.y=250;
CImageList imageList4;
imageList4.Create(10,20,ILC_COLOR24|ILC_MASK,1,0);
imageList4.Add(&bitmap4,RGB(0,0,0));
imageList4.Draw(pDC,0,pt4,ILD_TRANSPARENT);
//爆炸
CBitmap bitmap5;
bitmap5.LoadBitmapW(IDB_explsion);
POINT pt5_1;
pt5_1.x=310;
pt5_1.y=310;
POINT pt5_2;
pt5_2.x=330;
pt5_2.y=330;
POINT pt5_3;
pt5_3.x=350;
pt5_3.y=450;
POINT pt5_4;
pt5_4.x=470;
pt5_4.y=470;
POINT pt5_5;
pt5_5.x=510;
pt5_5.y=510;
POINT pt5_6;
pt5_6.x=530;
pt5_6.y=530;
POINT pt5_7;
pt5_7.x=540;
pt5_7.y=540;
POINT pt5_8;
pt5_8.x=450;
pt5_8.y=250;
CImageList imageList5;
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);
/*CDC MemDC;
MemDC.CreateCompatibleDC(NULL);
MemDC.SelectObject(&bitmap2);*/
}
// CmytestView 诊断
#ifdef _DEBUG
void CmytestView::AssertValid() const
{
CView::AssertValid();
}
void CmytestView::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 消息处理程序
int CmytestView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码
SetTimer(1,30,NULL);
return 0;
}
void CmytestView::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CView::OnTimer(nIDEvent);
CDC *pDC=GetDC();
//刷新背景
RECT rc;
GetClientRect(&rc);
CBrush brush;
brush.CreateSolidBrush(RGB(3,108,254));
pDC->SelectObject(&brush);
CBrush *oldbrush=pDC->SelectObject(&brush);
pDC->Rectangle(&rc);
pDC->SelectObject(oldbrush);
//战机
CBitmap bitmap2;
bitmap2.LoadBitmapW(IDB_ME);
POINT pt2;
pt2.x=m_x_me;
pt2.y=100;
CImageList imageList2;
imageList2.Create(50,60,ILC_COLOR24|ILC_MASK,1,0);
imageList2.Add(&bitmap2,RGB(0,0,0));
imageList2.Draw(pDC,0,pt2,ILD_TRANSPARENT);
//子弹
以上就是爱站技术频道小编介绍的详解C++编程简易飞机战,大家都可以在js.aizhan.com学习更多,我们一定会为您提供最专业的知识。
上一篇:散列表算法及其C语言的实现详解
下一篇:C语言中平方根实现的详细分析
