没地方放了 借个友链暂存一下 
// airplantDlg.cpp: 实现文件 
// 
 
#include "stdafx.h" 
#include "airplant.h" 
#include "airplantDlg.h" 
#include "afxdialogex.h" 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#endif 
 
 
// CairplantDlg 对话框 
 
 
 
CairplantDlg::CairplantDlg(CWnd* pParent /*=NULL*/) 
        : CDialog(IDD_AIRPLANT_DIALOG, pParent) 
{ 
        m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
} 
 
void CairplantDlg::DoDataExchange(CDataExchange* pDX) 
{ 
        CDialog::DoDataExchange(pDX); 
        DDX_Control(pDX, IDC_STATIC1, m_txtGameWindows); 
 
} 
 
BEGIN_MESSAGE_MAP(CairplantDlg, CDialog) 
        ON_WM_PAINT() 
        ON_WM_QUERYDRAGICON() 
        ON_BN_CLICKED(IDC_BUTTON1, &CairplantDlg::OnBnClickedButton1) 
        ON_WM_TIMER() 
        ON_WM_HOTKEY() 
 
        ON_STN_CLICKED(IDC_STATIC2, &CairplantDlg::OnStnClickedStatic2) 
        ON_BN_CLICKED(IDC_BUTTON2, &CairplantDlg::OnBnClickedButton2) 
        ON_BN_CLICKED(IDC_BUTTON3, &CairplantDlg::OnBnClickedButton3) 
        ON_BN_CLICKED(IDC_BUTTON4, &CairplantDlg::OnBnClickedButton4) 
        ON_BN_CLICKED(IDC_BUTTON5, &CairplantDlg::OnBnClickedButton5) 
        ON_BN_CLICKED(IDC_BUTTON6, &CairplantDlg::OnBnClickedButton6) 
END_MESSAGE_MAP() 
 
 
// CairplantDlg 消息处理程序 
 
BOOL CairplantDlg::OnInitDialog() 
{ 
        CDialog::OnInitDialog(); 
 
        // 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动 
        //  执行此操作 
        SetIcon(m_hIcon, TRUE);                        // 设置大图标 
        SetIcon(m_hIcon, FALSE);                // 设置小图标 
 
        // TODO: 在此添加额外的初始化代码 
        MyInit(); 
        return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE 
} 
void CairplantDlg::MyInit()//初始化 
{ 
        srand((unsigned int)time(NULL)); 
        HWND hMCI; CString choose = (ep.GetProgramDir() + L"\\temp\\music.mp3"); 
        hMCI = MCIWndCreate(NULL, NULL, WS_POPUP | MCIWNDF_NOPLAYBAR | MCIWNDF_NOMENU, choose); 
        MCIWndPlay(hMCI); 
        //绘制范围 
        m_txtGameWindows.GetClientRect(rect); 
 
        airplant.Load(ep.GetProgramDir() + L"\\temp\\airplant.jpg"); 
        boom.Load(ep.GetProgramDir() + L"\\temp\\boom.jpg"); 
        blackgroud.Load(ep.GetProgramDir() + L"\\temp\\blackgroud.jpg"); 
        gameover.Load(ep.GetProgramDir() + L"\\temp\\gameover.jpg"); 
        login.Load(ep.GetProgramDir() + L"\\temp\\login1.jpg"); 
        min.Load(ep.GetProgramDir() + L"\\temp\\life.jpg"); 
        fire.Load(ep.GetProgramDir() + L"\\temp\\fire.jpg"); 
        state = GameState::Wait; 
        pDC = m_txtGameWindows.GetDC(); 
        brush.CreateSolidBrush(RGB(255, 255, 255)); 
        RegisterHotKey(this->GetSafeHwnd(), 0, NULL, HOTKEY_W); 
        RegisterHotKey(this->GetSafeHwnd(), 0, NULL, HOTKEY_S); 
        RegisterHotKey(this->GetSafeHwnd(), 0, NULL, HOTKEY_L); 
        SetTimer(Reflash, 100, NULL); 
} 
//如果向对话框添加最小化按钮,则需要下面的代码 
// 来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序, 
// 这将由框架自动完成。 
 
