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

📄 ltldoc.cpp

📁 一个实现连连看游戏功能的程序。8*8的图片大小
💻 CPP
字号:
// LTLDoc.cpp : implementation of the CLTLDoc class
//

#include "stdafx.h"
#include "LTL.h"
#include "LTLDoc.h"
#include <time.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CLTLDoc

IMPLEMENT_DYNCREATE(CLTLDoc, CDocument)

BEGIN_MESSAGE_MAP(CLTLDoc, CDocument)
	//{{AFX_MSG_MAP(CLTLDoc)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CLTLDoc construction/destruction

CLTLDoc::CLTLDoc()
{
	Init();
}

CLTLDoc::~CLTLDoc()
{
}

BOOL CLTLDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)

	return TRUE;
}



/////////////////////////////////////////////////////////////////////////////
// CLTLDoc serialization

void CLTLDoc::Serialize(CArchive& ar)
{
//	CObject::Serialize(ar);
	if (ar.IsStoring())
	{	
		for(int i=0; i<10; i++)
			for(int j=0; j<14; j++)
				ar<<PicMark[i][j];
		int n = m_pointA.GetSize();
		ar<<n;
		for(i=0; i<n; i++)  		
			ar<<m_pointA[i];		
		ar<<disappear;
		ar<<overflag;
		ar<<Path[0];
		ar<<Path[1];
		ar<<pos;
		ar<<TimeUsed;
	}
	else
	{
		for(int i=0; i<10; i++)
			for(int j=0; j<14; j++)
				ar>>PicMark[i][j];
	   int n;
	   ar>>n;
	   m_pointA.RemoveAll();	  
	   for(i=0; i<n; i++)                        
		{
		   CPoint pt;ar>>pt;
		   m_pointA.Add(pt);
		}
		ar>>disappear;
		ar>>overflag;
		ar>>Path[0];
		ar>>Path[1];
		ar>>pos;
		ar>>TimeUsed;
	//	UpdateAllViews(NULL);
	}
}

/////////////////////////////////////////////////////////////////////////////
// CLTLDoc diagnostics

#ifdef _DEBUG
void CLTLDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CLTLDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CLTLDoc commands

bool CLTLDoc::IfLine(const CPoint& pt1, const CPoint& pt2, CPoint* Path)
{
	int i1 = pt1.y/64;                 //pt1
	int j1 = pt1.x/64;
	int i2 = pt2.y/64;                 //pt2
	int j2 = pt2.x/64;
	if(i1 == i2 && j1 == j2)            //重合
		return false;
	char t0 = PicMark[i1][j1];
	char t2 = PicMark[i2][j2];
	if(t0 != t2) return false;

	int i,j;
	int il,jl,ir,jr;                          //按左右或下上存放两点		
	CPoint pt;

    PicMark[i1][j1] = 0;
	PicMark[i2][j2] = 0;

	if(j1 != j2)                                      //列寻找路径
	{
		int u1,d1,u2,d2;
		if(j1 > j2){ jl = j2; il = i2; jr = j1; ir = i1;}       
		else { jl = j1; il = i1; jr = j2; ir = i2;}

		for(i=il-1,u1=il; i>=0; i--)       //从点l往上找最上端0点		
			if(PicMark[i][jl] != 0)
				break;
			else u1 = i;
		for(i=il+1,d1=il; i<10; i++)       //从点l往上找最下端0点		
			if(PicMark[i][jl] != 0)
				break;
			else d1 = i;
		for(i=ir-1,u2=ir; i>=0; i--)       //从点r往上找最上端0点		
			if(PicMark[i][jr] != 0)
				break;
			else u2 =i;
		for(i=ir+1,d2=ir; i<10; i++)       //从点r往上找最下端0点		
			if(PicMark[i][jr] != 0)
				break;
			else d2 = i;		
		if(u1 > d2 || d1 < u2)                 //此情况无解
			goto DOCOL;
		if(u1 < u2) u1 = u2;             //取大值
		if(d1 > d2) d1 = d2;             //取小值
		for(i=d1; i>=u1; i--)
		{
			for(j=jl; j<=jr; j++)
				if(PicMark[i][j] != 0)
					break;
			if(j != jr+1) continue;
			Path[0].x = j1*64; Path[0].y = i*64;
			Path[1].x = j2*64; Path[1].y = i*64;
			goto ENDT;
		}
	}
DOCOL:
	if(i1 != i2)                                      //行寻找路径
	{
		int l1,r1,l2,r2;
		if(i1 < i2){ il = i2; ir = i1; jl = j2; jr = j1;}    //下面的点在l 上面的点在r  
		else { il = i1; ir = i2; jl = j1; jr = j2;}
		
		for(j=jl-1,l1=jl; j>=0; j--)       //从点l往左找最左端0点		
			if(PicMark[il][j] != 0)
				break;
			else l1 = j;
		for(j=jl+1,r1=jl; j<14; j++)       //从点l往右找最右端0点		
			if(PicMark[il][j] != 0)
				break;
			else r1 = j;
    	for(j=jr-1,l2=jr; j>=0; j--)       //从点r往左找最左端0点		
			if(PicMark[ir][j] != 0)
				break;
			else l2 = j;
		for(j=jr+1,r2=jr; j<14; j++)       //从点r往右找最右端0点		
			if(PicMark[ir][j] != 0)
				break;
			else r2 = j;
		if(r1 < l2 || l1 > r2)                 //此情况无解
			goto ENDF;	
		if(l1 < l2) l1 = l2;             //取大值
		if(r1 > r2) r1 = r2;             //取小值

		for(j=l1; j<=r1; j++)
		{
			for(i=il; i>=ir; i--)
				if(PicMark[i][j] != 0)
					break;
			if(i != ir-1) continue;
			Path[0].x = j*64; Path[0].y = i1*64;
			Path[1].x = j*64; Path[1].y = i2*64;
			goto ENDT;
		}
	}
ENDF:
	PicMark[i1][j1] = t0;
	PicMark[i2][j2] = t2;
	return false;
ENDT:
	PicMark[i1][j1] = t0;
	PicMark[i2][j2] = t2;
	return true;
}

void CLTLDoc::Init()
{
    m_pointA.SetSize(0);
	int PicUseTimes[16] = {0};
	char c;	 
	disappear = 0;
	srand(long(time(NULL)));
	for(int i=0; i<=9; i++)
		for(int j=0; j<=13; j++)
		{
			if(i == 0 || i == 9 || j == 0 || j== 13){
				PicMark[i][j] = 0;
				continue;
			}
			c = rand()%16+'a';				
			while(PicUseTimes[c-'a'] == 6)
			{
				c++;				
				if(c > 'p')
					c = 'a';
			}
			PicUseTimes[c-'a']++;
			PicMark[i][j] = c;
		}
}

⌨️ 快捷键说明

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