📄 fk.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 + -