void CairplantDlg::OnPaint() 
{ 
        if (IsIconic()) 
        { 
                CPaintDC dc(this); // 用于绘制的设备上下文 
 
                SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); 
 
                // 使图标在工作区矩形中居中 
                int cxIcon = GetSystemMetrics(SM_CXICON); 
                int cyIcon = GetSystemMetrics(SM_CYICON); 
                CRect rect; 
                GetClientRect(&rect); 
                int x = (rect.Width() - cxIcon + 1) / 2; 
                int y = (rect.Height() - cyIcon + 1) / 2; 
 
                // 绘制图标 
                dc.DrawIcon(x, y, m_hIcon); 
        } 
        else 
        { 
                CDialog::OnPaint(); 
        } 
} 
 
//当用户拖动最小化窗口时系统调用此函数取得光标 
//显示。 
HCURSOR CairplantDlg::OnQueryDragIcon() 
{ 
        return static_cast<HCURSOR>(m_hIcon); 
} 
 
 
 
void CairplantDlg::GameStart() 
{ 
        state = GameState::Start; 
        SetTimer(Boomadd, speed, NULL); 
 
        SetTimer(Lifeadd, 5000, NULL); 
        playerY = rect.Height() / 2 - Airplant; 
        booms.RemoveAll(); 
        CairplantDlg::OnStnClickedStatic1(); 
} 
 
void CairplantDlg::AddBooms(int count) 
{ 
        CPoint *p; 
        for (int i = 0; i < count; i++) 
        { 
 
                booms.Add(CPoint(rect.Width() - Boomwidth, GetRandom(Boomwidth, rect.Height() - Boomwidth))); 
        } 
} 
 
void CairplantDlg::Addlife(int count) 
{ 
 
        for (int i = 0; i < count; i++) 
        { 
 
                mins.Add(CPoint(rect.Width() - Lifewidth, GetRandom(Lifewidth, rect.Height() - Lifewidth))); 
 
        } 
 
 
} 
 
void CairplantDlg::MoveUp() 
{ 
        if (playerY - Movehigh - Airplant >= 0 && state == GameState::Start) 
                playerY = playerY - Movehigh - Airplant; 
} 
 
void CairplantDlg::MoveDown() 
{ 
        if (playerY + Movehigh + Airplant <= rect.Height() && state == GameState::Start) 
                playerY = playerY + Movehigh + Airplant; 
} 
 
void CairplantDlg::Shoot() 
{ 
        for (int i = 0 ; i < booms.GetCount(); i++) 
        { 
                if (abs(booms.y - playerY) < Boomwidth) 
                        number = number + 5; 
                int a; 
                a= booms.x - Boomwidth; 
                if (a==-Boomwidth) 
                { 
                        a = rect.Width(); 
                } 
                pDC->FillRect(CRect(BASE_x+44, playerY - 3,a, playerY + 3), &brush); 
                if (abs(booms.y - playerY) < Boomwidth) 
                { 
                        booms.RemoveAt(i); 
                        break; 
                } 
                OnStnClickedStatic1(); 
        } 
} 
void CairplantDlg::GameStartDrawing() 
{ 
         
                blackgroud.BitBlt(*pDC, i, 0, rect.Width(), rect.Height(), 0, 0, SRCCOPY); 
 
        airplant.TransparentBlt(*pDC, BASE_x, playerY - Airplant, Airplant * 2, Airplant * 2, 0, 0, Airplant * 2, Airplant * 2, RGB(255, 255, 255)); 
        for (int i = 0; i < booms.GetCount(); i++) 
        { 
                boom.TransparentBlt(*pDC, booms.x - Boomwidth, booms.y - Boomwidth, Boomwidth * 2, Boomwidth * 2, 0, 0, Boomwidth * 2, Boomwidth * 2, RGB(255, 255, 255)); 
        } 
        for (int i = 0; i < mins.GetCount(); i++) 
        { 
                min.TransparentBlt(*pDC, mins.x - Lifewidth, mins.y - Lifewidth, Lifewidth * 2, Lifewidth * 2, 0, 0, Lifewidth * 2, Lifewidth * 2, RGB(255, 255, 255)); 
        } 
} 
 
