user-0 提问: 俄罗斯方块问题，求帮忙看下问题

回复:
user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-2
content: 你这样放大段代码上来，大家很难帮你，让别人首先看懂你的逻辑，再查处可能哪有问题，不是短时间能解决的。 还是建议你，自己别嫌麻烦，仔细看的一点点看。 单步调试，打印关键字什么的都用上，多总结，多分析。

user: user-0
content: 能帮我看看么？？ 谢谢了

user: user-0
content: 求帮忙啊  谢谢了

user: user-0
content: 我是想帮我看看 哪里出了问题 。

user: user-1
content: 网上搜“俄罗斯方块 C语言”

user: user-0
content: QQ457796406  身份验证 麻烦说下  帮忙 就行 真心谢谢了

user: user-0
content: void print_tetris(HANDLE hOut,struct Tetris* tetris) { 	//HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); 	for (i = 0; i <= 3; i++) 	{ 		b[i] = 1; //先把数组b赋值为1.调用make_Tetris函数，赋值1 表示方块  	} 	 make_Tetris(tetris);//调用制作俄罗斯方块函数，并并且将有光标指向的位置赋值为1  	for (i = tetris->x - 2; i <= tetris->x + 4; i += 2) 	{ 		for (j = tetris->y - 2; j <= tetris->y + 1; j++) 		{ 			if (a[i][j] == 1 && j > FrameY) 			{ 				gotoxy(hOut, i, j); 				printf("□");     //打印边框内的方块 			}  		}  	} 	//打印右边窗口信息 	gotoxy(hOut, FrameX + 2 * Frame_width + 3, FrameY + 1); 	printf("等级：%d", tetris->level); 	gotoxy(hOut, FrameX + 2 * Frame_width + 3, FrameY + 3); 	printf("分数：%d", tetris->score); 	gotoxy(hOut, FrameX + 2 * Frame_width + 3, FrameY + 5); 	printf("难度：%dms", tetris->speed);  } /*--------------------以上打印俄罗斯方块------------------------*/  void clear_tetris(HANDLE hOut, struct Tetris* tetris) { 	for (i = 0; i <= 3; i++) 	{ 		b[i] = 0; 	} 	make_Tetris(tetris); 	for (i = tetris->x - 2; i <= tetris->x + 4; i += 2) 	{ 		for (j = tetris->y - 2; j <= tetris->y + 2; j++) 		{ 			if (a[i][j] == 0 && j > FrameY) 			{ 				gotoxy(hOut, i, j); 				printf(" ");     //清除方块 			}  		}  	}  } /*--------------------以上清除俄罗斯方块的痕迹------------------------*/ void del_full(HANDLE hOut, struct Tetris* tetris) { 	//当一行有Frame_width-2个方块时删除这行的方块。（利用循环输出“ ”清除） 	int k, del_count = 0;//分别用于记录某行方块的个数和删除方块的行数的变量  	for (j = FrameY + Frame_height; j >= FrameY + 1; j--) 	{ 		k = 0; //赋值0 		for (i = FrameX; i <= FrameX + Frame_height; i += 2) 		{  			if (a[i][j] == 1)  //=1表示有方块，来判断该行是否满行 			{  				  k++;//用于记录该行方块的个数  				  if (k == Frame_width - 2) 				  { 					  for (k = FrameX + 2; k <= FrameX + 2*Frame_width - 2; k += 2) 					  {  						  a[k][j] = 0;//准备清除方块  						  gotoxy(hOut, k, j);//不断把该行删除 						  printf(" ");  						  Sleep(1);/*sleep()方法是使线程停止一段时间的方法。 									 在sleep 时间间隔期满后，线程不一定立即恢复执行。 									 是windows中的函数，以为毫秒计数  及间隔1ms*/  					  } 					  //当你删除方块行上有方块时，则要先清除，并且把上一行方块下落 			for (k = j - 1; k > FrameY; k--) 			{ 				for (i = FrameX + 2; i < FrameX + 2 * Frame_width - 2; i += 2) 				{ 						 if (a[i][k] == 1)//当这个有方块的时候 					{ 						 a[i][k] = 0; 						 gotoxy(hOut, i, k); 						 printf(" ");  						 a[i][k + 1] = 1; 						 gotoxy(hOut, i, k + 1); 						 printf("□");   							  } 						  } 			}  					  j++;//方块下落，在判断是否满行 					  del_count++;//记录删除行数的个数用于评分   				  }//if (k == Frame_width - 2)的那层括号 			}//if（a[i][j]==1）那层的括号 		} 	} 	tetris->score += 100 * del_count;//每删除一行得100分，就增加难度 	if (del_count > 0 && (tetris->score % 1000 == 0) || 		tetris->score / 1000 > tetris->level - 1) 	{ 		tetris->speed -= 20;//速度加快20ms 		tetris->level++;  	}               } /*--------------------以上删除满行方块并且下落一个单位的过程------------------------*/  void start_game() { 	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);//定义显示器句柄变量  	struct Tetris t, *tetris = &t; //定义结构体指针并指向结构体变量 	unsigned char ch; //定义接受从键盘输入的变量 	tetris->count = 0;//初始化变量 	tetris->speed = 300;//定义开始的速度设为300ms 	tetris->score = 0;//初始化分数 为0 	tetris->level = 1;//等级开始为1及对应300ms速度 	/* 这里均为初始化变量*/  	while (1) 	{  		//用于产生方块 		get_number(tetris);//调用函数  		temp = tetris->number;//调用全局变量 记录 		//打印右边窗口中的方块，下一个方块的样子 		tetris->x = FrameX + 2 * Frame_width + 6; 		tetris->y = FrameY + 10; 		tetris->number = tetris->next; 		print_tetris(hOut,tetris);//打印  		tetris->x = FrameX +  Frame_width;//初始化中心方块的坐标 		tetris->y = FrameY - 1; 		tetris->number = temp;//当前方块的序号取出 		 		while (1) 		{  //控制方向 		print_tetris(hOut, tetris);//打印方块 			Sleep(tetris->speed);//减慢时间 			clear_tetris(hOut, tetris);//清楚方块痕迹 			temp1 = tetris->x;//记录中心方块的坐标 			temp2 = tetris->number;//记住当前方块的序号  			if (_kbhit()) 			{     //判断是否有键盘输入 				ch = _getch();  				if (ch == 75) //按向左键，则横坐标减2 				{ 					tetris->x -= 2;  				} 				if (ch == 77)//按向右键，则横坐标加2 				{ 					tetris->x += 2;  				} 				if (ch == 72)   // 向上键变体 				{ 					if (tetris->number >= 2 && tetris->number <= 3)//1字方块的变体 					{ 						tetris->number++; 						tetris->number %= 2; 						tetris->number += 2;  					} 					if (tetris->number >= 4 && tetris->number <= 7)//T字方块的变体 					{  						tetris->number++; 						tetris->number %= 4; 						tetris->number += 4;  					} 					if (tetris->number >= 8 && tetris->number <= 11)//Z字方块的变体 					{ 						tetris->number; 						tetris->number %= 4; 						tetris->number += 8;  					}  					if (tetris->number >= 12 && tetris->number <= 15)//7字方块的变体 					{  						tetris->number++; 						tetris->number %= 4; 						tetris->number += 12;  					} 					if (tetris->number >= 16 && tetris->number <= 19)/*向左的7字方块 																		   变体*/ 					{ 						tetris->number++; 						tetris->number %= 4; 						tetris->number += 16;  					} 				}   			}//if (ch == 72)的括号 				     			  			tetris->y++;//没有指令，向下移动 			if (if_moveable(tetris) == 0)//向下移动不能移动 			{ 			 				tetris->y--; 				print_tetris(hOut, tetris); 				del_full(hOut,tetris); 				break; 			} 			        		} 		for (i = tetris->y - 2; i < tetris->y + 2; i++) 		{            //当方块碰到顶部的时候，结束游戏 			if (i == FrameY) 			{ 				j = 0;//游戏结束 			}  		}  		if (j == 0)//游戏结束 		{ 			system("cls"); /*执行控制台命令cls，就是CMD下 						     面的cls，功能是清屏，清除所有显示的信息。*/ 			_getch(); 			break;  		}  		//清除提示的下一个方块的信息 		tetris->number = tetris->next; 		tetris->x = FrameX + 2 * Frame_width + 6; 		tetris->y = FrameY + 10; 		clear_tetris(hOut, tetris);  	}  } void main() { 	 	make_Gamewindow(); 	start_game(); 	 }    只有几种特定的方块 可以继续游戏   我不知道 哪里错了  可以有人帮我么？？  上面的边框 不能发送  所以没有边框  我的QQ457796406  求大神 帮帮我  我给你 有边框 的代码  我真的不太会了