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

📄 llkdlg.cpp

📁 一款很不错的evc下运行的游戏
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		{
			if (GetPicIndex(i, j) > 0)
			{
				if ((GetValue(i, j) & LS_CLICK) == LS_CLICK)
				{
					pDC->BitBlt(TILEX(j), TILEY(i), PIC_WIDTH, PIC_HEIGHT, 
					&HeadDC, PIC_WIDTH * (GetPicIndex(i, j) - 1), 0, SRCCOPY);
				}
				else
				{
					pDC->BitBlt(TILEX(j), TILEY(i),PIC_WIDTH, PIC_HEIGHT,
					&FaceDC, PIC_WIDTH * (GetPicIndex(i, j) - 1), 0, SRCCOPY);
				}
			}
		}
	}  
	CPen pen( PS_SOLID ,2,RGB(0,0,255));
	CPen *pOldPen = pDC->SelectObject(&pen); 

	if (!m_nButton && !m_bMouse)                   //判断是否绘选择框
    {    
		pDC->MoveTo(m_nPane_x+14, m_nPane_y+55);
		pDC->LineTo(m_nPane_x+38, m_nPane_y+55);
		pDC->MoveTo(m_nPane_x+38, m_nPane_y+54);
		pDC->LineTo(m_nPane_x+38, m_nPane_y+87);
		pDC->LineTo(m_nPane_x+13, m_nPane_y+87);
		pDC->LineTo(m_nPane_x+14, m_nPane_y+54);
    }

	HeadDC.DeleteDC();
	FaceDC.DeleteDC();
	facebmp.DeleteObject();
	headbmp.DeleteObject();
	pOldPen->DeleteObject();
}

int CLlkDlg::GetValue(int x, int y)					//得到坐标值
{
	return CJL_MAP[x][y];	
}

void CLlkDlg::StartGame()                           //产生随机位图
{
    int i, j;
	int temprand;

	for (i = 1; i <= ROW_NUMBER ; i++)
	{
		for (j = 1; j <= LINE_NUMBER ; j++)
		{ 
			while (1)
			{
				temprand = Random() % 21;			//随机产生21张位图中的1张
						
				if (PIC_INDEX[temprand] < 4 )		//位图使用次数小于4
				 {				
					PIC_INDEX[temprand]++;
			     	CJL_MAP[i][j] |= temprand + 1;  //选择位图
					break;
				 }				
			}
		}
	}
	InitEvent();
	ListPicPlace();
}

void CLlkDlg::InitEvent()							//初始化事件
{
	int i, x = 0, y = 0, tempx, tempy;
	int randevent, randplace;
	
	int EVENT[4] = {LS_NONE, LS_PROMPT, LS_SHUFFLE, LS_SCORE}; //事件("无","提示","洗牌","加分")

	for (i = 0; i < 4; i++)  
	{
		randplace = Random() % (ROW_NUMBER * LINE_NUMBER) + 1;
     	tempy = randplace % LINE_NUMBER; 
    	tempx = randplace / LINE_NUMBER;
		if (tempx != x && tempy !=y)
		{
			x = tempx;  
			y = tempy;
			randevent = Random() % 4;  
			CJL_MAP[tempx][tempy] |= EVENT[randevent];			
		}
	}

}

void CLlkDlg::InitMap()                             //初始化位图
{
	int i, j;
	for(i = 0; i < VIRTUAL_ROW; i++)
	{
		for(j = 0; j < VIRTUAL_LINE; j++)
		{
			CJL_MAP[i][j] = 0;
		}
	}

	for(i = 0; i < 28; i++)
    {
		PIC_INDEX[i] = 0;
		PIC_PLACE[i + 1] = NULL;
	}
	PIC_PLACE[0] = NULL;

}

void CLlkDlg::ListPicPlace()                        //设置位图
{	
	int i, j;
	for (i = 1; i < ROW_NUMBER; i++)
	{
		for (j = 1; j < LINE_NUMBER; j++)
		{
			if (GetPicIndex(i, j) > 0)
			{
				AddPicPlace(i, j);
			}
		}
	}

}

void CLlkDlg::AddPicPlace(int x, int y)				//链表中增加位图
{
	int nIndex = GetPicIndex(x, y);

	LPCJL_PATH pPic;

	if ((pPic = (LPCJL_PATH) GlobalAlloc(GPTR, sizeof(CJL_PATH))) == NULL)
	{
		printf("GlobalAlloc() failed with error %d\n", GetLastError());
		return;
	}
	
	pPic->x = x;
	pPic->y = y;
	pPic->prev = PIC_PLACE[nIndex];
	PIC_PLACE[nIndex] = pPic;
}

int CLlkDlg::GetPicIndex(int x, int y)				//得到当前的位图标识
{
    int nVal = GetValue(x, y);
	int nRes = nVal & 255;
	return nRes;
}

