[2] C语言数组版俄罗斯方块

本人qq:1395916710
#废话当头
大家好这是我写的第二次博客,这次我给大家带来的是俄罗斯方块,简易版的。我们可以通过上下左右来控制下落物的状态。因为本人的水平问题导致了一些游戏上的bug。在下面表述的过程中我会给大家一一说明有什么bug。

#涉及函数
所涉及函数与贪吃蛇大致相同这里就不在一一列举。我们在下面说明的过程当中会进行详细的说明。

#如何编写
这里我最初的设想是这样的,我们定义一个整型的二维数组。0代表为空,1代表能够移动的方块,2代表不能够移动的方块。并使用另一个函数来进行地图的刷新。这里我们用for循环进行刷新。

代码奉上

void move(int x,int y)
{
	COORD coord;
	coord.X=x;
	coord.Y=y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord); 
}

这个函数所需要的的头文件是windows,h头文件起到移动光标的作用,这个对我来说不论是贪吃蛇还是俄罗斯方块都是最为重要的一个函数。这个调用了windows自带的api。可以上网自行查阅。

#include<stdio.h>
#include<stdlib.h>
#include<windows.h> 
#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77
int map[39][24];
struct Judge//这里我们用M存储mood F用来保存我们一共mood的状态 
{
	int M;
	int F;
}Judge;
struct SD//我们用SD结构体存储每一个方格的位置 
{
	int x;
	int y;
}SD[5];
void right();//向右移动 (完成) 
void down();//方块下降(完成) 
void left();//向左移动(完成) 
void GET();
void mood();//创建模组(完成) 
void move(int x,int y);
void refresh();//刷新地图(完成) 
void original();//初始化游戏(完成) 
void up();//用于旋转mood 
void Judge_H();
int Judge_T(int x);//用于判断某块是否到达底端
int S_map();//简化代码量

void Judge_H()
{
	int x,y,h;
	int Map[40][24];
	for(x=0;x<40;x++)
	{
		for(y=0;y<24;y++)
		{
			Map[x][y]=0;
		}
	}
	for(y=22;y>1;y--)
	{
		h=0;
		for(x=2;x<38;x+=2)
		{
			if(map[x][y]==2)
			{
				h++;	
			}
		}
		if(h>=17)
		{	
			for(x=2;x<38;x++)
			{
				for(y=1;y<23;y++)
				{
					if(map[x][y]==2)
					{
						map[x][y]=0;
						Map[x][y]=2;	
					}
					
				}
			}
			for(x=2;x<38;x++)
			{
				for(y=1;y<23;y++)
				{
					if(Map[x][y]==2)
					{
						map[x][y+1]=2;
					}
				}
			}
		}
	}
}

int S_map()
{
	int x,y,z=0;
	for(x=2;x<38;x+=2)
	{
		for(y=1;y<23;y++)
		{
			if(map[x][y]==1)
			{
				SD[z].x=x;
				SD[z].y=y;
				z++;
			}
		}
	}
	return(z);
 } 

int Judge_T(int x)
{
	int a;
	int y=0;
	move(42,11);
	printf("%d",x);
	for(a=0;a<x;a++)
	{
		/*move(SD[0].x+10,SD[0].y);
		printf("%d %d",SD[0].x,SD[0].y);
		move(SD[1].x+10,SD[1].y);
		printf("%d %d",SD[1].x,SD[1].y);
		move(SD[2].x+10,SD[2].y);
		printf("%d %d",SD[2].x,SD[2].y);
		move(SD[3].x+10,SD[3].y);
		printf("%d %d",SD[3].x,SD[3].y);
		move(SD[4].x+10,SD[4].y);
		printf("%d %d",SD[4].x,SD[4].y);*/
		if(map[SD[a].x][SD[a].y+1]==2)
		{
			y++;
			for(a=0;a<x;a++)
			{			
				map[SD[a].x][SD[a].y]=0;
			}
			for(a=0;a<x;a++)
			{
				map[SD[a].x][SD[a].y]=2;
			}
			Judge.F=0;
			Judge_H();
		    mood();
			break;
		}
	}
	if(y==0)
	{
		return 1;
	}
}

void up()
{
	int z;
	move(43,7);
	printf("%d",Judge.F);
	z=S_map();
		if(Judge_T(z)==1)
		{
			if(Judge.M==1)//完成 
			{
				if(Judge.F==0)
				{
					map[SD[0].x][SD[0].y]=0;
					map[SD[1].x][SD[1].y]=0;
					map[SD[2].x][SD[2].y]=0;
					map[SD[0].x+2][SD[0].y]=1;
					map[SD[1].x][SD[1].y-1]=1;
					map[SD[2].x-2][SD[2].y]=1;
					Judge.F++;
				}
				else if(Judge.F==1)
				{
					map[SD[0].x][SD[0].y]=0;
					map[SD[1].x][SD[1].y]=0;
					map[SD[2].x][SD[2].y]=0;
					map[SD[0].x][SD[0].y]=1;
					map[SD[1].x+2][SD[1].y]=1;
					map[SD[2].x][SD[2].y]=1;
					Judge.F++;
				}
				else if(Judge.F==2)
				{
					map[SD[0].x][SD[0].y]=0;
					map[SD[1].x][SD[1].y]=0;
					map[SD[2].x][SD[2].y]=0;
					map[SD[0].x][SD[0].y+1]=1;
					map[SD[1].x][SD[1].y]=1;
					map[SD[2].x][SD[2].y]=1;
					Judge.F++;
				}
				else if(Judge.F==3)
				{
					map[SD[0].x][SD[0].y]=0;
					map[SD[1].x][SD[1].y]=0;
					map[SD[2].x][SD[2].y]=0;
					map[SD[0].x][SD[0].y]=1;
					map[SD[1].x-2][SD[1].y]=1;
					map[SD[2].x][SD[2].y]=1;
					Judge.F=0;
				}
			}
			else if(Judge.M==2)//完成 
			{
				;	
			}
			else if(Judge.M==3)//完成 
			{
				if(Judge.F==0)
				{
					map[SD[0].x][SD[0].y]=0;
					map[SD[1].x][SD[1].y]=0;
					map[SD[2].x][SD[2].y]=0;
					map[SD[0].x-2][SD[0].y+1]=1;
					map[SD[1].x][SD[1].y]=1;
					map[SD[2].x+2][SD[2].y-1]=1;
					Judge.F++;
				}
				else if(Judge.F==1)
				{
					map[SD[0].x][SD[0].y]=0;
					map[SD[1].x][SD[1].y]=0;
					map[SD[2].x][SD[2].y]=0;
					map[SD[0].x+2][SD[0].y-1]=1;
					map[SD[1].x][SD[1].y]=1;
					map[SD[2].x-2][SD[2].y+1]=1;
					Judge.F=0;
				}
	
			}
			else if(Judge.M==4)//完成 
			{
				if(Judge.F==0)
				{
					map[SD[0].x][SD[0].y]=0;
					map[SD[1].x][SD[1].y]=0;
					map[SD[2].x][SD[2].y]=0;
					map[SD[3].x][SD[3].y]=0;
					map[SD[0].x+2][SD[0].y-2]=1;
					map[SD[1].x][SD[1].y]=1;
					map[SD[2].x][SD[2].y]=1;
					map[SD[3].x][SD[3].y-1]=1;
					Judge.F++;
				}
				else if(Judge.F==1)
				{
					map[SD[0].x][SD[0].y]=0;
					map[SD[1].x][SD[1].y]=0;
					map[SD[2].x][SD[2].y]=0;
					map[SD[3].x][SD[3].y]=0;
					map[SD[0].x-2][SD[0].y+1]=1;
					map[SD[1].x][SD[1].y]=1;
					map[SD[2].x][SD[2].y]=1;
					map[SD[3].x][SD[3].y]=1;
					Judge.F++;
				}
				else if(Judge.F==2)
				{
					map[SD[0].x][SD[0].y]=0;
					map[SD[1].x][SD[1].y]=0;
					map[SD[2].x][SD[2].y]=0;
					map[SD[3].x][SD[3].y]=0;
					map[SD[0].x][SD[0].y]=1;
					map[SD[1].x][SD[1].y]=1;
					map[SD[2].x][SD[2].y]=1;
					map[SD[3].x-2][SD[3].y-1]=1;
					Judge.F++;
				}
				else if(Judge.F==3)
				{
					map[SD[0].x][SD[0].y]=0;
					map[SD[1].x][SD[1].y]=0;
					map[SD[2].x][SD[2].y]=0;
					map[SD[3].x][SD[3].y]=0;
					map[SD[0].x][SD[0].y+1]=1;
					map[SD[1].x+2][SD[1].y+2]=1;
					map[SD[2].x][SD[2].y]=1;
					map[SD[3].x][SD[3].y]=1;
					Judge.F=0;
				}
		
			}
			else if(Judge.M==5)//完成 
			{
				if(Judge.F==0)
				{
					map[SD[0].x][SD[0].y]=0;
					map[SD[1].x][SD[1].y]=0;
					map[SD[2].x][SD[2].y]=0;
					map[SD[3].x][SD[3].y]=0;
					map[SD[0].x-2][SD[0].y+1]=1;
					map[SD[1].x][SD[1].y]=1;
					map[SD[2].x-2][SD[2].y]=1;
					map[SD[3].x][SD[3].y-1]=1;
					Judge.F++;
				}
				else if(Judge.F==1)
				{
					map[SD[0].x][SD[0].y]=0;
					map[SD[1].x][SD[1].y]=0;
					map[SD[2].x][SD[2].y]=0;
					map[SD[3].x][SD[3].y]=0;
					map[SD[0].x+2][SD[0].y-1]=1;
					map[SD[1].x][SD[1].y-2]=1;
					map[SD[2].x][SD[2].y]=1;
					map[SD[3].x-2][SD[3].y+1]=1;
					Judge.F++;
				}
				else if(Judge.F==2)
				{
					map[SD[0].x][SD[0].y]=0;
					map[SD[1].x][SD[1].y]=0;
					map[SD[2].x][SD[2].y]=0;
					map[SD[3].x][SD[3].y]=0;
					map[SD[0].x-2][SD[0].y+2]=1;
					map[SD[1].x-2][SD[1].y+2]=1;
					map[SD[2].x][SD[2].y]=1;
					map[SD[3].x][SD[3].y]=1;
					Judge.F++;
				}
				else if(Judge.F==3)
				{
					map[SD[0].x][SD[0].y]=0;
					map[SD[1].x][SD[1].y]=0;
					map[SD[2].x][SD[2].y]=0;
					map[SD[3].x][SD[3].y]=0;
					map[SD[0].x][SD[0].y]=1;
					map[SD[1].x-2][SD[1].y+1]=1;
					map[SD[2].x-4][SD[2].y]=1;
					map[SD[3].x-2][SD[3].y+1]=1;
					Judge.F=0;
				}
			
	
			}
			else if(Judge.M==6)//完成 
			{
				;
			}
			else if(Judge.M==7)//完成 
			{
				if(Judge.F==0)
				{
					map[SD[0].x][SD[0].y]=0;
					map[SD[1].x][SD[1].y]=0;
					map[SD[2].x][SD[2].y]=0;
					map[SD[3].x][SD[3].y]=0;
					map[SD[0].x+4][SD[0].y]=1;
					map[SD[1].x][SD[1].y]=1;
					map[SD[2].x][SD[2].y]=1;
					map[SD[3].x][SD[3].y-2]=1;
					Judge.F++;
				}
				else if(Judge.F==1)
				{
					map[SD[0].x][SD[0].y]=0;
					map[SD[1].x][SD[1].y]=0;
					map[SD[2].x][SD[2].y]=0;
					map[SD[3].x][SD[3].y]=0;
					map[SD[0].x][SD[0].y]=1;
					map[SD[1].x][SD[1].y]=1;
					map[SD[2].x][SD[2].y+2]=1;
					map[SD[3].x-4][SD[3].y]=1;
					Judge.F=0;
				}
	
			}
			else if(Judge.M==8)//完成 
			{
				;
			}
			else//完成 
			{
				;
			}		
		}	
}
void move(int x,int y)
{
	COORD coord;
	coord.X=x;
	coord.Y=y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord); 
}

void GET()
{
	int Fx;
	while(1)
	{
			Fx=getch(); 
			switch(Fx)
			{
				case UP:
					{
						up();
						refresh();
						while(1)
						{
							if(kbhit()==0)
							{
								refresh();
								down();
							}
							if(kbhit()!=0)
							{
								break;
							} 
						}
						
						break;
					}
				case DOWN:
					{
						while(1)
						{
							if(kbhit()==0)
							{
								refresh();
								down();
							}
							if(kbhit()!=0)
							{
								break;
							} 
						}
						break;
					}
				case RIGHT:
					{
						right();
						refresh();
						while(1)
						{
							if(kbhit()==0)
							{
								down();
								refresh();
							}
							if(kbhit()!=0)
							{
								break;
							} 
						}
						break;
					}
				case LEFT:
					{
						left();
						refresh();
						while(1)
						{
							if(kbhit()==0)
							{
								down();
								refresh();
							}
							if(kbhit()!=0)
							{
								break;
							} 
						}
						break;
					}
			}
			}		
			
}

void right()
{
	int x,z,y=0;
	z=S_map();
	for(x=0;x<z;x++)
	{
		if((SD[x].x+2)==38)
		{
			y++;
		}
	}
	for(x=0;x<z;x++)
		{
			map[SD[x].x][SD[x].y]=0;
		}
	if(y==0)
	{
		for(x=0;x<z;x++)
		{
			map[SD[x].x+2][SD[x].y]=1;
		}
	}
	else if(y>=1)
	{
		for(x=0;x<z;x++)
		{
			map[SD[x].x][SD[x].y]=1;
		}
	}
}