void CairplantDlg::BoomMove() 
{ 
        for (int i = booms.GetCount() - 1; i >= 0; i--) 
        { 
                OnStnClickedStatic2(); 
                if (booms.x - Boomwidth < 0) 
                { 
                        booms.RemoveAt(i); 
                        life--; 
                        if (life < 0) 
                                state = GameState::End; 
                        break; 
                } 
                booms.x = booms.x - Boomspeed; 
                booms.y = booms.y + GetRandom(0, 10) - 5; 
        } 
 
} 
void CairplantDlg::Minmove() 
{ 
        for (int i = 0; i < mins.GetCount(); i++) 
        { 
                OnStnClickedStatic2(); 
                mins.x = mins.x - Lifewidth; 
                mins.y = mins.y + GetRandom(0, 6) - 3; 
        } 
 
} 
void CairplantDlg::CheckHit() 
{ 
        for (int i = 0; i < booms.GetCount(); i++) 
        { 
                if (abs(booms.x - BASE_x) < Airplant + Boomwidth&&abs(booms.y - playerY) < Airplant + Boomwidth) 
                { 
                        state = GameState::End; 
                        break; 
                } 
        } 
        for (int i = 0; i < mins.GetCount(); i++) 
        { 
                if (abs(mins.x - BASE_x) < Airplant + Lifewidth&&abs(mins.y - playerY) < Airplant + Lifewidth) 
                { 
                        mins.RemoveAt(i); 
                        life++; 
                        break; 
                } 
        } 
} 
int CairplantDlg::GetRandom(int min, int max) 
{ 
        return rand() % (max - min) + min; 
} 
 
void CairplantDlg::OnBnClickedButton1() 
{ 
        life = 5; 
        GameStart(); 
        // TODO: 在此添加控件通知处理程序代码 
} 
void CairplantDlg::DrawBgm() 
{//获取设备 
        switch (state) 
        { 
        case GameState::Wait: 
                login.BitBlt(*pDC, 0, 0, rect.Width(), rect.Height(), 0, 0, SRCCOPY); 
                break; 
        case GameState::Start: 
                GameStartDrawing(); 
                break; 
        case GameState::End: 
                life = 0; 
                pDC->FillRect(rect, &brush); 
                gameover.BitBlt(*pDC, 0, 0, rect.Width(), rect.Height(), -35, -30, SRCCOPY); 
 
                KillTimer(Boomadd); 
 
                KillTimer(Lifeadd); 
                break; 
        } 
 
 
} 
 
void CairplantDlg::OnTimer(UINT_PTR nIDEvent) 
{ 
        // TODO: 在此添加消息处理程序代码和/或调用默认值 
        switch (nIDEvent) 
        { 
        case Boomadd: 
                AddBooms(1); 
                i=i-Boomspeed; 
                if (i<=-Boomspeed*2) 
                { 
                        i = 0; 
                } 
                break; 
        case Reflash: 
                 
                BoomMove(); 
                Minmove(); 
                DrawBgm(); 
                CheckHit(); 
                break; 
        case Lifeadd: 
                Addlife(1); 
                break; 
        } 
        CDialog::OnTimer(nIDEvent); 
} 
 
 
void CairplantDlg::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2) 
{ 
        // TODO: 在此添加消息处理程序代码和/或调用默认值 
        if (state != GameState::Start) 
        { 
                CDialog::OnHotKey(nHotKeyId, nKey1, nKey2); 
                return; 
        } 
        switch (nKey2) 
        { 
        case  HOTKEY_W: 
                MoveUp(); 
 
                break; 
        case HOTKEY_S: 
                MoveDown(); 
                break; 
        case HOTKEY_L: 
                Shoot(); 
                break; 
        } 
        CDialog::OnHotKey(nHotKeyId, nKey1, nKey2); 
} 
 
 
void CairplantDlg::OnStnClickedStatic1() 
{ 
 
        SetDlgItemInt(IDC_STATIC, number, 1); 
 
        // TODO: 在此添加控件通知处理程序代码 
} 
 
 
void CairplantDlg::OnStnClickedStatic2() 
{ 
        SetDlgItemInt(IDC_STATIC2, life, 1); 
        // TODO: 在此添加控件通知处理程序代码 
} 
 
 
void CairplantDlg::OnBnClickedButton2() 
{ 
        AfxMessageBox(_T("by:istar cqupt:2017214056")); 
        // TODO: 在此添加控件通知处理程序代码 
} 
 
 
void CairplantDlg::OnBnClickedButton3() 
{ 
        life = life + 10; 
        // TODO: 在此添加控件通知处理程序代码 
} 
 
 
void CairplantDlg::OnBnClickedButton4()//加速 
{ 
        speed = speed / 2; 
        // TODO: 在此添加控件通知处理程序代码 
} 
 
 
void CairplantDlg::OnBnClickedButton5()//加速 
{ 
        speed = speed + 500; 
        // TODO: 在此添加控件通知处理程序代码 
} 
 
 
void CairplantDlg::OnBnClickedButton6() 
{ 
        GameStart(); 
        // TODO: 在此添加控件通知处理程序代码 
} 
 
 
 
 
// airplantDlg.h: 头文件 
// 
 
