📄 pocketliandlg.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 + -