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

📄 els.c

📁 我的俄罗斯方块(有详细注解)
💻 C
📖 第 1 页 / 共 2 页
字号:
 * 
 */
void EraseBox(int x,int y,int box_numb)
{
	int mask=128,t_boardx,t_boardy,n,m;
	setfillstyle(SOLID_FILL,BgColor);
	for(n=0;n<4;n++)
	{
		for(m=0;m<4;m++)	/*看最左边四个单元*/
		{
			if( ((shapes[box_numb].box[n/2]) & mask) )/*最左边有方块并且当前游戏板也有方块*/
			{
				bar(x+m*BSIZE,y+n*BSIZE,x+m*BSIZE+BSIZE,y+n*BSIZE+BSIZE);
				line(x+m*BSIZE,y+n*BSIZE,x+m*BSIZE+BSIZE,y+n*BSIZE);
				line(x+m*BSIZE,y+n*BSIZE,x+m*BSIZE,y+n*BSIZE+BSIZE);
				line(x+m*BSIZE,y+n*BSIZE+BSIZE,x+m*BSIZE+BSIZE,y+n*BSIZE+BSIZE);
				line(x+m*BSIZE+BSIZE,y+n*BSIZE,x+m*BSIZE+BSIZE,y+n*BSIZE+BSIZE);
			}
			mask=mask/(2);
			if(mask==0)mask=128;
		}
	}

}
/* 判断是否可以移动
 * x,y为当前方块位置
 * box_numb为方块号
 * direction 方向标志 
 *  返回true 和false
#define MoveLeft -1
#define MoveRight 1
#define MoveDown 0


 */
int MoveAble(int x,int y,int box_numb,int direction)
{
	int n,m,t_boardx,t_boardy;			/*t_boardx 当前方块最左边在游戏板的位置*/
	int mask;
	if(direction==MoveLeft)				/*如果向左移*/
	{
		mask=128;
		x-=BSIZE;
		t_boardx=(x-Sys_x)/BSIZE;
		t_boardy=(y-Sys_y)/BSIZE;
		for(n=0;n<4;n++)
		{
			for(m=0;m<4;m++)	/*看最左边四个单元*/
			{
				if((shapes[box_numb].box[n/2]) & mask)/*最左边有方块并且当前游戏板也有方块*/
				{
					if((x+BSIZE*m)<Sys_x)return(false);/*碰到最左边了*/
					else if(Table_board[t_boardy+n][t_boardx+m].var)
					{
						return(false);
					}
				}
				mask=mask/(2);
				if(mask==0)mask=128;
			}
		}
		return(true);
	}
	else if(direction==MoveRight)		/*如果向右移*/
	{
		x+=BSIZE;
		t_boardx=(x-Sys_x)/BSIZE;
		t_boardy=(y-Sys_y)/BSIZE;
		mask=128;
		for(n=0;n<4;n++)
		{
			for(m=0;m<4;m++)	/*看最右边四个单元*/
			{
				if((shapes[box_numb].box[n/2]) & mask)/*最右边有方块并且当前游戏板也有方块*/
				{
					if((x+BSIZE*m)>=(Sys_x+BSIZE*Horizontal_boxs) )return(false);/*碰到最右边了*/
					else if( Table_board[t_boardy+n][t_boardx+m].var)
					{
						return(false);
					}
				}
				mask=mask/(2);
				if(mask==0)mask=128;
			}
		}
		return(true);
	}
	else if(direction==MoveDown)		/*如果向下移*/
	{
		y+=BSIZE;
		t_boardx=(x-Sys_x)/BSIZE;
		t_boardy=(y-Sys_y)/BSIZE;
		mask=128;
		for(n=0;n<4;n++)
		{
			for(m=0;m<4;m++)	/*看最下边四个单元*/
			{
				if((shapes[box_numb].box[n/2]) & mask)/*最下边有方块并且当前游戏板也有方块*/
				{
					if((y+BSIZE*n)>=(Sys_y+BSIZE*Vertical_boxs) ||  Table_board[t_boardy+n][t_boardx+m].var)
					{
						flag_newbox=true;
						break;
					}
				}
				mask=mask/(2);/*这样可以得到每隔八位的mask 0001 0000,16 和 0000 0001*/
				if(mask==0)mask=128;
			}
		}
		if(flag_newbox)
		{
			return(false);
		}
		else
			return(true);
	}
	else if(direction==MoveRoll)		/*转动*/
	{
		t_boardx=(x-Sys_x)/BSIZE;
		t_boardy=(y-Sys_y)/BSIZE;
		mask=128;
		for(n=0;n<4;n++)
		{
			for(m=0;m<4;m++)	/*看最下边四个单元*/
			{
				if((shapes[box_numb].box[n/2]) & mask)/*最下边有方块并且当前游戏板也有方块*/
				{
					if((y+BSIZE*n)>=(Sys_y+BSIZE*Vertical_boxs) )return(false);/*碰到最下边了*/
					if((x+BSIZE*n)>=(Sys_x+BSIZE*Horizontal_boxs) )return(false);/*碰到最左边了*/
					if((x+BSIZE*m)>=(Sys_x+BSIZE*Horizontal_boxs) )return(false);/*碰到最右边了*/

					else if( Table_board[t_boardy+n][t_boardx+m].var)
					{
						return(false);
					}
				}
				mask=mask/(2);/*这样可以得到每隔八位的mask 0001 0000,16 和 0000 0001*/
				if(mask==0)mask=128;
			}
		}
		return(true);
	}
	else
	{
		return(false);
	}

}

