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

📄 rectangleview.cpp

📁 VC++制作的方块小游戏 游戏方法有点儿像祖马宝石方块
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				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 + -