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

📄 fk.cpp

📁 一个控制台VC++2005版的俄罗斯方块源码
💻 CPP
字号:
#include"FK.h"


CFK::CFK()
{
	srand(time(0));
	backColor=15;
	isfull[0]=false;
	isfull[1]=false;
	isfull[2]=false;
	isfull[3]=false;
	inIt();
	next();
}

CFK::~CFK()
{
}

void CFK::inIt()
{
	char fangKuaiModel[7][4][9]=
	{
		{"  ■    ",
		 "  ■■  ",
		 "    ■  ",
		 "        "},
		{"■■    ",
		 "  ■    ",
		 "  ■    ",
		 "        "},
		{"  ■    ",
		 "■■■  ",
		 "        ",
		 "        "},
		{"  ■■  ",
		 "  ■    ",
		 "  ■    ",
		 "        "},
		{"  ■    ",
		 "■■    ",
		 "■      ",
		 "        "},
		{"  ■■  ",
		 "  ■■  ",
		 "        ",
		 "        "},
		{"  ■    ",
		 "  ■    ",
		 "  ■    ",
		 "  ■    "}
	};

	nextFangKuaiIndex=rand()%7;
	nextFangKuaiColor=nextFangKuaiIndex+121;
	for(int i=0;i<4;++i)
	{
		strcpy(nextFangKuai[i],fangKuaiModel[nextFangKuaiIndex][i]);
	}
}

void CFK::next()
{
	for(int i=0;i<4;++i)
	{
		strcpy(fangKuai[i],nextFangKuai[i]);
	}
	for(int i=0;i<4;++i)
	{
		strcpy(oldFangKuai[i],fangKuai[i]);
	}	
	fangKuaiIndex=nextFangKuaiIndex;
	fangKuaiColor=nextFangKuaiColor;
	inIt();
	fangKuai_x=10;
	fangKuai_oldx=10;
	fangKuai_y=1;
	fangKuai_oldy=1;
	drawFangKuai();
	drawNextFangKuai();
}

void CFK::drawFangKuai()
{
	HANDLE hStd = GetStdHandle(STD_OUTPUT_HANDLE); // 获得输出句柄
	DWORD n;
	COORD pos ;				// 文本输出坐标
	WORD cs[2];
	for(int i=0;i<4;++i)
	{
		pos.X=fangKuai_x;
		pos.Y=fangKuai_y+i;
		for( const char* p=fangKuai[i];*p!=0;  )
		{
			if( *p > 0 ) //输出单字节字符
			{
				++p,++pos.X;
			}
			else //输出双字节字符
			{
				cs[0]=fangKuaiColor;
				cs[1]=fangKuaiColor;
				WriteConsoleOutputCharacterA(hStd, p, 2, pos, &n );
				WriteConsoleOutputAttribute(hStd, cs, 2, pos, &n );
				p+=2,pos.X+=2;
			}
		}		
	}	
	DeleteObject(hStd);
}

void CFK::moveFangKuai()
{
	HANDLE hStd = GetStdHandle(STD_OUTPUT_HANDLE); // 获得输出句柄
	DWORD n;
	COORD pos ;				// 文本输出坐标
	WORD cs[2]={backColor,backColor};
	for(int i=0;i<4;++i)//清除不重复格
	{
		pos.X=fangKuai_oldx;
		pos.Y=fangKuai_oldy+i;
		for( const char* p=oldFangKuai[i];*p!=0;  )
		{
			if( *p > 0 )
			{
				++p,++pos.X;
			}
			else
			{
				if(fangKuai_oldy-fangKuai_y+i<0
					||pos.X-fangKuai_x<0
					||pos.X-fangKuai_x>6
					||fangKuai[fangKuai_oldy-fangKuai_y+i][pos.X-fangKuai_x]==' ')
				{
					WriteConsoleOutputCharacterA(hStd, "  ", 2, pos, &n );
					WriteConsoleOutputAttribute(hStd, cs, 2, pos, &n );
				}				
				p+=2,pos.X+=2;
			}
		}		
	}

	for(int i=0;i<4;++i)//画不重复格
	{
		pos.X=fangKuai_x;
		pos.Y=fangKuai_y+i;
		for( const char* p=fangKuai[i];*p!=0;  )
		{
			if( *p > 0 ) //输出单字节字符
			{
				++p,++pos.X;
			}
			else //输出双字节字符
			{
				if(fangKuai_y-fangKuai_oldy+i>3
					||pos.X-fangKuai_oldx<0
					||pos.X-fangKuai_oldx>6
					||oldFangKuai[fangKuai_y-fangKuai_oldy+i][pos.X-fangKuai_oldx]==' ')
				{
				cs[0]=fangKuaiColor;
				cs[1]=fangKuaiColor;
				WriteConsoleOutputCharacterA(hStd, p, 2, pos, &n );
				WriteConsoleOutputAttribute(hStd, cs, 2, pos, &n );
				}
				p+=2,pos.X+=2;
			}
		}		
	}
	fangKuai_oldx=fangKuai_x;
	fangKuai_oldy=fangKuai_y;
	DeleteObject(hStd);
}

