📄 rectangleview.cpp
字号:
if(!curtime){
addlastline();
RedrawWindow();
if(lose){
gamestart=false;
RedrawWindow();
return;
}
}
curG.pro=nextG.pro;
curG.num=nextG.num;
randRect(&nextG);
RedrawWindow();
if(curscore>=nd[normallevel].standard){
if(normallevel==11){
gamestart=false;
win=true;
RedrawWindow();
return;
}
else{
normallevel++;
showlevel=true;
RedrawWindow();
showlevel=false;
}
}
}
else if(gamemode==PUZZLE){
int posx,posy,tpro,tnum;
curG.pro=nextG.pro;
curG.num=nextG.num;
if(fscanf(fprect,"%d%d",&tpro,&tnum)!=EOF){
nextG.pro=tpro;
nextG.num=tnum;
}
else{
nextG.pro=-1;
nextG.num=-1;
}
if(curG.pro<0){
if(puzzlewin()){
fclose(fprect);
if(puzzlelevel==1){
gamestart=false;
win=true;
RedrawWindow();
return;
}
else{
puzzlelevel++;
showlevel=true;
RedrawWindow();
Sleep(1000);
showlevel=false;
switch(puzzlelevel){
case 1: fpstage=fopen("stage2.txt","r"); fprect=fopen("rect2.txt","r"); break;
}
gamestart=true;
win=false;
lose=false;
for(int i=0;i<12;i++)
for(int j=0;j<7;j++){
grid[i][j].pro=-1;
grid[i][j].num=-1;
}
while(fscanf(fpstage,"%d%d%d%d",&posx,&posy,&tpro,&tnum)!=EOF){
grid[posx][posy].pro=tpro;
grid[posx][posy].num=tnum;
}
fclose(fpstage);
fscanf(fprect,"%d%d",&tpro,&tnum);
curG.pro=tpro;
curG.num=tnum;
if(fscanf(fprect,"%d%d",&tpro,&tnum)!=EOF){
nextG.pro=tpro;
nextG.num=tnum;
}
else{
nextG.pro=-1;
nextG.num=-1;
}
memset(mark,0,sizeof(mark));
RedrawWindow();
}
}
else{
gamestart=false;
lose=true;
RedrawWindow();
fclose(fprect);
return;
}
}
}
}
}
CView::OnLButtonUp(nFlags, point);
}
void CRectangleView::drop()
{
for(lastpos=0;lastpos<12;lastpos++)
if(grid[lastpos][pos].pro>=0) break;
lastpos--;
if(lastpos<0){
win=false;
lose=true;
return;
}
nowpos=0;
//b=0;
//掉落动画
while(grid[lastpos][pos].pro<0){
if(nowpos==lastpos){
grid[nowpos][pos].pro=curG.pro;
grid[nowpos][pos].num=curG.num;
tempRect.SetRect(SIDE+SCOREAREA+SIDE+GAMEAREASIDE+pos*EDGE,SIDE+EDGE+nowpos*EDGE,SIDE+SCOREAREA+SIDE+GAMEAREASIDE+(pos+1)*EDGE,SIDE+EDGE+(nowpos+1)*EDGE);
RedrawWindow();
break;
}
else{
grid[nowpos][pos].pro=curG.pro;
grid[nowpos][pos].num=curG.num;
tempRect.SetRect(SIDE+SCOREAREA+SIDE+GAMEAREASIDE+pos*EDGE,SIDE+EDGE+nowpos*EDGE,SIDE+SCOREAREA+SIDE+GAMEAREASIDE+(nowpos+1)*EDGE,SIDE+EDGE+(pos+1)*EDGE);
RedrawWindow();
Sleep(5);
grid[nowpos][pos].pro=-1;
grid[nowpos][pos].num=-1;
nowpos++;
}
}
}
void CRectangleView::bobo()
{
int i,j,k,s;
bool t=false;
if(curG.pro==2){
if(curG.num==0){
for(i=lastpos;i<11;i++){
grid[i][pos].pro=-1;
grid[i][pos].num=-1;
grid[i+1][pos].pro=curG.pro;
grid[i+1][pos].num=curG.num;
RedrawWindow();
Sleep(25);
}
grid[11][pos].pro=-1;
grid[11][pos].num=-1;
curscore+=(11-lastpos);
RedrawWindow();
}
else if(curG.num==1){
grid[lastpos][pos].pro=-1;
grid[lastpos][pos].num=-1;
for(i=1;i<7;i++){
if(pos-i>=0)
if(grid[lastpos][pos-i].pro>=0){
grid[lastpos][pos-i].pro=-1;
grid[lastpos][pos-i].num=-1;
curscore++;
}
if(pos+i<7)
if(grid[lastpos][pos+i].pro>=0){
grid[lastpos][pos+i].pro=-1;
grid[lastpos][pos+i].num=-1;
curscore++;
}
RedrawWindow();
Sleep(50);
}
}
else if(curG.num==2){
grid[lastpos][pos].pro=-1;
grid[lastpos][pos].num=-1;
for(i=1;i<4;i++){
for(j=0;j<8;j++)
if(inArea(lastpos+i*d[j][0],pos+i*d[j][1])&&grid[lastpos+i*d[j][0]][pos+i*d[j][1]].pro>=0){
grid[lastpos+i*d[j][0]][pos+i*d[j][1]].pro=-1;
grid[lastpos+i*d[j][0]][pos+i*d[j][1]].num=-1;
curscore++;
}
RedrawWindow();
Sleep(100);
}
}
else if(curG.num==3){
if(lastpos<11){
int nownum=grid[lastpos+1][pos].num;
for(i=0;i<12;i++)
for(j=0;j<7;j++)
if(grid[i][j].num==nownum){
grid[i][j].pro=-1;
grid[i][j].num=-1;
curscore++;
}
}
grid[lastpos][pos].pro=-1;
grid[lastpos][pos].num=-1;
RedrawWindow();
Sleep(200);
}
}
fill();
RedrawWindow();
Sleep(200);
curcombo=0;
while(1){
t=false;
for(i=0;i<12;i++){
for(j=0;j<7;j++){
if(grid[i][j].pro==1){
int a=dfs(i,j,grid[i][j].num);
if(a>1){
for(k=0;k<12;k++)
for(s=0;s<7;s++)
if(mark[k][s]){
grid[k][s].pro=-1;
grid[k][s].num=-1;
}
RedrawWindow();
Sleep(200);
memset(mark,0,sizeof(mark));
fill();
curscore+=a*a/2;
RedrawWindow();
Sleep(200);
t=true;
curcombo++;
RedrawWindow();
}
else mark[i][j]=0;
}
}
if(t) break;
}
if(i==12&&j==7) break;
}
if(curcombo>=2){
maxcombo+=curcombo;
curscore+=((curcombo*curcombo*curcombo)*5);
RedrawWindow();
}
}
void CRectangleView::addlastline()
{
int i,j;
for(i=0;i<7;i++)
if(grid[0][i].pro>=0) lose=true;
for(i=1;i<12;i++)
for(j=0;j<7;j++){
grid[i-1][j].pro=grid[i][j].pro;
grid[i-1][j].num=grid[i][j].num;
}
for(i=0;i<7;i++){
grid[11][i].pro=-1;
grid[11][i].num=-1;
}
RedrawWindow();
Sleep(10);
srand(time(NULL));
for(i=0;i<7;i++){
grid[11][i].pro=0;
grid[11][i].num=rand()%nd[normallevel].colornum;
RedrawWindow();
Sleep(10);
}
return;
}
bool CRectangleView::canlose()
{
return false;
}
int CRectangleView::dfs(int x, int y,int tag)
{
int num=1;
mark[x][y]=1;
for(int i=0;i<4;i++)
if(inArea(x+d[i][0],y+d[i][1])&&!mark[x+d[i][0]][y+d[i][1]]&&grid[x+d[i][0]][y+d[i][1]].num==tag)
num+=dfs(x+d[i][0],y+d[i][1],tag);
return num;
}
void CRectangleView::fill()
{
int i,j,k;
for(i=11;i>=0;i--)
for(j=0;j<7;j++)
if(grid[i][j].pro<0){
for(k=i-1;k>=0;k--)
if(grid[k][j].pro>=0){
grid[i][j].pro=grid[k][j].pro;
grid[i][j].num=grid[k][j].num;
grid[k][j].pro=-1;
grid[k][j].num=-1;
break;
}
}
Invalidate();
}
bool CRectangleView::inArea(int x, int y)
{
return x>=0&&x<12&&y>=0&&y<7;
}
void CRectangleView::OnPuzzle()
{
gamemode=PUZZLE;
gamestart=true;
win=false;
lose=false;
showlevel=false;
puzzlelevel=0;
toprect=0;
pos=0;
nowpos=0;
fpstage=fopen("stage1.txt","r");
fprect=fopen("rect1.txt","r");
for(int i=0;i<12;i++)
for(int j=0;j<7;j++){
grid[i][j].pro=-1;
grid[i][j].num=-1;
}
int posx,posy,tpro,tnum;
while(fscanf(fpstage,"%d%d%d%d",&posx,&posy,&tpro,&tnum)!=EOF){
grid[posx][posy].pro=tpro;
grid[posx][posy].num=tnum;
}
fclose(fpstage);
fscanf(fprect,"%d%d",&tpro,&tnum);
curG.pro=tpro;
curG.num=tnum;
if(fscanf(fprect,"%d%d",&tpro,&tnum)!=EOF){
nextG.pro=tpro;
nextG.num=tnum;
}
else{
nextG.pro=-1;
nextG.num=-1;
}
memset(mark,0,sizeof(mark));
RedrawWindow();
}
bool CRectangleView::puzzlewin()
{
int i,j;
for(i=0;i<12;i++)
for(j=0;j<7;j++)
if(grid[i][j].pro>=0)
break;
return i==12&&j==7;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -