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

📄 pocketliandlg.cpp

📁 wince下的连连看 wince下的连连看 wince下的连连看 wince下的连连看 wince下的连连看
💻 CPP
字号:
// PocketLianDlg.cpp : implementation file
//

#include "stdafx.h"
#include "PocketLian.h"
#include "PocketLianDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define BKCOLOR RGB(128,128,128)
#define FRONTWIDTH	(39+2)
#define FRONTHEIGHT	(39+12)
#define BKWIDTH	46
#define BKHEIGHT 56
#define ROWCOUNT 7      //7               //8        //9
#define COLCOUNT 12     //12             //14        //16

/////////////////////////////////////////////////////////////////////////////
// CPocketLianDlg dialog

CPocketLianDlg::CPocketLianDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CPocketLianDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CPocketLianDlg)
		// 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);

	m_nY1=-1;
	m_nX1=-1;
	m_nRow=ROWCOUNT;
	m_nCol=COLCOUNT;
	m_Player=new int[m_nRow*m_nCol];
}

CPocketLianDlg::~CPocketLianDlg()
{
	delete[] m_Player;
}

void CPocketLianDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CPocketLianDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CPocketLianDlg, CDialog)
	//{{AFX_MSG_MAP(CPocketLianDlg)
	ON_WM_LBUTTONDOWN()
	ON_WM_PAINT()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPocketLianDlg message handlers

BOOL CPocketLianDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// 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
	
	CenterWindow(GetDesktopWindow());	// center to the hpc screen

	// TODO: Add extra initialization here
	m_bitmap.LoadBitmap(IDB_BITMAP_129);
	//ZeroMemory(m_Player,sizeof(m_Player));
	CClientDC dc(this);
	m_MemDC.CreateCompatibleDC(&dc);
	CBitmap bitmap;
	bitmap.CreateCompatibleBitmap(&dc,m_nCol*FRONTWIDTH+5,m_nRow*FRONTHEIGHT+5);
	m_MemDC.SelectObject(&bitmap);	

	int n=GetTickCount();
	
	srand(n);//time(NULL));
	CDWordArray arPlayer;
	for(int i=0;i<(m_nCol*m_nRow)/4;i++)
		for(int j=0;j<4;j++)
			arPlayer.Add(i);
	for(i=0;i<m_nRow*m_nCol;i++)
	{		
		int nIndex=(int(rand()*0.1+rand()*0.01+rand()))%arPlayer.GetSize();
		m_Player[i]=arPlayer.GetAt(nIndex);
		arPlayer.RemoveAt(nIndex);		
	}
	FillMemDC();
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CPocketLianDlg::FillMemDC()
{
	CClientDC dc(this);
	CDC MemDC;
	MemDC.CreateCompatibleDC(&dc);
	CBitmap bitmap1;
	bitmap1.LoadBitmap(IDB_BITMAP_129);
	MemDC.SelectObject(&bitmap1);
	m_MemDC.FillSolidRect(0,0,m_nCol*FRONTWIDTH+5,m_nRow*FRONTHEIGHT+5,BKCOLOR);

	//
	CBitmap bmpBk;
	bmpBk.LoadBitmap(IDB_BITMAP_131);
	CDC     MemBKDC;
	MemBKDC.CreateCompatibleDC(&dc);
	MemBKDC.SelectObject(&bmpBk);

	for(int i=0;i<m_nRow;i++)
	{
		for(int j=0;j<m_nCol;j++)
		{			
			if(m_Player[i*m_nCol+j]==-1)
			{
				//m_MemDC.BitBlt(j*FRONTWIDTH,i*FRONTHEIGHT,BKWIDTH,BKHEIGHT,&MemBKDC,0,0,SRCCOPY);
				continue;
			}
			m_MemDC.BitBlt(j*FRONTWIDTH,i*FRONTHEIGHT,BKWIDTH,BKHEIGHT,&MemBKDC,0,BKHEIGHT,SRCCOPY);
			/*
			for(int k=0;k<39;k++)
				for(int l=0;l<39;l++)
				{
					COLORREF cr=MemDC.GetPixel(39+l,m_Player[i][j]*39+k);
					if(cr==RGB(255,255,255))
						continue;
					m_MemDC.SetPixel(j*39+l,i*39+k,MemDC.GetPixel(l,m_Player[i][j]*39+k));
				}
				*/
			m_MemDC.BitBlt(j*FRONTWIDTH,i*FRONTHEIGHT,FRONTWIDTH-2,FRONTHEIGHT-12,&MemDC,FRONTWIDTH-2,m_Player[i*m_nCol+j]*(FRONTHEIGHT-12),SRCAND);
			m_MemDC.BitBlt(j*FRONTWIDTH,i*FRONTHEIGHT,FRONTWIDTH-2,FRONTHEIGHT-12,&MemDC,0,m_Player[i*m_nCol+j]*(FRONTHEIGHT-12),SRCPAINT);
		}
	}
}

void CPocketLianDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	int x=point.x/FRONTWIDTH+(point.x%FRONTWIDTH?1:0)-1;
	int y=point.y/FRONTHEIGHT+(point.y%FRONTHEIGHT?1:0)-1;
	if(x<m_nCol&&y<m_nRow&&m_Player[y*m_nCol+x]>=0)
	{
		CClientDC dc(this);
		CBrush brush(RGB(255,0,0));
		dc.SelectObject(&brush);
		dc.Ellipse(x*FRONTWIDTH,y*FRONTHEIGHT,x*FRONTWIDTH+10,y*FRONTHEIGHT+10);
		if(m_nX1<0)
		{
			m_nX1=x;
			m_nY1=y;			
		}
		else
		{
			if((m_nX1!=x||m_nY1!=y)&&m_Player[m_nY1*m_nCol+m_nX1]==m_Player[y*m_nCol+x])
			{
				if(Pass(m_nX1,m_nY1,x,y))
				{
					//MessageBox("OK");
					m_Player[m_nY1*m_nCol+m_nX1]=-1;
					m_Player[y*m_nCol+x]=-1;
					m_MemDC.FillSolidRect(x*FRONTWIDTH,y*FRONTHEIGHT,FRONTWIDTH,FRONTHEIGHT,BKCOLOR);
					m_MemDC.FillSolidRect(m_nX1*FRONTWIDTH,m_nY1*FRONTHEIGHT,FRONTWIDTH,FRONTHEIGHT,BKCOLOR);				
				}				
			}
			InvalidateRect(CRect(x*FRONTWIDTH,y*FRONTHEIGHT,(x+1)*FRONTWIDTH,(y+1)*FRONTHEIGHT));
			InvalidateRect(CRect(m_nX1*FRONTWIDTH,m_nY1*FRONTHEIGHT,(m_nX1+1)*FRONTWIDTH,(m_nY1+1)*FRONTHEIGHT));
			m_nX1=-1;
			m_nY1=-1;			
		}
	}
	
	CDialog::OnLButtonDown(nFlags, point);
}

BOOL CPocketLianDlg::X1EqualX2(int x, int y1,int y2)
{
	if(y1>y2)
	{
		int n=y1;
		y1=y2;
		y2=n;
	}
	//    直通 	
	for(int i=y1+1;i<=y2;i++)
	{
		if(i==y2)
			return TRUE;
		if(m_Player[i*m_nCol+x]>-1)
			break;
	}
	//左通
	if(XThrough(x-1,y1,FALSE)&&XThrough(x-1,y2,FALSE))
		return TRUE;
	//右通
	if(XThrough(x+1,y1,TRUE)&&XThrough(x+1,y2,TRUE))
		return TRUE;
	return FALSE;
}
BOOL CPocketLianDlg::Y1EqualY2(int x1,int x2,int y)
{
	if(x1>x2)
	{
		int x=x1;
		x1=x2;
		x2=x;
	}
	//直通
	for(int i=x1+1;i<=x2;i++)
	{
		if(i==x2)
			return TRUE;
		if(m_Player[y*m_nCol+i]>-1)
			break;
	}
	//上通
	if(YThrough(x1,y-1,FALSE)&&YThrough(x2,y-1,FALSE))
		return TRUE;
	//下通
	if(YThrough(x1,y+1,TRUE)&&YThrough(x2,y+1,TRUE))
		return TRUE;
	return FALSE;
}
BOOL CPocketLianDlg::LineX(int x,int y1,int y2)
{
	if(y1>y2)
	{
		int y=y1;
		y1=y2;
		y2=y;
	}
	for(int y=y1;y<=y2;y++)
	{
		if(m_Player[y*m_nCol+x]>-1)
			return FALSE;
		if(y==y2)
			return TRUE;
	}
	return FALSE;
}
BOOL CPocketLianDlg::LineY(int x1,int x2,int y)
{
	if(x1>x2)
	{
		int x=x1;
		x1=x2;
		x2=x;
	}
	for(int x=x1;x<=x2;x++)
	{
		if(m_Player[y*m_nCol+x]>-1)
			return FALSE;
		if(x==x2)
			return TRUE;
	}
	return FALSE;
}
BOOL CPocketLianDlg::OnePlumb(int x1, int y1,int x2, int y2)
{
	if(x1>x2)
	{
		int n=x1;
		x1=x2;
		x2=n;
		n=y1;
		y1=y2;
		y2=n;
	}
	if(y2<y1)
	{
		if(LineY(x1+1,x2,y1)&&LineX(x2,y1,y2+1))
			return TRUE;
		if(LineY(x2-1,x1,y2)&&LineX(x1,y2,y1-1))
			return TRUE;
		return FALSE;
	}	
	else
	{
		if(LineY(x1+1,x2,y1)&&LineX(x2,y1,y2-1))
			return TRUE;
		if(LineY(x2-1,x1,y2)&&LineX(x1,y2,y1+1))
			return TRUE;		
		return FALSE;
	}
	return FALSE;
}
BOOL CPocketLianDlg::TwoPlumb(int x1, int y1, int x2, int y2)
{
	if(x1>x2)
	{
		int n=x1;
		x1=x2;
		x2=n;
		n=y1;
		y1=y2;
		y2=n;
	}
	//右通
	if(XThrough(x1+1,y1,TRUE)&&XThrough(x2+1,y2,TRUE))
		return TRUE;
	//左通
	if(XThrough(x1-1,y1,FALSE)&&XThrough(x2-1,y2,FALSE))
		return TRUE;
	//上通
	if(YThrough(x1,y1-1,FALSE)&&YThrough(x2,y2-1,FALSE))
		return TRUE;
	//下通
	if(YThrough(x1,y1+1,TRUE)&&YThrough(x2,y2+1,TRUE))
		return TRUE;
	//右
	for(int x=x1+1;x<m_nCol;x++)
	{
		if(m_Player[y1*m_nCol+x]>-1)
			break;
		if(OnePlumb(x,y1,x2,y2))
			return TRUE;
	}
	//左
	for(x=x1-1;x>-1;x--)
	{
		if(m_Player[y1*m_nCol+x]>-1)
			break;
		if(OnePlumb(x,y1,x2,y2))
			return TRUE;
	}
	//上
	for(int y=y1-1;y>-1;y--)
	{
		if(m_Player[y*m_nCol+x1]>-1)
			break;
		if(OnePlumb(x1,y,x2,y2))
			return TRUE;
	}
	//下
	for(y=y1+1;y<m_nRow;y++)
	{
		if(m_Player[y*m_nCol+x1]>-1)
			break;
		if(OnePlumb(x1,y,x2,y2))
			return TRUE;
	}
	
	return FALSE;
}

BOOL CPocketLianDlg::XThrough(int x, int y, BOOL bAdd)
{
	if(bAdd)
	{
		for(int i=x;i<m_nCol;i++)
			if(m_Player[y*m_nCol+i]>-1)
				return FALSE;
	}
	else
	{
		for(int i=0;i<=x;i++)
			if(m_Player[y*m_nCol+i]>-1)
				return FALSE;
	}
	return TRUE;
}