void CFK::drawNextFangKuai()
{
	HANDLE hStd = GetStdHandle(STD_OUTPUT_HANDLE); // 获得输出句柄
	DWORD n;
	COORD pos ;				// 文本输出坐标
	WORD cs[2]={nextFangKuaiColor,nextFangKuaiColor};
	for(int i=0;i<4;++i)
	{
		pos.X=29;
		pos.Y=3+i;
		for( const char* p=nextFangKuai[i];*p!=0;  )
		{
			if( *p > 0 ) //输出单字节字符
			{
				cs[0]=backColor;
				cs[1]=backColor;
				WriteConsoleOutputCharacterA(hStd, p, 1, pos, &n );
				WriteConsoleOutputAttribute(hStd, cs, 1, pos, &n );
				++p,++pos.X;
			}
			else //输出双字节字符
			{
				cs[0]=nextFangKuaiColor;
				cs[1]=nextFangKuaiColor;
				WriteConsoleOutputCharacterA(hStd, p, 2, pos, &n );
				WriteConsoleOutputAttribute(hStd, cs, 2, pos, &n );
				p+=2,pos.X+=2;
			}
		}		
	}	
	DeleteObject(hStd);
}

int CFK::moveDown()
{
	int score=0;
	for(int i=0;i<4;++i)
	{
		for(int j=3;j>=0;--j)
		{
			if(fangKuai[j][i*2]<0)
			{
				if(isCollied(fangKuai_x+i*2,fangKuai_y+j+1))
				{
					if(fangKuai_y==1)
					{
						score=-1;
						return score;
					}
					score=cleanLine()*100;
					next();
					return score;
				}
				break;
			}
		}
	}
	++fangKuai_y;
	moveFangKuai();
	return score;
}

int CFK::moveButton()
{
	int score=0;
	bool Collied=false;
	while(!Collied)
	{
		for(int i=0;i<4;++i)
		{
			for(int j=3;j>=0;--j)
			{
				if(fangKuai[j][i*2]<0)
				{
					if(Collied=isCollied(fangKuai_x+i*2,fangKuai_y+j+1))
					{
						if(fangKuai_y==1)
						{
							score=-1;
						return score;
						}
						score=cleanLine()*100;
						next();
						return score;
					}
					break;
				}
			}
		}
	++fangKuai_y;
	moveFangKuai();
	}
	
	return score;
}

void CFK::moveLeft()
{
	for(int i=0;i<4;++i)
	{
		for(int j=0;j<4;++j)
		{
			if(fangKuai[i][j*2]<0)
			{
				if(isCollied(fangKuai_x+(j-1)*2,fangKuai_y+i))
				{
					return ;
				}
				break;
			}
		}
	}
	fangKuai_x-=2;
	moveFangKuai();
}

void CFK::moveRight()
{
	for(int i=0;i<4;++i)
	{
		for(int j=3;j>=0;--j)
		{
			if(fangKuai[i][j*2]<0)
			{
				if(isCollied(fangKuai_x+(j+1)*2,fangKuai_y+i))
				{
					return ;
				}
				break;
			}
		}
	}
	fangKuai_x+=2;
	moveFangKuai();
}

bool CFK::isCollied(int x,int y)
{
	char c[3]={0};
	readbufchar(x,y,c);
	return (c[0]!=' ');
}

void CFK::change()
{
	if(fangKuaiIndex!=5)
	{
		char tmpFangKuai[4][9];
		for(int i=0;i<4;++i)
			{
				strcpy(tmpFangKuai[i],fangKuai[i]);
			}
		if(fangKuaiIndex<5)
		{
			for(int i=0;i<3;++i)
			{
				for(int j=0;j<3;++j)
				{
					tmpFangKuai[i][j*2]=fangKuai[2-j][i*2];
					tmpFangKuai[i][j*2+1]=fangKuai[2-j][i*2+1];
				}
			}		
		}
		else
		{
			for(int i=0;i<4;++i)
			{
				for(int j=0;j<4;++j)
				{
					tmpFangKuai[i][j*2]=fangKuai[3-j][i*2];
					tmpFangKuai[i][j*2+1]=fangKuai[3-j][i*2+1];
				}
			}
		}
		
		for(int i=0;i<4;++i)//检测变形后是否撞场
		{
			int x=fangKuai_x;
			int y=fangKuai_y+i;
			for( const char* p=tmpFangKuai[i];*p!=0;  )
			{
				if( *p > 0 ) 
				{
					++p,++x;
				}
				else 
				{
					if(isCollied(x,y)&&fangKuai[y-fangKuai_y][x-fangKuai_x]==' ')
					{
						return;
					}
					p+=2,x+=2;
				}
			}		
		}

		for(int i=0;i<4;++i)
		{
			strcpy(fangKuai[i],tmpFangKuai[i]);
		}
		
		moveFangKuai();
		for(int i=0;i<4;++i)
		{
			strcpy(oldFangKuai[i],fangKuai[i]);
		}
	}
}

int  CFK::cleanLine()
{	
	int count=0;//消的行数
	char c[3]={0};//字符
	WORD cs[2] ={0};//颜色
	bool isNull=true;//获得的字符是否为空
	for(int i=fangKuai_y;i<fangKuai_y+4;++i)
	{
		if(i==HEIGHT-1)
		{
			break;
		}
		for(int j=2;j<22;j+=2)
		{
			if(!isCollied(j,i))
			{
				isfull[i-fangKuai_y]=false;
				break;
			}
			isfull[i-fangKuai_y]=true;
		}
		if(isfull[i-fangKuai_y])
		{
			int y=i;
			while(true)
			{
				isNull=true;
				for(int j=2;j<22;j+=2)
				{
					readbufchar(j,y-1,c,cs);
					DrawText(j,y,cs[0],c);
					if(c[0]!=' ')
					{
						isNull=false;
					}
				}
				if(isNull)
				{
					break;
				}
				--y;
			}
			++count;
		}
	}
	return count;
}

⌨️ 快捷键说明

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