⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pengpenggamedlg.cpp

📁 一个用VC实现的小游戏程序源代码。有兴趣分享一下
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -