• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C++编写简易的飞机大战

C++编写简易的飞机大战

作者:Z_Bin 字体:[增加 减小] 来源:互联网 时间:2017-05-28

Z_Bin 通过本文主要向大家介绍了c++飞机大战,c++飞机大战源代码,c++飞机大战实训报告,c++坦克大战源代码,c++坦克大战等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

初学C/C++的小伙伴可以用做这个小游戏来熟悉一下编程的乐趣。

#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=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->x<530)
      pZiJi->x+=20;
      break;
    case VK_UP:   //上移
      if(pZiJi->y>0)
      pZiJi->y-=20;
      break;
    case VK_DOWN:  //下移
      if(pZiJi->y<520)
      pZiJi->y+=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(score<500)
    {
      pHead->y+=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->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,"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) //判断子弹是否为空
    {    
      //敌机中



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C++编写简易的飞机大战

相关文章

  • 2017-05-28常用排序算法的C语言版实现示例整理
  • 2017-05-28c++中#include &lt;&gt;与#include""的区别详细解析
  • 2017-05-28C++设计模式之适配器模式
  • 2017-05-28SQL Server中的数据复制到的Access中的函数
  • 2017-05-28C++指向函数的指针用法详解
  • 2017-05-28c语言实现二叉查找树实例方法
  • 2017-05-28VC实现的病毒专杀工具完整实例
  • 2017-05-28C++递归线性阵列搜索数字的方法
  • 2017-05-28利用stream实现一个简单的http下载器
  • 2017-05-28浅谈哈希表存储效率一般不超过50%的原因

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • c++利用stl set_difference对车辆进出区域进行判定
    • C++可变参数的实现方法
    • C/C++ ip地址与int类型的转换实例详解
    • c++ STL容器总结之:vertor与list的应用
    • C语言的getc()函数和gets()函数的使用对比
    • C++中fstream,ifstream及ofstream用法浅析
    • C和C++ const的声明差异
    • 约瑟夫环问题(数组法)c语言实现
    • C++中的常量定义小结
    • 函数指针与指针函数的学习总结

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有