📄 huanfangview.cpp
字号:
// HuanFangView.cpp : implementation of the CHuanFangView class
//
#include "stdafx.h"
#include "HuanFang.h"
#include "HuanFangDoc.h"
#include "HuanFangView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
int m_width;
int m_heigth;
int num=3;
const int m_static=24;
int m_xchar=0;
int m_ychar=0;
CString m_number="0";
CPoint m_old;
int m_strTonum;
int *m1;
int *m2;
const CString szMsg1="F2 确认 F5 提示";
const char szMsg2[]="Delete 删除 Tab 下一格 clear 能清除所有填入的数";
int dangqianguan=1;
char SzBuffer[100];
/////////////////////////////////////////////////////////////////////////////
// CHuanFangView
IMPLEMENT_DYNCREATE(CHuanFangView, CView)
BEGIN_MESSAGE_MAP(CHuanFangView, CView)
//{{AFX_MSG_MAP(CHuanFangView)
ON_WM_CREATE()
ON_WM_KILLFOCUS()
ON_WM_SETFOCUS()
ON_WM_LBUTTONDOWN()
ON_WM_CHAR()
ON_COMMAND(ID_EDIT_CLEAR, OnEditClear)
ON_WM_KEYDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CHuanFangView construction/destruction
CHuanFangView::CHuanFangView()
{
// TODO: add construction code here
MessageBox("说明:这是一个趣味填数游戏。填入从1开始的连续自然数,且不能重复,要使每行每列及两斜对角均相等。",NULL,MB_OK);
MessageBox("功能键:F2 确定,填完后点击F2进行确定;DELETE 删除,先点击当前要删除的地方,然后点击DELETE键;F5 提示,即单击小方框;clear 可以清除所有填入的数。想在哪个地方填数,就用鼠标点击在那一小方格内!",NULL,MB_OK);
}
CHuanFangView::~CHuanFangView()
{
for(int i = 0 ; i < num ; i++)
{
delete[] huanfang[i];
delete[] B_huanfang[i];
}
delete[] huanfang;
delete[] B_huanfang;
delete[] m1;
delete[] m2;
}
BOOL CHuanFangView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CHuanFangView drawing
void CHuanFangView::OnDraw(CDC* pDC)
{
CHuanFangDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//CRect m_Rectangle;
CRect rectClient;
GetClientRect(&rectClient);
pDC->FillSolidRect(&rectClient, RGB(0xcc,0xcc,0xcc));
m_width=GetSystemMetrics(SM_CXSCREEN);
m_heigth=GetSystemMetrics(SM_CYSCREEN);
m_Rectangle.right=m_width/2+num*m_static/2;
m_Rectangle.left=m_width/2-num*m_static/2;
m_Rectangle.top=m_heigth/2-num*m_static/2;
m_Rectangle.bottom=m_heigth/2+num*m_static/2;
wsprintf(SzBuffer,"第 %d 关",dangqianguan);
if(num<14)
{
pDC->TextOut(m_width/2-24,m_heigth/5,SzBuffer);
}
else
{
pDC->TextOut(m_width/2-24,m_heigth/4,SzBuffer);
}
pDC->TextOut(m_width/5,3*m_heigth/4,szMsg1);
pDC->TextOut(m_width/5,3*m_heigth/4+16,szMsg2);
int i;
int j;
int n;
for(i=0;i<=num*m_static;)
{
pDC->MoveTo(m_Rectangle.left,m_Rectangle.top+i);
pDC->LineTo(m_Rectangle.right,m_Rectangle.top+i);
pDC->MoveTo(m_Rectangle.left+i,m_Rectangle.top);
pDC->LineTo(m_Rectangle.left+i,m_Rectangle.bottom);
i=i+m_static;
}
huanfang=new int* [num];
for(i=0;i<num;i++)
{
huanfang[i]=new int [num];
}
for(i=0;i<num;i++)
for(j=0;j<num;j++)
huanfang[i][j]=0;
int flag;
if(num%4==0)
flag=0;
else if(num%2==1)
flag=1;
else
flag=2;
switch(flag)
{
case 0:
for(i=0;i<num;i++)
for(j=0;j<num;j++)
{
if(abs(i-j)%4==0||(i+j)%4==3)
huanfang[i][j]=num*num-i*num-j;
else
huanfang[i][j]=num*i+j+1;
if(num<9)
{
if(j%4==0)
{
CString str;
str.Format("%d",huanfang[i][j]);
pDC->TextOut(m_Rectangle.left+i*m_static+1,
m_Rectangle.top+m_static/4+j*m_static,str);
}
}
else
MessageBox("请根据前两次填写过程找出规律,填写此空表。",NULL,MB_OK);
}
break;
case 1:
i=0;
j=num/2;
n=1;
huanfang[i][j]=n;
while(1)
{
if(i==0&&j==num-1)
{
i=i+1; n=n+1;
huanfang[i][j]=n;
if(n==num*num)
break;}
else if(i==0)
{
i=num-1; j=j+1; n=n+1;
huanfang[i][j]=n;
if(n==num*num)
break;}
else
if(j==num-1)
{
i=i-1; j=0; n=n+1;
huanfang[i][j]=n;
if(n==num*num)
break;}
else
if(huanfang[i-1][j+1]!=0)
{
i=i+1; n=n+1;
huanfang[i][j]=n;
if(n==num*num)
break;}
else
{
i=i-1; j=j+1; n=n+1;
huanfang[i][j]=n;
if(n==num*num)
break;}
}
if(num<9)
{
for(i=0;i<num;i++)
for(j=0;j<num;j++)
if(j%2==0)
{
CString str1;
str1.Format("%d",huanfang[i][j]);
pDC->TextOut(m_Rectangle.left+i*m_static+1,
m_Rectangle.top+m_static/4+j*m_static,str1);
}
}
else
MessageBox("请根据前三次填写过程找出规律,填写此表。",NULL,MB_OK);
break;
case 2:
int m1=num/2;
int m2=m1/2;
n=0;
for(i=0;i<=m1;)
{
int m_init_hang=i;
for(j=0;j<=m1;)
{
i=m_init_hang;
int m_init_lie=j;
j=j+m1/2; n=n+1;
huanfang[i][j]=n;
while(1)
{
if(i==m_init_hang&&j==m_init_lie+m1-1)
{
i=i+1; n=n+1;
huanfang[i][j]=n;
if(n==m1*m1||n==2*m1*m1||n==3*m1*m1||n==4*m1*m1)
break;}
else if(i==m_init_hang)
{
i=m_init_hang+m1-1; j=j+1; n=n+1;
huanfang[i][j]=n;
if(n==m1*m1||n==2*m1*m1||n==3*m1*m1||n==4*m1*m1)
break;}
else if(j==m_init_lie+m1-1)
{
i=i-1; j=m_init_lie; n=n+1;
huanfang[i][j]=n;
if(n==m1*m1||n==2*m1*m1||n==3*m1*m1||n==4*m1*m1)
break;}
else if(huanfang[i-1][j+1]!=0)
{
i=i+1; n=n+1;
huanfang[i][j]=n;
if(n==m1*m1||n==2*m1*m1||n==3*m1*m1||n==4*m1*m1)
break;}
else
{
i=i-1; j=j+1; n=n+1;
huanfang[i][j]=n;
if(n==m1*m1||n==2*m1*m1||n==3*m1*m1||n==4*m1*m1)
break;}
}
j=m_init_lie+m1;
}
i=m_init_hang+m1;
}
int m_exchange;
for(i=0;i<m1;i++)
for(j=0;j<m1;j++)
{
m_exchange=huanfang[i][j];
huanfang[i][j]=huanfang[i][j+m1];
huanfang[i][j+m1]=m_exchange;
}
for(i=0;i<m1;i++)
for(j=0;j<m1;j++)
{
m_exchange=huanfang[i][j+m1];
huanfang[i][j+m1]=huanfang[i+m1][j];
huanfang[i+m1][j]=m_exchange;
}
for(i=0;i<=m2+1;i++)
for(j=0;j<m1;j++)
{
m_exchange=huanfang[i][j];
huanfang[i][j]=huanfang[i][j+m1];
huanfang[i][j+m1]=m_exchange;
}
for(i=m1/2+1;i<m1;i++)
for(j=0;j<m1;j++)
{
m_exchange=huanfang[i+m1][j];
huanfang[i+m1][j]=huanfang[i+m1][j+m1];
huanfang[i+m1][j+m1]=m_exchange;
}
m_exchange=huanfang[m1+m1/2][m1/2];
huanfang[m1+m1/2][m1/2]=huanfang[m1+m1/2][m1+m1/2];
huanfang[m1+m1/2][m1+m1/2]=m_exchange;
m_exchange=huanfang[num-1][m1/2];
huanfang[num-1][m1/2]=huanfang[num-1][m1+m1/2];
huanfang[num-1][m1+m1/2]=m_exchange;
if(num<12)
{
for(i=0;i<num;i++)
for(j=0;j<num;j++)
if(j%2==0)
{
CString str2;
str2.Format("%d",huanfang[i][j]);
pDC->TextOut(m_Rectangle.left+i*m_static+1,
m_Rectangle.top+m_static/4+j*m_static,str2);
}
}
else
MessageBox("请根据前两次的填写过程找出规律,填写此表。",NULL,MB_OK);
break;
}
B_huanfang=new int* [num];
for(i=0;i<num;i++)
{
B_huanfang[i]=new int [num];
}
for(i=0;i<num;i++)
for(j=0;j<num;j++)
B_huanfang[i][j]=huanfang[i][j];
}
/////////////////////////////////////////////////////////////////////////////
// CHuanFangView diagnostics
#ifdef _DEBUG
void CHuanFangView::AssertValid() const
{
CView::AssertValid();
}
void CHuanFangView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CHuanFangDoc* CHuanFangView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CHuanFangDoc)));
return (CHuanFangDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CHuanFangView message handlers
void CHuanFangView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
int m_x=point.x;
int m_y=point.y;
if(m_x>m_Rectangle.left
&&m_x<m_Rectangle.right
&&m_y>m_Rectangle.top
&&m_y<m_Rectangle.bottom)
{
for(int i=0;i<num;i++)
for(int j=0;j<num;j++)
if(m_x>m_Rectangle.left+j*m_static
&&m_x<m_Rectangle.left+(j+1)*m_static
&&m_y>m_Rectangle.top+i*m_static
&&m_y<m_Rectangle.top+(i+1)*m_static)
{
m_adrmode.x=m_Rectangle.left+j*m_static;
m_adrmode.y=m_Rectangle.top+i*m_static+m_static/4;
SetCaretPos(m_adrmode);
ShowCaret();
}
}
else
{
::MessageBeep(MB_OK);
return;
}
//CView::OnLButtonDown(nFlags,m_adrmode);
}
int CHuanFangView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
CClientDC ClientDC(this);
TEXTMETRIC TM;
ClientDC.GetTextMetrics(&TM);
m_xchar=TM.tmAveCharWidth/3;
m_ychar=TM.tmHeight+TM.tmExternalLeading;
return 0;
}
void CHuanFangView::OnKillFocus(CWnd* pNewWnd)
{
CView::OnKillFocus(pNewWnd);
// TODO: Add your message handler code here
::DestroyCaret();
}
void CHuanFangView::OnSetFocus(CWnd* pOldWnd)
{
CView::OnSetFocus(pOldWnd);
// TODO: Add your message handler code here
CreateSolidCaret(m_xchar,m_ychar);
SetCaretPos(m_adrmode);
ShowCaret();
}
void CHuanFangView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
if(nChar<32)
{
::MessageBeep(MB_OK);
return;
}
CHuanFangDoc *PDoc=GetDocument();
CClientDC ClientDC(this);
ClientDC.SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
ClientDC.SetBkMode(TRANSPARENT);
HideCaret();
ClientDC.TextOut(m_adrmode.x,m_adrmode.y,nChar);
if((m_adrmode.x-m_Rectangle.left)%m_static==0)
{
m_old=m_adrmode;
if(m_number!="0")
{
CString str;
m_strTonum=atoi(m_number.GetBuffer(0));
huanfang[m_ychar][m_xchar]=m_strTonum;
str.Format("%d",m_strTonum);
// MessageBox(str,NULL,MB_OK);
}
m_ychar=(m_adrmode.x-m_Rectangle.left)/m_static;
m_xchar=(m_adrmode.y-m_static/4-m_Rectangle.top)/m_static;
m_number=nChar;
}
else if((m_adrmode.x-m_old.x)==8)
{
m_old=m_adrmode;
m_number+=nChar;
}
if(m_ychar!=0&&m_xchar!=0)
{
m_strTonum=atoi(m_number.GetBuffer(0));
huanfang[m_ychar][m_xchar]=m_strTonum;
}
m_adrmode.x+=8;
SetCaretPos(m_adrmode);
ShowCaret();
CView::OnChar(nChar, nRepCnt, nFlags);
}
void CHuanFangView::OnEditClear()
{
// TODO: Add your command handler code here
CHuanFangDoc *PDoc=GetDocument();
PDoc->UpdateAllViews(NULL);
}
void CHuanFangView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
if(nChar==VK_DELETE)
{
HBRUSH hBrush=CreateSolidBrush(RGB(0xcc,0xcc,0xcc));
RECT m_cover;
m_ychar=(m_adrmode.x-m_Rectangle.left)/m_static;
m_xchar=(m_adrmode.y-m_static/4-m_Rectangle.top)/m_static;
m_cover.left=m_Rectangle.left+m_ychar*m_static+4;
m_cover.top=m_Rectangle.top+m_xchar*m_static+4;
m_cover.right=m_Rectangle.left+(m_ychar+1)*m_static+2;
m_cover.bottom=m_Rectangle.top+(m_xchar+1)*m_static;
//HDC hdc=::GetDC(hWnd);
CWindowDC dc(this);//this为当前窗口指针
HDC hDC=dc.GetSafeHdc();
FillRect(hDC,&m_cover,hBrush);
// MessageBox("press on",NULL,MB_OK);
}
if(nChar==VK_TAB)
{
if(m_adrmode.x>=m_Rectangle.left+(num-1)*m_static&&
m_adrmode.y<m_Rectangle.top+(num-1)*m_static)
{
m_adrmode.x=m_Rectangle.left;
m_adrmode.y+=m_static;
SetCaretPos(m_adrmode);
ShowCaret();
}
else if(m_adrmode.x<m_Rectangle.left+(num-1)*m_static)
{
int times=(m_adrmode.x-m_Rectangle.left)/m_static;
m_adrmode.x=m_Rectangle.left+(times+1)*m_static;
SetCaretPos(m_adrmode);
ShowCaret();
}
else
{
m_adrmode.x=m_Rectangle.left;
m_adrmode.y=m_Rectangle.top+m_static/4;
SetCaretPos(m_adrmode);
ShowCaret();
}
}
if(nChar==VK_F2)
{
int m_aque=(num*num+1)*num/2;
int i;
int j;
int m_zuoxie=0;
int m_youxie=0;
m1=new int [num];
m2=new int [num];
//在此初始化
for(i=0;i<num;i++)
{
m1[i]=0;
m2[i]=0;
m_zuoxie+=huanfang[i][i];
m_youxie+=huanfang[i][num-1-i];
}
for(i=0;i<num;i++)
for(j=0;j<num;j++)
{
m1[i]+=huanfang[i][j];
m2[i]+=huanfang[j][i];
}
int m_flag;
for(i=0;i<num;i++)
{
if(m1[i]==m_aque&&m2[i]==m_aque)
m_flag=1;
else
{
m_flag=0;
break;
}
}
if(m_flag==1&&m_zuoxie==m_aque&&m_youxie==m_aque)
{
if(num!=12)
{
dangqianguan++;
MessageBox("恭喜你,过关了",NULL,MB_OK);
if(num%2==1&&num<9)
{
num+=2;
SendMessage(WM_PAINT,0,0);
CDC *pDC=GetDC();
OnDraw(pDC);
ReleaseDC(pDC);
}
else if(num==9)
{
num=6;
SendMessage(WM_PAINT,0,0);
CDC *pDC=GetDC();
OnDraw(pDC);
ReleaseDC(pDC);
}
else if(num%4!=0&&num<14)
{
num+=4;
SendMessage(WM_PAINT,0,0);
CDC *pDC=GetDC();
OnDraw(pDC);
ReleaseDC(pDC);
}
else if(num==14)
{
num=4;
SendMessage(WM_PAINT,0,0);
CDC *pDC=GetDC();
OnDraw(pDC);
ReleaseDC(pDC);
}
else if(num%4==0&&num<12)
{
num+=4;
SendMessage(WM_PAINT,0,0);
CDC *pDC=GetDC();
OnDraw(pDC);
ReleaseDC(pDC);
}
}
else
{
dangqianguan=1;
MessageBox("恭喜你,通关了!",NULL,MB_OK);
}
}
else
{
MessageBox("对不起,有错误,请重新填写!",NULL,MB_OK);
SendMessage(WM_PAINT,0,0);
CDC *pDC=GetDC();
OnDraw(pDC);
ReleaseDC(pDC);
}
}
if(nChar==VK_F5)
{
int x_i,x_j;
CString TiShiZhi;
CDC *pDC=GetDC();
x_i=(m_adrmode.x-m_Rectangle.left)/m_static;
x_j=(m_adrmode.y-m_static/4-m_Rectangle.top)/m_static;
huanfang[x_i][x_j]=B_huanfang[x_i][x_j];
TiShiZhi.Format("%d",B_huanfang[x_i][x_j]);
pDC->TextOut(m_adrmode.x,m_adrmode.y,TiShiZhi);
}
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -