📄 pengpenggamedlg.cpp
字号:
// pengpengGameDlg.cpp : implementation file
//
#include "stdafx.h"
#include "pengpengGame.h"
#include "pengpengGameDlg.h"
#include "GetNameDlg.h"
#include <mmsystem.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
extern CPengpengGameApp theApp;
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPengpengGameDlg dialog
CPengpengGameDlg::CPengpengGameDlg(CWnd* pParent /*=NULL*/)
: CDialog(CPengpengGameDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CPengpengGameDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CPengpengGameDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPengpengGameDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPengpengGameDlg, CDialog)
//{{AFX_MSG_MAP(CPengpengGameDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_ERASEBKGND()
ON_WM_LBUTTONDOWN()
ON_WM_TIMER()
ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPengpengGameDlg message handlers
BOOL CPengpengGameDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CBitmap bmBack,bmBallan,bmBallhei,bmScore,bmButtonsys;
bmBack.LoadBitmap(IDB_BACK);
bmBallan.LoadBitmap(IDB_BALLAN);
bmBallhei.LoadBitmap(IDB_BALLHEI);
bmScore.LoadBitmap(IDB_SCORE);
bmButtonsys.LoadBitmap(IDB_BUTTONSYS);
CClientDC dc(this);
m_dcBack.CreateCompatibleDC(&dc);
m_dcBallAn.CreateCompatibleDC(&dc);
m_dcBallHei.CreateCompatibleDC(&dc);
m_dcScore.CreateCompatibleDC(&dc);
m_dcButtonSys.CreateCompatibleDC(&dc);
m_dcBack.SelectObject(&bmBack);
m_dcBallAn.SelectObject(&bmBallan);
m_dcBallHei.SelectObject(&bmBallhei);
m_dcScore.SelectObject(&bmScore);
m_dcButtonSys.SelectObject(&bmButtonsys);
bmBack.DeleteObject();
bmBallan.DeleteObject();
bmBallhei.DeleteObject();
bmScore.DeleteObject();
bmButtonsys.DeleteObject();
CRect rt1,rt2;
GetWindowRect(&rt1);
GetClientRect(&rt2);
int cx=rt1.right-rt1.left-(rt2.right-rt2.left);
int cy=rt1.bottom-rt1.top-(rt2.bottom-rt2.top);
MoveWindow(0,0,539+cx,485+cy);
CenterWindow();
srand(time(NULL));
CFile fHero;
int i;
PK_Hero da;
if(fHero.Open("Hero.dat",CFile::modeRead)==0)
{
char *name[]={"PKLANG","PKLANG's GF[Nancy]","PKLANG's GF[XiaoQian]","PKLANG's GF[Wenwen]","PKLANG's GF[Dandan]"};
int score[5]={885,650,625,580,520};
fHero.Open("Hero.dat",CFile::modeCreate|CFile::modeWrite);
for(i=0;i<5;i++)
{
strcpy(da.Name,name[i]);
da.Score=score[i];
fHero.Write(&da,sizeof(PK_Hero));
m_arrHero.Add(da);
}
fHero.Close();
}
else
{
for(i=0;i<5;i++)
{
fHero.Read(&da,sizeof(PK_Hero));
m_arrHero.Add(da);
}
fHero.Close();
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
SetWindowText("搞怪PKLANG");
// TODO: Add extra initialization here
m_rtSelect[0].SetRect(476,0,504,32);
m_rtSelect[1].SetRect(508,0,540,32);
m_rtSelect[2].SetRect(409,246,495,246+33);
m_rtSelect[3].SetRect(409,286,495,286+33);
m_rtSelect[4].SetRect(409,326,495,326+33);
m_rtSelect[5].SetRect(395,374,530,420);
m_nButtonSelect=-1;
ReStart();
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CPengpengGameDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
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;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
CClientDC ddc(this);
for(int i=0;i<81;i++)
if(m_Ball[i]!=-1)
{
if(i%2)
ddc.BitBlt(20+(i%9)*40+2,60+i/9*40+2,36,38,&m_dcBallHei,2,m_Ball[i]*40,SRCCOPY);
else
ddc.BitBlt(20+(i%9)*40+2,60+i/9*40+2,36,38,&m_dcBallAn,2,m_Ball[i]*40,SRCCOPY);
}
for( i=0;i<3;i++)
ddc.BitBlt(400+i*40+2,94,36,38,&m_dcBallHei,2,m_NextBall[i]*40,SRCCOPY);
DisplayScore(410,188,m_nScore);
int oldMode=ddc.SetBkMode(TRANSPARENT);
int oldColor=ddc.SetTextColor(RGB(255,10,10));
ddc.DrawText(m_arrHero.GetAt(0).Name,CRect(280,458,420,475),DT_CENTER|DT_VCENTER);
DisplayScore(430,458,m_arrHero.GetAt(0).Score);
ddc.SetBkMode(oldMode);
ddc.SetTextColor(oldColor);
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CPengpengGameDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
BOOL CPengpengGameDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
pDC->BitBlt(0,0,539,485,&m_dcBack,0,0,SRCCOPY);
return TRUE;//CDialog::OnEraseBkgnd(pDC);
}
void CPengpengGameDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_nButtonSelect!=-1)
ClickVirtualButton();
else
if(point.y<20)
PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));
if( point.x>20 && point.x<380 && point.y>60 && point.y<420)
{
int pos=(point.x-20)/40+(point.y-60)/40*9;
CUIntArray ar,arrgood;
int i,j,ret[3],old;
CRect rt;
CString str;
CClientDC dc(this);
if( m_nSelected!=-1)
{
if(pos==m_nSelected)return;
if( m_Ball[pos]==-1 )
{
if(BFSPathBest(m_nSelected,pos,&ar))
{
old=m_Ball[m_nSelected];
m_Ball[m_nSelected]=-1;
KillTimer(1313);
PlayMySound(IDR_F4);
for( i=ar.GetSize()-1;i>0;i-- )
{
rt.SetRect(20+ar.GetAt(i)%9*40,60+ar.GetAt(i)/9*40,20+ar.GetAt(i)%9*40+40,60+ar.GetAt(i)/9*40+40);
RedrawWindow(rt);
if(old%2)
dc.BitBlt(20+(ar.GetAt(i-1)%9)*40+2,60+ar.GetAt(i-1)/9*40+2,36,38,&m_dcBallHei,2,old*40,SRCCOPY);
else
dc.BitBlt(20+(ar.GetAt(i-1)%9)*40+2,60+ar.GetAt(i-1)/9*40+2,36,38,&m_dcBallAn,2,old*40,SRCCOPY);
Sleep(100);
}
m_Ball[pos]=old;
m_nSelected=-1;
for(j=0;j<4;j++)
if(FindSuccLine(pos,j,&arrgood))
{
FlashTheCheak(&dc,&arrgood);
return;
}
for( i=0;i<3;i++)
{
ret[i]=RandFindAt();
m_Ball[ret[i]]=m_NextBall[i];
m_NextBall[i]=rand()%8;
if(ret[i]==-1)
{
// KillTimer(1313);
if(m_nScore>m_arrHero.GetAt(4).Score)
{
CGetNameDlg nameDlg;
if(nameDlg.DoModal()==IDOK)
SaveHero(nameDlg.m_strName);
}
else
AfxMessageBox("HAHA!玩完了!");
ReStart();
RedrawWindow();
return;
}
}
PlayMySound(IDR_C0);
for( i=1;i<4;i++ )
{
for( j=0;j<3;j++)
{
if(ret[j]%2)
dc.BitBlt(20+(ret[j]%9)*40+2,60+ret[j]/9*40+2,36,38,&m_dcBallHei,2+(rand()%5+1)*40,m_Ball[ret[j]]*40,SRCCOPY);
else
dc.BitBlt(20+(ret[j]%9)*40+2,60+ret[j]/9*40+2,36,38,&m_dcBallAn,2+(rand()%5+1)*40,m_Ball[ret[j]]*40,SRCCOPY);
}
Sleep(200);
}
rt.SetRect(400,94,400+120,94+40);
RedrawWindow(rt);
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
if(FindSuccLine(ret[i],j,&arrgood))
{
FlashTheCheak(&dc,&arrgood);
break;
//MessageBox("good Line");
}///findsuccline
}///for(i=0;i<3;i++)
}//BFSPathBest(m_nSelected,pos,&ar)
else//no path
{
PlayMySound(IDR_J0);
}
}//m_Ball[pos]==-1 )
else
{
rt.SetRect(20+m_nSelected%9*40,60+m_nSelected/9*40,20+m_nSelected%9*40+38,60+m_nSelected/9*40+38);
RedrawWindow(rt);
PlayMySound(IDR_D2);
m_nSelected=pos;
}
}//m_nSelected!=-1)
else if(m_Ball[pos]!=-1)
{
PlayMySound(IDR_D2);
m_nSelected=pos;
SetTimer(1313,300,NULL);
SendMessage(WM_TIMER,1313);
}
}//if inRect(...
CDialog::OnLButtonDown(nFlags, point);
}
BOOL CPengpengGameDlg::BFSPathBest(int from, int to, CUIntArray *arrSave)
{
int i,head,tail,data[81],pnt[81];
int bcheck[81];
for( i=0;i<81;i++)
bcheck[i]=0;
head=0;
tail=1;
data[0]=from;
pnt[0]=0;
while(1)
{
if( (data[head]-9)>=0 && m_Ball[data[head]-9]==-1 && bcheck[data[head]-9]==0)
{
data[tail]=data[head]-9;
pnt[data[tail]]=data[head];
if(data[tail]==to)break;
bcheck[data[tail]]=1;
tail++;
}
if( (data[head]+9)<81 && m_Ball[data[head]+9]==-1 && bcheck[data[head]+9]==0)
{
data[tail]=data[head]+9;
pnt[data[tail]]=data[head];
if(data[tail]==to)break;
bcheck[data[head]+9]=1;
tail++;
}
if( ((data[head])%9)>0 && m_Ball[data[head]-1]==-1 && bcheck[data[head]-1]==0)
{
data[tail]=data[head]-1;
pnt[data[tail]]=data[head];
if(data[tail]==to)break;
bcheck[data[head]-1]=1;
tail++;
}
if( ((data[head])%9)<8 && m_Ball[data[head]+1]==-1 && bcheck[data[head]+1]==0)
{
data[tail]=data[head]+1;
pnt[data[tail]]=data[head];
if(data[tail]==to)break;
bcheck[data[head]+1]=1;
tail++;
}
head++;
if(head>=tail)break;
}//while(head>=tail);
if(data[tail]==to)
{
arrSave->RemoveAll();
arrSave->Add(to);
int a=pnt[to];
arrSave->Add(a);
while(a!=from)
{
arrSave->Add(pnt[a]);
a=pnt[a];
}
return TRUE;
}
else
return FALSE;
}
void CPengpengGameDlg::OnTimer(UINT nIDEvent)
{
if(nIDEvent==1313)
{
CClientDC dc(this);
if(m_nSelected%2)
dc.BitBlt(20+m_nSelected%9*40+2,60+m_nSelected/9*40+2,36,38,&m_dcBallHei,2+(rand()%5+1)*40,m_Ball[m_nSelected]*40,SRCCOPY);
else
dc.BitBlt(20+m_nSelected%9*40+2,60+m_nSelected/9*40+2,36,38,&m_dcBallAn,2+(rand()%5+1)*40,m_Ball[m_nSelected]*40,SRCCOPY);
}
CDialog::OnTimer(nIDEvent);
}
int CPengpengGameDlg::RandFindAt()
{
int i,k=0,notin[81];
for(i=0;i<81;i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -