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

📄 canvasframe.cpp

📁 俄罗斯方块
💻 CPP
字号:
// canvasFrame.cpp : implementation file
//

#include "stdafx.h"
#include "canvasr.h"
#include "canvasFrame.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


/////////////////////////////////////////////////////////////////////////////
// canvasFrame
int x,y,kx,ky,ty,i,j,k,m,count;
bool keydown;
bool newpie;
bool cancel;
bool full;
bool restart;
int bottom[16];

struct piece
{
	int x;
	int y;
	int color;
};

piece pie;

struct occupy
{
	int x;
	int y;
	bool exist;
	int color;
};

occupy occ[20][16];

IMPLEMENT_DYNCREATE(canvasFrame, CFrameWnd)

canvasFrame::canvasFrame()
{
	Create(NULL,"ELS",WS_OVERLAPPED|WS_SYSMENU|WS_CAPTION,CRect(0,0,330,436));    
	CClientDC dc(this);
	int width = dc.GetDeviceCaps(HORZRES);
	int height = dc.GetDeviceCaps(VERTRES);
	GetWindowRect( &rect );
	width = ( width - ( rect.right - rect.left ))/2 ;
	height = (height - (rect.bottom - rect.top ))/2 ;
	MoveWindow( width , height , (rect.right - rect.left ) , (rect.bottom - rect.top ) ,true);
	GetClientRect(&rect);

	mdc = new CDC;
	mdc1 = new CDC;
	mdc->CreateCompatibleDC(&dc); //将mdc转换成与dc相容的DC
	mdc1->CreateCompatibleDC(&dc);
	temp = new CBitmap;
	temp->CreateCompatibleBitmap(&dc,rect.right,rect.bottom);
    mdc->SelectObject(temp);

	bg=new CBitmap;
	bg->m_hObject = (HBITMAP)::LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,rect.right,rect.bottom,LR_LOADFROMFILE); //载入背景图文件
	mp=new CBitmap;
	mp->m_hObject=(HBITMAP)::LoadImage(NULL,"m0.bmp",IMAGE_BITMAP,240,80,LR_LOADFROMFILE);
	char str[7];
    for(i=0;i<3;i++)
	{
		sprintf(str,"e%d.bmp",i);
		fk[i] = new CBitmap;
		fk[i]->m_hObject = (HBITMAP)::LoadImage(NULL,str,IMAGE_BITMAP,20,20,LR_LOADFROMFILE); 
    } 
	
		
	for(i=0;i<16;i++)
		bottom[i]=rect.bottom;

	for(i=0;i<20;i++)
		for(j=0;j<16;j++)
		{
			occ[i][j].exist=false;
			occ[i][j].color=0;
			occ[i][j].x=j*20;
			occ[i][j].y=i*20;
		}
    pie.color=rand()%3;
	x=rect.right/2;
	y=0;
	kx=20;
	ky=20;
	ty=20;
	keydown=false;
	newpie=true;
	cancel=false;
	full=false;
	restart=true;
}

canvasFrame::~canvasFrame()
{
	for(i=0;i<3;i++)
		delete fk[i];
	delete temp;
	delete mdc;
	delete mdc1;
	delete bg;
}

BEGIN_MESSAGE_MAP(canvasFrame, CFrameWnd)
	//{{AFX_MSG_MAP(canvasFrame)
	ON_WM_TIMER()
	ON_WM_CREATE()
	//}}AFX_MSG_MAP
	ON_WM_KEYDOWN()
	ON_WM_KEYUP()
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// canvasFrame message handlers

void canvasFrame::OnTimer(UINT nIDEvent) 
{
	CClientDC dc(this);

	if(!keydown)
	{
		mdc1->SelectObject(bg);
		mdc->BitBlt(0,0,rect.right,rect.bottom,mdc1,0,0,SRCCOPY);
	}//待修改

	for(i=0;i<16;i++)
	{
		if(bottom[i]<=0)
		{
			full=true;
			break;
		}
	}

	if(full)
	{
		newpie=false;
		cancel=false;
		restart=false;
	}

	if(keydown==false&&restart==false)
	{
		for(i=0;i<20;i++)
		{
			for(j=0;j<16;j++)
			{
				if(occ[i][j].exist)
				{
					mdc1->SelectObject(fk[occ[i][j].color]);
					mdc->BitBlt(occ[i][j].x,occ[i][j].y,20,20,mdc1,0,0,SRCCOPY);
				}
			}		
		
		}

		mdc1->SelectObject(fk[pie.color]);
		mdc->BitBlt(pie.x,pie.y,20,20,mdc1,0,0,SRCCOPY);	
	}

	if(keydown==false&&restart==false)
	{
		mdc1->SelectObject(mp);
		mdc->BitBlt(40,160,240,80,mdc1,0,0,SRCCOPY);
		dc.BitBlt(0,0,rect.right,rect.bottom,mdc,0,0,SRCCOPY);
	}
    
	if(restart)
	{
		if(!keydown)
		{
			pie.x=x;
			pie.y=y;
			y+=ty;
			
			if((pie.y+20)>=bottom[x/20])
			{
				pie.x=x;
				pie.y=bottom[pie.x/20]-20;
				bottom[pie.x/20]-=20;
				newpie=true;
				occ[pie.y/20][pie.x/20].exist=true;
				occ[pie.y/20][pie.x/20].color=pie.color;
			}

			if(newpie)
			{
				newpie=false;
				pie.color=rand()%3;
				pie.x=rect.right/2;
				pie.y=0;
				x=rect.right/2;
				y=0;
			} 

			for(i=0;i<20;i++)
			{
				for(j=0;j<16;j++)
				{
					if(occ[i][j].exist)
					{
						mdc1->SelectObject(fk[occ[i][j].color]);
						mdc->BitBlt(occ[i][j].x,occ[i][j].y,20,20,mdc1,0,0,SRCCOPY);
					}
				}		
			
			}
	        
			mdc1->SelectObject(fk[pie.color]);
			mdc->BitBlt(pie.x,pie.y,20,20,mdc1,0,0,SRCCOPY);	

			dc.BitBlt(0,0,rect.right,rect.bottom,mdc,0,0,SRCCOPY);	

			for(j=0;j<16;j++)
			{
				if(occ[19][j].exist==false)
					break;
			}

			if(j>=16)
				cancel=true;

			if(cancel)
			{
				for(k=19;k>0;k--)
				{
					for(m=0;m<16;m++)
					{
						occ[k][m].exist=occ[k-1][m].exist;
						if(occ[k-1][m].exist)
							occ[k][m].color=occ[k-1][m].color;
					}
				}

				for(j=0;j<16;j++)
				{
					occ[0][j].exist=false;
					bottom[j]=bottom[j]+20;
				}

				cancel=false;
			}

		}
	}
   

	CFrameWnd::OnTimer(nIDEvent);
}

int canvasFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	SetTimer(1,300,NULL);
	return 0;
}

void canvasFrame::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
	keydown=true;

	CClientDC dc(this);
	mdc1->SelectObject(bg);
	mdc->BitBlt(0,0,rect.right,rect.bottom,mdc1,0,0,SRCCOPY);

	for(i=0;i<16;i++)
	{
		if(bottom[i]<=0)
		{
			full=true;
			break;
		}
	}

	if(full)
	{
		newpie=false;
		cancel=false;
		restart=false;
	}

	if(restart==false)
	{
		for(i=0;i<20;i++)
		{
			for(j=0;j<16;j++)
			{
				if(occ[i][j].exist)
				{
					mdc1->SelectObject(fk[occ[i][j].color]);
					mdc->BitBlt(occ[i][j].x,occ[i][j].y,20,20,mdc1,0,0,SRCCOPY);
				}
			}		
		
		}

		mdc1->SelectObject(fk[pie.color]);
		mdc->BitBlt(pie.x,pie.y,20,20,mdc1,0,0,SRCCOPY);	
	}

	if(restart==false)
	{
		mdc1->SelectObject(mp);
		mdc->BitBlt(40,160,240,80,mdc1,0,0,SRCCOPY);
		dc.BitBlt(0,0,rect.right,rect.bottom,mdc,0,0,SRCCOPY);
	}

	if(restart)
	{
		if(nChar==VK_DOWN)
		{
			y+=ky;
			if(y+20>=bottom[x/20])
				y=bottom[x/20]-20;
		}

		if(nChar==VK_UP)
		{
			keydown=false;
		}

		if(nChar==VK_LEFT)
		{
			x-=kx;
			if(x<=0)
				x=0;
		}

		if(nChar==VK_RIGHT)
		{
			x+=kx;
			if(x+20>=rect.right)
				x=rect.right-20;
		}

		pie.x=x;
		pie.y=y;

		if((pie.y+20)>=bottom[x/20])
		{
			pie.x=x;
			pie.y=bottom[pie.x/20]-20;
			bottom[pie.x/20]-=20;
			occ[pie.y/20][pie.x/20].exist=true;
			occ[pie.y/20][pie.x/20].color=pie.color;
			newpie=true;
		}

		if(newpie)
		{
			newpie=false;
			pie.color=rand()%3;
			pie.x=rect.right/2;
			pie.y=0;
			x=rect.right/2;
			y=0;
		}    
		
		for(i=0;i<20;i++)
		{
			for(j=0;j<16;j++)
			{
				if(occ[i][j].exist)
				{
					mdc1->SelectObject(fk[occ[i][j].color]);
					mdc->BitBlt(occ[i][j].x,occ[i][j].y,20,20,mdc1,0,0,SRCCOPY);
				}
			}		
		
		}

		mdc1->SelectObject(fk[pie.color]);
		mdc->BitBlt(pie.x,pie.y,20,20,mdc1,0,0,SRCCOPY);	

		dc.BitBlt(0,0,rect.right,rect.bottom,mdc,0,0,SRCCOPY);

		for(j=0;j<16;j++)
		{
			if(occ[19][j].exist==false)
				break;
		}

		if(j>=16)
			cancel=true;

		if(cancel)
		{
			for(k=19;k>0;k--)
			{
				for(m=0;m<16;m++)
				{
					occ[k][m].exist=occ[k-1][m].exist;
					if(occ[k-1][m].exist)
						occ[k][m].color=occ[k-1][m].color;
				}
			}

			for(j=0;j<16;j++)
			{
				occ[0][j].exist=false;
				bottom[j]=bottom[j]+20;
			}

			cancel=false;
		}
	}

	if(nChar==VK_F1)
	{
		restart=true;
		full=false;

		for(i=0;i<16;i++)
			bottom[i]=rect.bottom;

		for(i=0;i<20;i++)
			for(j=0;j<16;j++)
			{
				occ[i][j].exist=false;
				occ[i][j].color=0;
				occ[i][j].x=j*20;
				occ[i][j].y=i*20;
			}

		pie.color=rand()%3;

		x=rect.right/2;
		y=0;
	}

	if(nChar==VK_ESCAPE)
			PostMessage(WM_CLOSE);

	CFrameWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}

void canvasFrame::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
	keydown=false;
	CFrameWnd::OnKeyUp(nChar, nRepCnt, nFlags);
}


⌨️ 快捷键说明

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