void CLlkDlg::AddTime()								//增加时间函数
{  	
	if (m_nMin != 2)
	{	
		m_nSec2 += 2;                               //一次增加2秒
		if(m_nSec2 >= 10)
		{
			m_nSec1++;
	   		m_nSec2 %= 10;

			if (m_nSec1 == 6)
			{
				m_nMin++;
				m_nSec1 = 0;
				if (m_nMin == 2)                   
				{
					m_nMin = 2;
					m_nSec1 = 0;
					m_nSec2 = 0;
				}
			}

		}
		if (m_nPos)                               
		{
			m_nPos -= (m_nSpeed * 2);              //时间条前移2单位
			if (m_nPos <= 0)
			m_nPos = 0;
		}
	}
}

BOOL CLlkDlg::CheckConn(int x1, int y1, int x2, int y2)    //判断是否可连
{
   if (CheckLineConn(x1, y1, x2, y2))
	{
		return TRUE;
	}
	else if (CheckOneDotConn(x1, y1, x2, y2))
	{
		return TRUE;
	}
	else if (CheckTwoDotConn(x1, y1, x2, y2))
	{
		return TRUE;
	}
	return FALSE;
}

BOOL CLlkDlg::CheckLineConn(int x1, int y1, int x2, int y2)   //判断连接是否为一条线
{
	if (x1 != x2 && y1 != y2)
		return FALSE;

	int i, nMax, nMin;
	BOOL bConn;

	bConn = TRUE;
	if (x1 == x2)	
	{   
		nMax = max(y1, y2);
        nMin = min(y1, y2);
		for (i = 1; i < nMax - nMin; i++)
		{
			if (GetPicIndex(x1, nMin + i) != 0)
			{
				bConn = FALSE;
			}
		}
		return bConn;
        
	}

	bConn = TRUE;
	if (y1 == y2)
	{   
        nMax = max(x1, x2);
        nMin = min(x1, x2);
		for (i = 1; i < nMax - nMin; i++)
		{
			if (GetPicIndex(nMin + i, y1) != 0) 
			{
				bConn = FALSE;
			}
		}
		return bConn;
	}
	return bConn;
}

BOOL CLlkDlg::CheckOneDotConn(int x1, int y1, int x2, int y2)	//判断连接是否为一个拐点
{
	int xMin, xMax, yMin, yMax;
	xMin = min(x1, x2);
	xMax = max(x1, x2);
	yMin = min(y1, y2);
	yMax = max(y1, y2);

	if ((x1 < x2 && y1 < y2) || (x1 > x2 && y1 > y2))
	{
		if (CheckLineConn(xMin, yMin, xMax + 1, yMin) 
			&& CheckLineConn(xMax, yMin - 1, xMax, yMax))
		{
			return TRUE;
		}

		if (CheckLineConn(xMin, yMin, xMin, yMax + 1) 
			&& CheckLineConn(xMin -1, yMax, xMax, yMax))
		{
			return TRUE;
		}
	}

	if ((x1 > x2 && y1 < y2) || (x1 < x2) && (y1 > y2))
	{
		if (CheckLineConn(xMax, yMin, xMin - 1, yMin)
			&& CheckLineConn(xMin, yMin - 1, xMin, yMax))
		{
			return TRUE;
		}

		if (CheckLineConn(xMax, yMin, xMax, yMax + 1)
			&& CheckLineConn(xMax + 1, yMax, xMin, yMax))
		{
			return TRUE;
		}
	}
	return FALSE;
}

