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]