istar小明 发表于 2018-10-9 00:11

cqupt程序设计题关于mfc

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

页: [1]
查看完整版本: cqupt程序设计题关于mfc