BOOL CLlkDlg::CheckTwoDotConn(int x1, int y1, int x2, int y2)	//判断连接是否为两个拐点
{
	int xMin, xMax, yMin, yMax, i;
		
	xMin = min(x1, x2);
	xMax = max(x1, x2);
	yMin = min(y1, y2);
	yMax = max(y1, y2);

	if ((x1 <= x2 && y1 <= y2) || (x1 >= x2 && y1 >= y2))
	{

		for (i = 1; i <= yMax - yMin; i++)
		{
			if (CheckLineConn(xMin, yMin, xMin, yMin + i + 1)
				&& CheckLineConn(xMin - 1, yMin + i, xMax + 1, yMin + i) 
				&& CheckLineConn(xMax, yMin + i -1, xMax, yMax))
			{
				return TRUE;
			}
		}

		for (i = 1; i <= xMax - xMin; i++)
		{
			if (CheckLineConn(xMin, yMin, xMin + i + 1, yMin)
				&& CheckLineConn(xMin + i, yMin - 1, xMin + i, yMax + 1) 
				&& CheckLineConn(xMin + i -1, yMax, xMax, yMax))
			{
				return TRUE;
			}
		}
		
		if (CheckLineConn(xMax, yMin, xMax, yMax))
		{
			for (i = 1; i <= yMin; i++)
			{
				if (CheckLineConn(xMin, yMin, xMin, yMin - i) 
					&& CheckLineConn(xMin - 1, yMin - i, xMax + 1, yMin - i)
					&& CheckLineConn(xMax, yMin - i, xMax, yMax))
				{
					return TRUE;
				}
			}
		}

		if (CheckLineConn(xMin, yMin, xMin, yMax))
		{
			for (i = 1; i<= VIRTUAL_LINE - yMax; i++)
			{
				if (CheckLineConn(xMin, yMin, xMin, yMax + i) 
					&& CheckLineConn(xMin - 1, yMax + i, xMax + 1, yMax + i)
					&& CheckLineConn(xMax, yMax + i, xMax, yMax))
				{
					return TRUE;
				}
			}
		}

		if (CheckLineConn(xMin, yMax, xMax, yMax))
		{
			for (i = 1; i<= xMin; i++)
			{
				if (CheckLineConn(xMin, yMin, xMin - i, yMin) 
					&& CheckLineConn(xMin - i, yMin - 1, xMin - i, yMax + 1)
					&& CheckLineConn(xMin - i, yMax, xMax, yMax))
				{
					return TRUE;
				}
			}
		}

		if (CheckLineConn(xMin, yMin, xMax, yMin))
		{
			for (i = 1; i<= VIRTUAL_ROW - xMax; i++)
			{
				if (CheckLineConn(xMin, yMin, xMax + i, yMin) 
					&& CheckLineConn(xMax + i, yMin - 1, xMax + i, yMax + 1)
					&& CheckLineConn(xMax + i, yMax, xMax, yMax))
				{
					return TRUE;
				}
			}
		}
	}
	else
	{
		for (i = 1; i <= yMax - yMin; i++)
		{
			if (CheckLineConn(xMax, yMin, xMax, yMin + i + 1)
				&& CheckLineConn(xMax + 1, yMin + i, xMin - 1, yMin + i) 
				&& CheckLineConn(xMin, yMin + i -1, xMin, yMax))
			{
				return TRUE;
			}
		}
		
		for (i = 1; i <= xMax - xMin; i++)
		{
			if (CheckLineConn(xMin, yMax, xMin + i + 1, yMax)
				&& CheckLineConn(xMin + i, yMin - 1, xMin + i, yMax + 1) 
				&& CheckLineConn(xMin + i -1, yMin, xMax, yMin))
			{
				return TRUE;
			}
		}

		if (CheckLineConn(xMin, yMax, xMin, yMin))
		{
			for (i = 1; i <= yMin; i++)
			{
				if (CheckLineConn(xMin, yMax, xMin, yMin - i) 
					&& CheckLineConn(xMin - 1, yMin - i, xMax + 1, yMin - i)
					&& CheckLineConn(xMax, yMin - i, xMax, yMin))
				{
					return TRUE;
				}
			}
		}

		if (CheckLineConn(xMax, yMin, xMax, yMax))
		{
			for (i = 1; i <= VIRTUAL_LINE - yMax; i++)
			{
				if (CheckLineConn(xMin, yMax, xMin, yMax + i) 
					&& CheckLineConn(xMin - 1, yMax + i, xMax + 1, yMax + i)
					&& CheckLineConn(xMax, yMax + i, xMax, yMin))
				{
					return TRUE;
				}
			}
		}

		if (CheckLineConn(xMax, yMin, xMin, yMin))
		{
			for (i = 1; i <= xMin; i++)
			{
				if (CheckLineConn(xMin, yMax, xMin - i, yMax) 
					&& CheckLineConn(xMin - i, yMax + 1, xMin - i, yMin - 1)
					&& CheckLineConn(xMin - i, yMin, xMax, yMin))
				{
					return TRUE;
				}
			}
		}

		if (CheckLineConn(xMin, yMax, xMax, yMax))
		{
			for (i = 1; i <= VIRTUAL_ROW - xMax; i++)
			{
				if (CheckLineConn(xMin, yMax, xMax + i, yMax) 
					&& CheckLineConn(xMax + i, yMax + 1, xMax + i, yMin - 1)
					&& CheckLineConn(xMax + i, yMin, xMax, yMin))
				{
					return TRUE;
				}
			}
		}
	}
	return FALSE;
}
void CLlkDlg::DrawSemiTransparentRect(CDC *pDstDC, CRect rtTran, COLORREF clrSrc)	//半透明函数
{
	int nSavedDC = pDstDC->SaveDC();//保存原始DC

	int nWidth   = rtTran.Width();//半透明区域的宽度
	int nHeight  = rtTran.Height();//半透明区域的高度

	//拷屏 , 新建一个DC来拷贝目标区域
	CDC  bmpDC;
	bmpDC.CreateCompatibleDC(pDstDC);
	CBitmap  bmp ;

	bmp.CreateCompatibleBitmap(pDstDC , nWidth , nHeight);
	CBitmap* pOldBmp = (CBitmap*)bmpDC.SelectObject(&bmp);
	bmpDC.BitBlt(0 , 0 , nWidth , nHeight , pDstDC , rtTran.left , rtTran.top , SRCCOPY);

	//获取bmpDC中的图形数据到BYTE数组
	HDC hDIBDC = CreateCompatibleDC(NULL);

	BITMAPINFO hdr; 
	ZeroMemory(&hdr , sizeof(BITMAPINFO));

	hdr.bmiHeader.biSize         =  sizeof(BITMAPINFOHEADER);
	hdr.bmiHeader.biWidth      =  nWidth;
	hdr.bmiHeader.biHeight     =  nHeight;
	hdr.bmiHeader.biPlanes     =  1;
	hdr.bmiHeader.biBitCount =  32;
//这里统一用32位图形 ,原因是32位图形结构相对固定 , 每个
//像素用4个字节表示 。每行末尾不需要添加额外的字节。
//而24位图形 , 每行末尾需要添加额外的字节 , 以保证每行的
//字节数是4的整数倍
//如果想缩减开销和字节数 , 可以采用24位的图形 ,不过就会多
//出一些判断添加额外自己的代码 。

	BYTE * pbtPixels = NULL ; 
	HBITMAP hDIBitmap  =  CreateDIBSection(hDIBDC,(BITMAPINFO *)&hdr,DIB_RGB_COLORS,(void **)&pbtPixels,NULL,0);
	HBITMAP hOldBmp = (HBITMAP)SelectObject(hDIBDC, hDIBitmap);
	BitBlt(hDIBDC,0,0,nWidth,nHeight,bmpDC.m_hDC,0,0,SRCCOPY);
	SelectObject(hDIBDC, hOldBmp);

      
	//对BYTE数组进行Alpha混和
	int nPixelSize = 4 ;//每个像素点用4个字节来存储

	BYTE btSR = GetRValue(clrSrc);
	BYTE btSG = GetGValue(clrSrc);
	BYTE btSB = GetBValue(clrSrc);

	for(int i = 0 ; i < nHeight ; i ++)
	{
		for(int j = 0 ;  j < nWidth ; j ++)
		{
   
			BYTE btB = pbtPixels[i *  nWidth * nPixelSize   + j * nPixelSize  ] ;
			BYTE btG = pbtPixels[i *  nWidth * nPixelSize   + j * nPixelSize + 1 ] ;
			BYTE btR = pbtPixels[i *  nWidth * nPixelSize   + j * nPixelSize + 2 ] ;

			 
			btB = (btSB + btB ) >> 1 ; 
			btG = (btSG + btG ) >> 1 ; 
			btR = (btSR + btR ) >> 1 ; 
//          btB = btSB * 0.1 + (1-0.1) * btB;
//          btG = btSG * 0.1 + (1-0.1) * btG;
//          btR = btSR * 0.1 + (1-0.1) * btR;
			pbtPixels[i *  nWidth * nPixelSize   + j * nPixelSize  ]     = btB ;  
			pbtPixels[i *  nWidth * nPixelSize   + j * nPixelSize + 1 ] = btG ; 
			pbtPixels[i *  nWidth * nPixelSize   + j * nPixelSize + 2 ] = btR ;

		}
	}
    
	//绘制最终半透明图形到目标区域
	SetDIBitsToDevice(pDstDC->GetSafeHdc(),rtTran.left,rtTran.top,nWidth,nHeight,
		0,0,0,nHeight,(void*)pbtPixels,(BITMAPINFO*)&hdr,DIB_RGB_COLORS);
	//析构和清空
	bmpDC.SelectObject(pOldBmp);
	bmp.DeleteObject();
	delete [] pbtPixels ;
	bmpDC.DeleteDC();
	DeleteObject(hDIBDC);
	DeleteObject(hDIBitmap);
	pDstDC->RestoreDC(nSavedDC);//恢复初始DC
	pbtPixels=NULL;
}

void CLlkDlg::DrawTime(CDC *pDC, CString min, CString sec1, CString sec2)	//绘时间条
{
    CDC Mydc1,Mydc2;

	CBitmap TimeFram,TimeLable;
	TimeFram.LoadBitmap(IDB_TIMEFRAM);
	TimeLable.LoadBitmap(IDB_TIMELABLE);

	int time = int(155 - GetPos());
 
	Mydc1.CreateCompatibleDC(pDC);
	Mydc1.SelectObject(&TimeFram);	

	Mydc2.CreateCompatibleDC(pDC);

⌨️ 快捷键说明

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