void left()
{
	int x,z,y=0;
	z=S_map();
	for(x=0;x<z;x++)
	{
		if((SD[x].x-2)==0)
		{
			y++;
		}
	}
	for(x=0;x<z;x++)
		{
			map[SD[x].x][SD[x].y]=0;
		}
	if(y==0)
	{
		for(x=0;x<z;x++)
		{
			map[SD[x].x-2][SD[x].y]=1;
		}
	}
	else if(y>=1)
	{
		for(x=0;x<z;x++)
		{
			map[SD[x].x][SD[x].y]=1;
		}
	}
}

void mood()
{	
	Judge.M=rand()%(11-0+1)+0;
	if(Judge.M==1)
	{
       map[4][1]=1;
	   map[4][2]=1;
	   map[6][2]=1;	
	}
    else if(Judge.M==2)
    {
    	map[6][1]=1;
	}
	else if(Judge.M==3)
	{
		map[6][1]=1;
	    map[6][2]=1;
	    map[6][3]=1;
	}
	else if(Judge.M==4)
	{
		map[20][1]=1;
	    map[18][2]=1;
	    map[20][2]=1;
	    map[22][2]=1;
	}
	else if(Judge.M==5)
	{
		map[18][1]=1;
		map[18][2]=1;
		map[18][3]=1;
		map[20][3]=1;
	}
	else if(Judge.M==6)
	{
		map[18][1]=1;
		map[18][2]=1;
		map[20][1]=1;
		map[20][2]=1;
	}
	else if(Judge.M==7)
	{
		map[18][1]=1;
		map[20][1]=1;
		map[20][2]=1;
		map[22][2]=1;
	}
	else if(Judge.M==8)
	{
		map[14][1]=1;
		map[14][2]=1;
		map[14][3]=1;
		map[12][2]=1;
		map[16][2]=1;
	}
	else
	{
		map[14][1]=1;
		map[16][1]=1;
	}
}


void refresh()
{
	int x,y;
	for(x=0;x<40;x+=2)
	{
		for(y=0;y<24;y++)
		{
			if(map[x][y]==2||map[x][y]==1)
			{
				move(x,y);
				printf("■");
			}
			else
			{
				move(x,y);
				printf("  ");
			}
		}
	}
}

void original()
{
	int x,y,z;
	for(x=0;x<40;x+=2)
	{
		for(y=0;y<24;y++)
		{
			map[x][y]=0;
		}
	}
	for(x=0;x<38;x+=2)
	{
		y=0;

		map[x][y]=2;

	}
	for(y=0;y<24;y++)
	{

		map[x][y]=2;

	}
	for(;x>0;x-=2)
	{

		map[x][y-1]=2;

	}
	for(;y>0;y-=1)
	{

		map[x][y]=2;

	}
	Judge.F=0;
}

void down()
{
	int x,y,z=0;
	z=S_map();
	if(Judge_T(z)==1)
	{
		for(x=0;x<z;x++)
		{
			map[SD[x].x][SD[x].y]=0;
		}
		for(x=0;x<z;x++)
		{
			map[SD[x].x][SD[x].y+1]=1;
		}
	}
	//Sleep(0.1);
}
int main()
{
	int Fx;
	original();
	mood();
	move(43,5);
	printf("%d",Judge.M);
	GET();
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值