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