吾爱汇编

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 1661|回复: 0

[C/C++] cqupt程序设计题关于mfc

[复制链接]
istar小明 发表于 2018-10-9 00:11 | 显示全部楼层 |阅读模式

没地方放了 借个友链暂存一下
// 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();
};
m.png 程序开始界面 a.png 程序运行界面

评分

参与人数 5HB +8 收起 理由
消逝的过去 + 2
后学真 + 1
zxjzzh + 2 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
agan8888 + 1
playboy + 2

查看全部评分

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

警告:本站严惩灌水回复,尊重自己从尊重他人开始!

免责声明

吾爱汇编(www.52hb.com)所讨论的技术及相关工具仅限用于研究学习,皆在提高软件产品的安全性,严禁用于不良动机。任何个人、团体、组织不得将其用于非法目的,否则,一切后果自行承担。吾爱汇编不承担任何因为技术滥用所产生的连带责任。吾爱汇编内容源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除。如有侵权请邮件或微信与我们联系处理。

站长邮箱:SharkHeng@sina.com
站长QQ:1140549900


QQ|RSS|手机版|小黑屋|帮助|吾爱汇编 ( 京公网安备11011502005403号 , 京ICP备20003498号-6 )|网站地图

Powered by Discuz!

吾爱汇编 www.52hb.com

快速回复 返回顶部 返回列表