/*
显示指定的方块
*/
void show_box(int x,int y,int box_numb,int color)
{
	int i,ii,ls_x=x;
	if(box_numb<0 || box_numb>=MAX_BOX)/*指定的方块不存在*/
		box_numb=MAX_BOX/2;
	setfillstyle(SOLID_FILL,color);
/********************************* 
 *   移位来判断第哪一位是1
 *   方块是每1行用半个字节来表示
 *   128d=1000 0000b
 */
	for(ii=0;ii<2;ii++)	
	{
		int mask=128;
		for(i=0;i<8;i++)
		{
			if(i%4==0 && i!=0)				/*表示转到方块的下一行了*/
			{
				y+=BSIZE;
				x=ls_x;
			}
			/*if((shapes[box_numb].box[ii]>>(8-1-i))&1==1)/*左移后得到的是最高位*/
			if((shapes[box_numb].box[ii])&mask)
			{
				bar(x,y,x+BSIZE,y+BSIZE);
				line(x,y,x+BSIZE,y);
				line(x,y,x,y+BSIZE);
				line(x,y+BSIZE,x+BSIZE,y+BSIZE);
				line(x+BSIZE,y,x+BSIZE,y+BSIZE);
			}
			x+=BSIZE;
			mask/=2;
		}
		y+=BSIZE;
		x=ls_x;
	}
}

void show_all_box()
{
	int i,ii,n;
	for(n=0;n<MAX_BOX;n++)/*循环所有的方块*/
	{
		clrscr();
		printf("number: %d\n",n);

		for(ii=0;ii<2;ii++)	
		{
			for(i=0;i<8;i++)
			{
				if(i%4==0 && i!=0)
					printf("\n");
				if((shapes[n].box[ii]>>(8-1-i))&1==1)
				{
					printf("%s","#");
				}
				else
				{
					printf("%s","O");
				}
			}
			printf("\n");
		}
		getch();
	}
	printf("\n that's all!");
	getch();
}

/*返回下个方块号*/
int get_next_box(int box_numb)
{
	box_numb++;
	if(box_numb<0 || box_numb>=MAX_BOX)/*指定的方块不存在*/
		return 0;
	else
		return box_numb;
}

/*返回上个方块号*/
int get_prev_box(int box_numb)
{
	box_numb--;
	if(box_numb<0 || box_numb>=MAX_BOX)/*指定的方块不存在*/
		return 0;
	else
		return box_numb;
}