BOOL CPocketLianDlg::YThrough(int x, int y,BOOL bAdd)
{
	if(bAdd)
	{
		for(int i=y;i<m_nRow;i++)
			if(m_Player[i*m_nCol+x]>-1)
				return FALSE;
	}
	else
	{
		for(int i=0;i<=y;i++)
			if(m_Player[i*m_nCol+x]>-1)
				return FALSE;
	}
	return TRUE;
}

BOOL CPocketLianDlg::Pass(int x1, int y1, int x2, int y2)
{
	if(x1==x2)
	{
		if(X1EqualX2(x1,y1,y2))
			return TRUE;
	}
	else if(y1==y2)
	{
		if(Y1EqualY2(x1,x2,y1))
			return TRUE;
	}
	if(OnePlumb(x1,y1,x2,y2))
	{
		return TRUE;
	}
	else if(TwoPlumb(x1,y1,x2,y2))
	{
		return TRUE;
	}
	return FALSE;
}

BOOL CPocketLianDlg::PreTranslateMessage(MSG* pMsg) 
{
	if(pMsg->message==WM_KEYDOWN)
	{
		if(pMsg->wParam==VK_F6)
		{
			BeginWaitCursor();
			int n=GetTickCount();
			srand(n);//time(NULL));
			int* p=m_Player;
			CDWordArray arPlayer;
			for(int i=0;i<m_nRow*m_nCol;i++)
			{
				if(p[i]>-1)
					arPlayer.Add(p[i]);
			}
			for(i=0;i<m_nRow*m_nCol;i++)
			{
				if(p[i]>-1)
				{
					int nIndex=(int(rand()*001+rand()*0.1+rand()))%arPlayer.GetSize();
					p[i]=arPlayer.GetAt(nIndex);
					arPlayer.RemoveAt(nIndex);
				}				
			}
			FillMemDC();
			EndWaitCursor();
			InvalidateRect(CRect(0,0,m_nCol*FRONTWIDTH+5,m_nRow*FRONTHEIGHT+5));
		}
		if(pMsg->wParam==VK_F5)
		{
			BOOL bFound=FALSE;
			int* p=m_Player;
			for(int i=0;i<m_nRow*m_nCol;i++)
			{
				if(bFound)
					break;
				if(p[i]==-1)
					continue;
				for(int j=i+1;j<m_nRow*m_nCol;j++)
				{
					if(p[j]>-1&&p[i]==p[j])
					{
						int x1=i%m_nCol,y1=i/m_nCol/*+(x1?1:0)*/,x2=j%m_nCol,y2=j/m_nCol/*+(x2?1:0)*/;
						if(Pass(x1,y1,x2,y2))
						{					
							//y1--;
							//							y2--;
							
							CClientDC dc(this);
							CBrush brush(RGB(255,0,0));
							dc.SelectObject(&brush);
							dc.Ellipse(x1*FRONTWIDTH,y1*FRONTHEIGHT,x1*FRONTWIDTH+10,y1*FRONTHEIGHT+10);	
							dc.Ellipse(x2*FRONTWIDTH,y2*FRONTHEIGHT,x2*FRONTWIDTH+10,y2*FRONTHEIGHT+10);	
							bFound=TRUE;
							break;
						}
					}
				}

			}
			if(!bFound)
			{
				MessageBox(L"No");
			}
		}
	}
	
	return CDialog::PreTranslateMessage(pMsg);
}

void CPocketLianDlg::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
	{
		CPaintDC dc(this); // device context for painting
		dc.BitBlt(0,0,m_nCol*FRONTWIDTH,m_nCol*FRONTHEIGHT,&m_MemDC,0,0,SRCCOPY);

		CDialog::OnPaint();
	}
	
	// Do not call CDialog::OnPaint() for painting messages
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -