#include<windows.h>
#include"resource.h"
#include<stdlib.h>
#include<time.h>
#include<stdio.h> #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=;
wc.cbSize=sizeof(WNDCLASSEX);
wc.cbWndExtra=;
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);
RegisterClassEx(&wc);
hWnd=CreateWindow("hello","world", WS_OVERLAPPEDWINDOW,,,,,NULL,NULL,hInstance,NULL);
ShowWindow(hWnd,nCmdShow);
while(GetMessage(&msg,NULL,,))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return ;
}
DiRen *pDiRen=NULL; //敌人
ZiDan *pZiDan=NULL; //子弹
FeiJi *pZiJi=NULL; //自己
static int score=; //分数
static char sco[]; //装分数的字符窜
LRESULT CALLBACK pp(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
int i=, //位
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,,,,,memdc,,,SRCCOPY);
/*itoa(score,sco,10);*/
sprintf(sco,"%d",score); //将分数装入字符窜
jscore=score;
while((jscore=jscore/)>) //判断分数有几位
i++;
TextOut(hdc,,,"分数",);
TextOut(hdc,,,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();
break;
case WM_KEYDOWN: //判断按键
switch(wParam)
{
case VK_LEFT: //左移
if(pZiJi->x>)
pZiJi->x-=;
break;
case VK_RIGHT: //右移
if(pZiJi->x<)
pZiJi->x+=;
break;
case VK_UP: //上移
if(pZiJi->y>)
pZiJi->y-=;
break;
case VK_DOWN: //下移
if(pZiJi->y<)
pZiJi->y+=;
break;
case VK_SPACE: //空格发射子弹
ZaoZiDan();
break;
}
break;
case WM_CREATE: //创建
srand(time(NULL));
pZiJi=(struct Node*)malloc(sizeof(struct Node));
pZiJi->x=; //自己的x
pZiJi->y=; //自己的y
SetTimer(hWnd,TIMER_DIREN,,NULL); //设置定时器
SetTimer(hWnd,TIMER_DIRENMOVE,,NULL);
SetTimer(hWnd,TIMER_ZIDAN,,NULL);
SetTimer(hWnd,TIMER_DIRENRELEASE,,NULL);
break;
}
return DefWindowProc(hWnd,msg,wParam,lParam);
} void ZaoDiRen() //造子弹
{
DiRen *u;
u=(struct Node*)malloc(sizeof(struct Node));
u->x=rand()%; //子弹的x随机出现
u->y=-; //出现的纵坐标固定
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,,,memdc,,,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,,,memdc,,,SRCCOPY); //显示自己
DeleteDC(memdc);
ReleaseDC(hWnd,hdc);
DeleteObject(hbm);
}
void ZaoZiDan() //造子弹
{
ZiDan *u;
u=(ZiDan*)malloc(sizeof(ZiDan));
u->x=pZiJi->x+;
u->y=pZiJi->y+;
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,,,memdc,,,SRCCOPY);
pHead=pHead->pnext;
}
DeleteDC(memdc);
ReleaseDC(hWnd,hdc);
DeleteObject(hbm);
} void DiRenMove(DiRen *pHead) //敌人移动
{
while(pHead!=NULL) //链表不为空,敌人移动
{
if(score<)
{
pHead->y+=;
pHead=pHead->pnext;
}
else
{
pHead->y+=;
pHead=pHead->pnext;
}
}
}
void ZiDanMove(DiRen *pHead) //子弹移动
{
while(pHead!=NULL) //链表不为空子弹移动
{
pHead->y-=;
pHead=pHead->pnext;
}
} void shoot(HWND hWnd,FeiJi *ziji,DiRen **diren,ZiDan **zidan) //判断是否中
{
DiRen *js1=*diren;
ZiDan *js2=*zidan;
int n = ;
while(js1!=NULL) //判断自己是否撞机
{
//撞击释放定时器游戏结束
if((ziji->x-js1->x<&&ziji->x-js1->x>-)&&(ziji->y-js1->y<&&ziji->y-js1->y>-))
{
KillTimer(hWnd,TIMER_DIREN);
KillTimer(hWnd,TIMER_ZIDAN);
KillTimer(hWnd,TIMER_DIRENMOVE);
KillTimer(hWnd,TIMER_DIRENRELEASE);
MessageBox(hWnd,"You Lose","窗口",MB_OK);
PostQuitMessage();
break;
}
else
js1=js1->pnext; //没有判断下一个敌机
}
js1=*diren; //敌机回到头
while((js1=*diren)!=NULL) //判断敌人是否为空
{
zidan = &pZiDan;
n = ;
while((js2=*zidan)!=NULL) //判断子弹是否为空
{
//敌机中弹
if((js2->x - js1->x <= &&js2->x - js1->x>=-)&&(js2->y - js1->y <= &&js2->y - js1->y>=-))
{
score+=;
n = ;
*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 != ) //判断是否是中弹出来的
{
diren = &js1->pnext;
}
}
}
void ReleaseDiren(DiRen **pHead) //释放飞出屏幕的敌人
{
DiRen *js=*pHead;
while((js=*pHead)!=NULL)
{
if(js->y>) //飞出屏幕释放
{
*pHead=js->pnext;
free(js);
}
else
{
pHead = &js->pnext; //看下一个
}
}
}
void ReleaseZidan(ZiDan **pHead) //释放子弹
{
ZiDan *js=*pHead;
while((js=*pHead)!=NULL)
{
if(js->y<) //飞出的子弹释放
{
*pHead=js->pnext;
free(js);
}
else
pHead=&js->pnext; //没飞出看下一个
}
}

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

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

  1. js实例--飞机大战

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title> ...

  2. 用Javascript模拟微信飞机大战游戏

    最近微信的飞机大战非常流行,下载量非常高. 利用JS进行模拟制作了一个简单的飞机大战[此源码有很多地方可以进行重构和优化] [此游戏中没有使用HTML5 任何浏览器都可以运行]. 效果图: 原理:利用 ...

  3. 飞机大战编写以及Java的面向对象总结

    面向对象课程完结即可编写一个简单的飞机大战程序.我觉得我需要总结一下 飞机大战中类的设计: 父类:FlyingObject(抽象类) 接口:Award .Enemy 子类:Hero.Bullet.Ai ...

  4. cocos2dx实现经典飞机大战

    游戏开始层 #ifndef __LayerGameStart_H__ #define __LayerGameStart_H__ #include "cocos2d.h" USING ...

  5. 用DIV+Css+Jquery 实现的旧版微信飞机大战。

    用jquery 实现的旧版微信飞机大战. 以前一直都是做后台和业务逻辑,前端很少去做, 现在个小游戏. 方向键控制方向,Ctrl 键 放炸弹(当然你的有炸弹,哈哈)! 主要都是用div+Css实现的, ...

  6. JS+html实现简单的飞机大战

    摘要:通过原生的js+html实现简单的飞机大战小游戏效果,如图所示: 实现代码如下: 1.自己的飞机实现 飞机html: <!DOCTYPE html> <html lang=&q ...

  7. 【一】仿微信飞机大战cocos2d-x3.0rc1

    參考 [偶尔e网事] 的 [cocos2d-x入门实战]微信飞机大战  cocos2dx 2.0版本号,偶尔e网事他写的很具体,面面俱到,大家很有必要看下.能够通过以下链接跳转: cocos2d-x入 ...

  8. cocos2dx 3.0 飞机大战

    因为课程须要.然后又水平有限.所以写了个飞机大战.加上不会画画.所以图片资源也是从微信apk解压出来的,设计思路參考的偶尔e网事. 闲话不说.先讲一下设计.大体上一共分为3个场景.场景以下是Layer ...

  9. 微信5.0 Android版飞机大战破解无敌模式手记

    微信5.0 Android版飞机大战破解无敌模式手记 转载: http://www.blogjava.net/zh-weir/archive/2013/08/14/402821.html 微信5.0 ...

  10. [Unity3D]Unity3D游戏开发之飞机大战项目解说

    大家好,我是秦元培,欢迎大家继续关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 首先感谢大家对我博客的关注,今天我想和大家分享的是一个飞机大战的项目.这是一个比較综合的 ...

随机推荐

  1. 总结一下最近用到的技术(1)--ultraESB

    最近项目中方法用到了一些新的东西,由于之前没有用到过,现在总结一下,方便以后查阅,本篇文章介绍ultraESB,接下来的文章会介绍JsonSchema,JsonSchamaValidator,Json ...

  2. Egret容器的鼠标默认事件

    容器的鼠标默认事件   touchEnabled touchChildren touchThrough DisplayObject false \ \ DisplayObjectContainer f ...

  3. [分布式系统学习] 6.824 LEC3 GFS 笔记

    Google File System 第三课的准备是阅读论文GFS.该论文是分布式系统中经典论文之一. 读完做一点小总结. GFS的feature 1. 非POXIS接口API,支持对文件和文件夹的创 ...

  4. 《modern-php》 - 阅读笔记 - 最佳实践

    过滤.验证和转义数据 过滤数据 不要相信任何外部数据! 常见的有以下几种数据需要过滤:HTML,SQL查询,用户提交的信息(邮件地址.电话号码.身份证) HTML htmlentities() HTM ...

  5. ELKStack之消息队列

    redis消息队列 安装redis yum -y install redis 修改配置文件 修改ip 后台运行 启动 systemctl start redis 查看 lsof -i:6379 连接 ...

  6. java 中形参与实参的转换

    java中有两个参数,一个是形参,一个是实参. 形参:在函数定义中,整个函数体内部都可以使用,离开了该函数就不能继续使用. 实参:出现在主函数中,进入被调函数后,实参变量也就不能继续使用. publi ...

  7. OpenCV学习笔记之课后习题练习2-3

    3.使用例2-10中的视频捕捉和存储方法,结合例2-5中的doPyrDown()创建一个程序,使其从摄像机读入视频数据并将缩放变换后的彩色图像存入磁盘. 例2-10中所用的方法虽然能正常运行,但却不能 ...

  8. Blocks POJ - 1390 多维dp

    题意:有一排box,各有不同的颜色.你可以通过点击某个box使得与其相邻的同色box全部消掉,然后你可以得到的分数为消去长度的平方,问怎样得到最高分? 题解:考虑用一维dp,/*dp[i]为1~i个b ...

  9. Python:fromkeys()方法

    简介 Python 字典(Dictionary) fromkeys() 函数用于创建一个新字典,以序列seq中元素做字典的键,value为字典所有键对应的初始值. 语法 fromkeys()方法语法: ...

  10. 洛谷P4035 球形空间产生器 [JSOI2008] 高斯消元

    正解:高斯消元 解题报告: 链接! 昂开始看到以为是,高斯消元板子题? 开始很容易想到的是,虽然是多维但是可以类比二维三维列出式子嘛 但是高斯消元是只能处理一元问题的啊,,,辣怎么处理呢 对的这就是这 ...