#pragma once 
#include "afxwin.h" 
#include "EasyPath.h" 
#include "afxcmn.h" 
#include <mmsystem.h> 
#pragma comment(lib, "WINMM.LIB")  
#include <Vfw.H> 
#define Airplant 26 
#define BASE_x 50 
#define Boomadd 1 
#define Reflash 2 
#define Lifeadd 3 
#define Movehigh 1 
#define Boomwidth 26 
#define HOTKEY_W 87 
#define HOTKEY_S 83 
#define HOTKEY_L 76 
#define Boomspeed 10 
#define Lifewidth 18 
#define Firewidth 38 
#define Firehigh  9 
// CairplantDlg 对话框 
class CairplantDlg : public CDialog 
{ 
        enum GameState 
        { 
                Wait, 
                Start, 
                End 
        }; 
 
 
// 构造 
public: 
        CairplantDlg(CWnd* pParent = NULL);        // 标准构造函数 
 
// 对话框数据 
#ifdef AFX_DESIGN_TIME 
        enum { IDD = IDD_AIRPLANT_DIALOG }; 
#endif 
 
        protected: 
        virtual void DoDataExchange(CDataExchange* pDX);        // DDX/DDV 支持 
 
 
// 实现 
protected: 
        HICON m_hIcon; 
 
        // 生成的消息映射函数 
        int playerY; 
        int GetRandom(int min, int max); 
        int number = 0; 
        int life = 5; 
        int speed = 1000; 
        int i= 0; 
        virtual BOOL OnInitDialog(); 
        void MyInit();//初始化 
        void GameStart();//游戏开始 
        void AddBooms(int count);//障碍物增加 
        void Addlife(int count);//物品增加 
        void MoveUp();//向上移动                 
        void MoveDown();//向下移动 
        void Shoot();//射击 
        void GameStartDrawing();//绘图         
        void BoomMove();//障碍物浮动 
        void Minmove();//幸运星浮动 
        void CheckHit();//判断撞击 
        afx_msg void OnPaint(); 
        afx_msg HCURSOR OnQueryDragIcon(); 
        DECLARE_MESSAGE_MAP(); 
        CImage blackgroud; 
        CImage boom; 
        CImage airplant; 
        CImage gameover; 
        CImage login; 
        CImage min; 
        CImage fire; 
        CDC *pDC; 
        CRect rect; 
        CArray<CPoint> booms; 
        CArray<CPoint> mins; 
        GameState state; 
        CBrush brush; 
 
public: 
        CStatic m_txtGameWindows; 
        afx_msg void OnBnClickedButton1(); 
        void DrawBgm(); 
        EasyPath ep; 
        afx_msg void OnTimer(UINT_PTR nIDEvent); 
        afx_msg void OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2); 
        CEdit m_number; 
        afx_msg void OnStnClickedStatic1(); 
        CStatic m_life; 
        afx_msg void OnStnClickedStatic2(); 
        afx_msg void OnBnClickedButton2(); 
        afx_msg void OnBnClickedButton3(); 
        afx_msg void OnBnClickedButton4(); 
        afx_msg void OnBnClickedButton5(); 
        afx_msg void OnBnClickedButton6(); 
}; 
 
程序开始界面
 
程序运行界面 
 
 |