void main()
{
	int GameOver=0;
	int key,nextbox; 
	int Currentaction=0;/*状态标记,往下移和,当前动作*/
	int gd=VGA,gm=VGAHI,errorcode;

/*
	int gd=EGA,gm=DETECT,errorcode;
	installuserdriver("VESA256",0); 
	int gd=DETECT,gm,errorcode;
*/
	initgraph(&gd,&gm,"");
	errorcode = graphresult(); 
	if (errorcode != grOk)  
	{
		printf("\nGraphics error: %s\n", grapherrormsg(errorcode)); 
		printf("Press any key to halt!"); 
		getch(); 
		exit(1);            
	}
	setbkcolor(BgColor);
	setcolor(FgColor);
	randomize();
	SetTimer(newtimer);

	initialize(Sys_x,Sys_y,Horizontal_boxs,Vertical_boxs);/*初始化*/


	nextbox=MkNextBox(-1);
				line(LeftWin_x,Curbox_y+200,LeftWin_x+BSIZE*4,Curbox_y+200);
				line(LeftWin_x,Curbox_y+200,LeftWin_x,Curbox_y+200+BSIZE*4);
				line(LeftWin_x,Curbox_y+200+BSIZE*4,LeftWin_x+BSIZE*4,Curbox_y+200+BSIZE*4);
				line(LeftWin_x+BSIZE*4,Curbox_y+200,LeftWin_x+BSIZE*4,Curbox_y+200+BSIZE*4);

	show_box(Curbox_x,Curbox_y,current_box_numb,shapes[current_box_numb].color);
	show_box(LeftWin_x,Curbox_y+200,nextbox,shapes[nextbox].color);

	getch();
	while(1)
	{
/*		Currentaction=0;
		flag_newbox=false;
				/*检测是否有按键*/			
		if (bioskey(1)){key=bioskey(0);		}
		else			{			key=0;		}

		switch(key)
		{
			case VK_LEFT:
				if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveLeft))
				{EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_x-=BSIZE;Currentaction=MoveLeft;}
				break;
			case VK_RIGHT:
				if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveRight))
				{EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_x+=BSIZE;Currentaction=MoveRight;}
				break;
			case VK_DOWN:
				if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown))
				{EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_y+=BSIZE;Currentaction=MoveDown;}
				else flag_newbox=true;
				break;
			case VK_SPACE:/*转动方块*/
				if(MoveAble(Curbox_x,Curbox_y,shapes[current_box_numb].next,MoveRoll))
				{EraseBox(Curbox_x,Curbox_y,current_box_numb);current_box_numb=shapes[current_box_numb].next;
					Currentaction=MoveRoll;
				}
				break;
			case 0x1e61:/*a*/
				if(MoveAble(Curbox_x,Curbox_y,shapes[current_box_numb].prev,MoveRoll))
				{EraseBox(Curbox_x,Curbox_y,current_box_numb);current_box_numb=shapes[current_box_numb].prev;
Currentaction=MoveRoll;
				}
				break;
/*
			case VK_UP:
				if(MoveAble(Curbox_x,Curbox_y,get_prev_box(current_box_numb),MoveRoll))
				{EraseBox(Curbox_x,Curbox_y,current_box_numb);current_box_numb=get_prev_box(current_box_numb);
Currentaction=MoveRoll;

			}
				break;
*/
			case VK_ESC:
				GameOver=1;
				break;
			default:
				break;
		}
		if(Currentaction)
		{/*表示当前有动作,移动或转动*/
			show_box(Curbox_x,Curbox_y,current_box_numb,shapes[current_box_numb].color);
			Currentaction=0;
		}
/*按了往下键,但不能下移,就产生新方块*/
		if(flag_newbox)
		{
			/*这时相当于方块到底部了,把其中出现点满一行的清去,置0*/
			EraseBox(LeftWin_x,Sys_y+200,nextbox);
			nextbox=MkNextBox(nextbox);
			show_box(LeftWin_x,Curbox_y+200,nextbox,shapes[nextbox].color);
			if(!MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown))/*刚生一下就到东西,游戏结束*/
			{
				show_box(Curbox_x,Curbox_y,current_box_numb,shapes[current_box_numb].color);
				GameOver=1;
			}
			else
			{
				flag_newbox=false;
			}
			Currentaction=0;
		}
		else	/*自由下落*/
		{
			if (Currentaction==MoveDown || TimerCounter> (20-speed*2))
			{
				if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown))
				{
					EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_y+=BSIZE;
					show_box(Curbox_x,Curbox_y,current_box_numb,shapes[current_box_numb].color);
				}
/*				if (Currentaction==MoveDown)*/
				TimerCounter=0;
			}
		}
		if(GameOver )/*|| flag_newbox==-1*/
		{
			printf("game over!");
			initialize(Sys_x,Sys_y,Horizontal_boxs,Vertical_boxs);
			getch();
			break;
		}
	}
	getch();
	KillTimer();
	closegraph();
}

⌨️ 快捷键说明

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