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

📄 huanfangview.cpp

📁 一个关于幻方的小游戏
💻 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 + -