俄罗斯方块小游戏-C语言实现

首次做关于游戏的小项目 一些想法和过程不是很巧妙还有待改良 仅供参考

#include <stdio.h>
#include <windows.h>
#include <conio.h>
#include <time.h>
//	●■★▓※
//1 ●
//2 ■
#define _HIGH_ 21
#define _WIDTH_ 12
#define _SHAPE_LEN_ 4

void initMap();	//初始背背景图
void printStaticMap();	//打印静态背景图
void gotoxy();	//控制打印光标位置
void printDynamicShape();//打印动态图形
void moveDown();//向下移动
int isCrashY();	//判断是否与下面碰撞
void addStaticMap();	//将动态图形添加到静态背景图中
void moveLeft();	//向左移动
int isCrashXL();	//判断是否与左侧碰撞,能够向左移动
void moveRight();	//向右移动
int isCrashXR();	//判断是否与右侧碰撞,能够向右移动
void drawNewShape();//描绘新图形
void changeShape();//变换图形
void clearFullLine();//清除满行
int isLineFull(int line);//判断该行是否已满
void clearOneLine(int line);//清除一行
void controlSpeed();//控制速度
void printGameOver();//打印输出游戏结束提示
void isRestartGame();//是否重启游戏
void pauseGame();//暂停游戏
void printPauseGame();//打印暂停游戏提示
void printHowToPlay();//打印游戏说明提示
void printNextBorder();//打印下一个图形外围边框
void drawNextShape();//描绘下一个图形
void printNextShape();//打印预示的下一个图形
int isGameOver();//判断游戏是否结束
int isChangeShape(int argy1,int argx1,int argy2,int argx2);	//判断是否变形,argy1代表y坐标,argx1代表x坐标
void initGame();//游戏开始前初始化
void gameOverOrRestart();//游戏结束后是否需要重新开始
void printPicture();//打印一张图片,包括背景图、动态图形、下一个图形
void contrlGame();//控制游戏
struct coord	//保存坐标点
{
	int x;
	int y;
};

int map[_HIGH_][_WIDTH_];//背景图
struct coord shape[_SHAPE_LEN_];//保存图形信息
struct coord nextOneShape[_SHAPE_LEN_];//保存下一个图形信息
int isAddMap = 0;//判断是否添加到静态背景图中
char input = 0;//存输入字符
int currentShape = 0;//保存当前图形编号
int nextShape = 0;	//保存下一个图形编号
int i = 0;	//用于for循环
int level = 1;	//记录游戏难度水平
int score = 0;	//记录游戏分数
int speed = 0;	//记录游戏速度

int main()
{
	initGame();	//游戏开始前初始化
	while(1)
	{
		gameOverOrRestart();//游戏结束后是否需要重新开始
		printPicture();//打印一张图片,包括背景图、动态图形、下一个图形
		contrlGame();	//控制游戏
	}
}

//初始化边框
void initMap()
{
	int i,j;
	for(i = 0; i < _HIGH_; i++)
	{
		map[i][0] = 1;
		map[i][11] = 1;
		for(j = 0; j < _WIDTH_; j++)
		{
			map[_HIGH_-1][j] = 1;
			if(j != 0 && j != _WIDTH_-1 && i != _HIGH_-1)
			{
				map[i][j] = 0;
			}
		}
	}
}
//打印静态背景图
void printStaticMap()
{
	int i,j;
	gotoxy(0,0);//一定要将打印光标移动至原点
	for(i = 0; i < _HIGH_; i++)
	{
		for(j = 0; j < _WIDTH_; j++)
		{
			if(map[i][j] == 0)
			printf("  ");
			else if(map[i][j] == 1)
			printf("★");
			//printf("\033[0;31m★\033[0m ");
			else if(map[i][j] == 2)
			printf("■");
			//printf("\033[0;32m■\033[0m ");
		}
		printf("\n");
	}
	printf("\n");
	printf(" level = %d   score = %d\n",level,score);
	printNextBorder();
}
//控制光标位置
void gotoxy(int x,int y)
{   //让printf,回到x, y点,x, y是坐标,如果打印位置到原点,x 0,y 0,,gotoxy(0, 0);
	int z=0x0b; 
	HANDLE  hOutput; 
	COORD loc; 
	loc.X = x; loc.Y=y;  
	hOutput = GetStdHandle(STD_OUTPUT_HANDLE); 
	SetConsoleCursorPosition(hOutput, loc); 
}
//打印输出动态图形
void printDynamicShape()
{
	int i;
		for(i = 0; i < _SHAPE_LEN_; i++)
		{
			gotoxy(shape[i].x*2,shape[i].y);
			printf("■");
			//printf("\033[0;33m■\033[0m ");
		}
}
//向下移动
void moveDown()
{
	int i;
	if(isCrashY())
	{
		addStaticMap();
		clearFullLine();
		currentShape = nextShape;
		drawNewShape();
		drawNextShape();
		return;
	}
	else
	{
		for(i = 0; i < _SHAPE_LEN_; i++)
		{
			shape[i].y++;
		}
	}
	
}
//判断是否与下面碰撞,即不能向下移动
int isCrashY()
{
	int i;
	for(i = 0; i < _SHAPE_LEN_; i++)
	{
		if(map[shape[i].y+1][shape[i].x] != 0)
			return 1;
	}
	return 0;
}
//添加到静态背景图中
void addStaticMap()
{
	int i;
	isAddMap = 1;
	for(i = 0; i < _SHAPE_LEN_; i++)
	{
		map[shape[i].y][shape[i].x] = 2;
	}
}
//向左移动
void moveLeft()
{
	int i;
	if(isCrashXL())
	{
		return;
	}
	else
	{
		for(i = 0; i < _SHAPE_LEN_; i++)
		{
			shape[i].x--;
		}
	}
}
//判断是否与左侧相碰撞
int isCrashXL()
{
	int i;
	for(i = 0; i < _SHAPE_LEN_; i++)
	{
		if(map[shape[i].y][shape[i].x-1] != 0)
			return 1;
	}
	return 0;
}
//向右移动
void moveRight()
{
	int i;
	if(isCrashXR())
	{
		return;
	}
	else
	{
		for(i = 0; i < _SHAPE_LEN_; i++)
		{
			shape[i].x++;
		}
	}
}
//判断是否与右侧相碰撞
int isCrashXR()
{
	int i;
	for(i = 0; i < _SHAPE_LEN_; i++)
	{
		if(map[shape[i].y][shape[i].x+1] != 0)
			return 1;
	}
	return 0;
}
//描绘新的图形
void drawNewShape()
{
	switch(currentShape)
	{
		case 0:
			shape[0].x = 5;	//■■
			shape[0].y = 0;	//■■
			shape[1].x = 6;
			shape[1].y = 0;
			shape[2].x = 5;
			shape[2].y = 1;
			shape[3].x = 6;
			shape[3].y = 1;
			break;
		case 1:
			shape[0].x = 4;	//■■■■
			shape[0].y = 0;
			shape[1].x = 5;
			shape[1].y = 0;
			shape[2].x = 6;
			shape[2].y = 0;
			shape[3].x = 7;
			shape[3].y = 0;
			break;
		case 2:
			shape[0].x = 6;	//■
			shape[0].y = 0;	//■
			shape[1].x = 6;	//■
			shape[1].y = 1;	//■
			shape[2].x = 6;
			shape[2].y = 2;
			shape[3].x = 6;
			shape[3].y = 3;
			break;
		case 3:
			shape[0].x = 5;	//■■
			shape[0].y = 0;	//  ■
			shape[1].x = 6;	//  ■
			shape[1].y = 0;
			shape[2].x = 6;
			shape[2].y = 1;
			shape[3].x = 6;
			shape[3].y = 2;
			break;
		case 4:
			shape[0].x = 6;	//	  ■
			shape[0].y = 0;	//■■■
			shape[1].x = 4;	
			shape[1].y = 1;
			shape[2].x = 5;
			shape[2].y = 1;
			shape[3].x = 6;
			shape[3].y = 1;
			break;
		case 5:				//  ■
			shape[0].x = 5;	//	■
			shape[0].y = 0;	//	■■
			shape[1].x = 5;	
			shape[1].y = 1;
			shape[2].x = 5;
			shape[2].y = 2;
			shape[3].x = 6;
			shape[3].y = 2;
			break;
		case 6:				
			shape[0].x = 4;	
			shape[0].y = 0;	//■■■
			shape[1].x = 5;	//■
			shape[1].y = 0;
			shape[2].x = 6;
			shape[2].y = 0;
			shape[3].x = 4;
			shape[3].y = 1;
			break;
		case 7:				
			shape[0].x = 5;	
			shape[0].y = 0;	//■■
			shape[1].x = 6;	//■
			shape[1].y = 0; //■
			shape[2].x = 5;
			shape[2].y = 1;
			shape[3].x = 5;
			shape[3].y = 2;
			break;
		case 8:				
			shape[0].x = 4;	
			shape[0].y = 0;	//■■■
			shape[1].x = 5;	//	  ■
			shape[1].y = 0; 
			shape[2].x = 6;
			shape[2].y = 0;
			shape[3].x = 6;
			shape[3].y = 1;
			break;
		case 9:				
			shape[0].x = 6;	
			shape[0].y = 0;	//  ■
			shape[1].x = 6;	//	■
			shape[1].y = 1; //■■
			shape[2].x = 6;
			shape[2].y = 2;
			shape[3].x = 5;
			shape[3].y = 2;
			break;
		case 10:				
			shape[0].x = 4;	
			shape[0].y = 0;	
			shape[1].x = 4;	//■
			shape[1].y = 1; //■■■
			shape[2].x = 5;
			shape[2].y = 1;
			shape[3].x = 6;
			shape[3].y = 1;
			break;
		case 11:			//  ■
			shape[0].x = 5;	//■■■
			shape[0].y = 0;
			shape[1].x = 4;
			shape[1].y = 1;
			shape[2].x = 5;
			shape[2].y = 1;
			shape[3].x = 6;
			shape[3].y = 1;
			break;
		case 12:
			shape[0].x = 5;	//■
			shape[0].y = 0;	//■■
			shape[1].x = 5;	//■
			shape[1].y = 1;	
			shape[2].x = 6;
			shape[2].y = 1;
			shape[3].x = 5;
			shape[3].y = 2;
			break;
		case 13:			
			shape[0].x = 4;	//■■■
			shape[0].y = 0;	//  ■
			shape[1].x = 5;	
			shape[1].y = 0;
			shape[2].x = 6;
			shape[2].y = 0;
			shape[3].x = 5;
			shape[3].y = 1;
			break;
		case 14:
			shape[0].x = 5;	//	■
			shape[0].y = 1;	//■■
			shape[1].x = 6;	//  ■
			shape[1].y = 0;
			shape[2].x = 6;
			shape[2].y = 1;
			shape[3].x = 6;
			shape[3].y = 2;
			break;
		case 15:			//  ■■
			shape[0].x = 5;	//■■
			shape[0].y = 0;
			shape[1].x = 6;
			shape[1].y = 0;
			shape[2].x = 4;
			shape[2].y = 1;
			shape[3].x = 5;
			shape[3].y = 1;
			break;
		case 16:
			shape[0].x = 5;	//■
			shape[0].y = 0;	//■■
			shape[1].x = 5;	//  ■
			shape[1].y = 1;	
			shape[2].x = 6;
			shape[2].y = 1;
			shape[3].x = 6;
			shape[3].y = 2;
			break;
		case 17:			
			shape[0].x = 4;	//■■
			shape[0].y = 0;	//  ■■
			shape[1].x = 5;	
			shape[1].y = 0;
			shape[2].x = 5;
			shape[2].y = 1;
			shape[3].x = 6;
			shape[3].y = 1;
			break;
		case 18:
			shape[0].x = 6;	//	■
			shape[0].y = 0;	//■■
			shape[1].x = 5;	//■
			shape[1].y = 1;
			shape[2].x = 6;
			shape[2].y = 1;
			shape[3].x = 5;
			shape[3].y = 2;
			break;
	}
}
//变换图形
void changeShape()
{
	switch(currentShape)
	{
		case 0:
			break;
		case 1:
		//	if(isChange01())
			if(isChangeShape(-1,0,2,0))
			{
				shape[0].x = shape[1].x;
				shape[0].y = shape[1].y-1;
				shape[2].x = shape[1].x;
				shape[2].y = shape[1].y+1;
				shape[3].x = shape[1].x;
				shape[3].y = shape[1].y+2;
				currentShape = 2;
			}
			break;
		case 2:
		//	if(isChange02())
			if(isChangeShape(0,-1,0,2))
			{
				shape[0].x = shape[2].x-1;
				shape[0].y = shape[2].y;
				shape[1].x = shape[2].x+1;
				shape[1].y = shape[2].y;
				shape[3].x = shape[2].x+2;
				shape[3].y = shape[2].y;
				currentShape = 1;
			}
			break;
		case 3:
			if(isChangeShape(0,1,0,0))
			{
				shape[0].x = shape[1].x+1;
				shape[0].y = shape[1].y-1;
				shape[2].x = shape[1].x+1;
				shape[2].y = shape[1].y;
				shape[3].x = shape[1].x-1;
				shape[3].y = shape[1].y;
				currentShape = 4;
			}
				break;
		case 4:
			if(isChangeShape(1,0,0,0))
			{
				shape[0].x = shape[2].x+1;
				shape[0].y = shape[2].y+1;
				shape[1].x = shape[2].x;
				shape[1].y = shape[2].y+1;
				shape[3].x = shape[2].x;
				shape[3].y = shape[2].y-1;
				currentShape = 5;
			}
				break;
		case 5:
			if(isChangeShape(0,-1,0,0))
			{
				shape[0].x = shape[2].x-1;
				shape[0].y = shape[2].y+1;
				shape[1].x = shape[2].x-1;
				shape[1].y = shape[2].y;
				shape[3].x = shape[2].x+1;
				shape[3].y = shape[2].y;
				currentShape = 6;
			}
				break;
		case 6:
			if(isChangeShape(-1,0,0,0))
			{
				shape[0].x = shape[2].x-1;
				shape[0].y = shape[2].y-1;
				shape[1].x = shape[2].x;
				shape[1].y = shape[2].y-1;
				shape[3].x = shape[2].x;
				shape[3].y = shape[2].y+1;
				currentShape = 3;
			}
				break;
		case 7:
			if(isChangeShape(0,-1,0,0))
			{
				shape[0].x = shape[2].x+1;
				shape[0].y = shape[2].y+1;
				shape[1].x = shape[2].x+1;
				shape[1].y = shape[2].y;
				shape[3].x = shape[2].x-1;
				shape[3].y = shape[2].y;
				currentShape = 8;
			}
			break;
		case 8:
			if(isChangeShape(1,0,-1,0))
			{
				shape[0].x = shape[2].x-1;
				shape[0].y = shape[2].y+1;
				shape[1].x = shape[2].x;
				shape[1].y = shape[2].y+1;
				shape[3].x = shape[2].x;
				shape[3].y = shape[2].y-1;
				currentShape = 9;
			}
			break;
		case 9:
			if(isChangeShape(0,1,0,0))
			{
				shape[0].x = shape[2].x-1;
				shape[0].y = shape[2].y-1;
				shape[1].x = shape[2].x-1;
				shape[1].y = shape[2].y;
				shape[3].x = shape[2].x+1;
				shape[3].y = shape[2].y;
				currentShape = 10;
			}
				break;
		case 10:
			if(isChangeShape(1,0,0,0))
			{
				shape[0].x = shape[2].x+1;
				shape[0].y = shape[2].y-1;
				shape[1].x = shape[2].x;
				shape[1].y = shape[2].y-1;
				shape[3].x = shape[2].x;
				shape[3].y = shape[2].y+1;
				currentShape = 7;
			}
				break;
		case 11:
			if(isChangeShape(1,0,0,0))
			{
				shape[0].x = shape[2].x+1;
				shape[0].y = shape[2].y;
				shape[1].x = shape[2].x;
				shape[1].y = shape[2].y-1;
				shape[3].x = shape[2].x;
				shape[3].y = shape[2].y+1;
				currentShape = 12;
			}
			break;
		case 12:
			if(isChangeShape(0,-1,0,0))
			{
				shape[0].x = shape[2].x;
				shape[0].y = shape[2].y+1;
				shape[1].x = shape[2].x+1;
				shape[1].y = shape[2].y;
				shape[3].x = shape[2].x-1;
				shape[3].y = shape[2].y;
				currentShape = 13;
			}
			break;
		case 13:
			if(isChangeShape(1,0,0,0))
			{
				shape[0].x = shape[2].x-1;
				shape[0].y = shape[2].y;
				shape[1].x = shape[2].x;
				shape[1].y = shape[2].y+1;
				shape[3].x = shape[2].x;
				shape[3].y = shape[2].y-1;
				currentShape = 14;
			}
				break;
		case 14:
			if(isChangeShape(0,1,0,0))
			{
				shape[0].x = shape[2].x;
				shape[0].y = shape[2].y-1;
				shape[1].x = shape[2].x-1;
				shape[1].y = shape[2].y;
				shape[3].x = shape[2].x+1;
				shape[3].y = shape[2].y;
				currentShape = 11;
			}
				break;
		case 15:
			if(isChangeShape(1,0,0,0))
			{
				shape[0].x = shape[3].x+1;
				shape[0].y = shape[3].y+1;
				shape[1].x = shape[3].x+1;
				shape[1].y = shape[3].y;
				shape[2].x = shape[3].x;
				shape[2].y = shape[3].y-1;
				currentShape = 16;
			}
				break;
		case 16:
			if(isChangeShape(0,-1,0,0))
			{
				shape[0].x = shape[3].x;
				shape[0].y = shape[3].y-1;
				shape[1].x = shape[3].x+1;
				shape[1].y = shape[3].y-1;
				shape[2].x = shape[3].x-1;
				shape[2].y = shape[3].y;
				currentShape = 15;
			}
				break;
		case 17:
			if(isChangeShape(1,0,0,0))
			{
				shape[0].x = shape[2].x+1;
				shape[0].y = shape[2].y-1;
				shape[1].x = shape[2].x+1;
				shape[1].y = shape[2].y;
				shape[3].x = shape[2].x;
				shape[3].y = shape[2].y+1;
				currentShape = 18;
			}
				break;
		case 18:
			if(isChangeShape(0,-1,0,0))
			{
				shape[0].x = shape[2].x-1;
				shape[0].y = shape[2].y-1;
				shape[1].x = shape[2].x;
				shape[1].y = shape[2].y-1;
				shape[3].x = shape[2].x+1;
				shape[3].y = shape[2].y;
				currentShape = 17;
			}
				break;

	}
}
//描绘下一个图形shape
void drawNextShape()
{
	nextShape = rand()%19;
	switch(nextShape)
	{
		case 0:
			nextOneShape[0].x = 14; //x += 9 y += 3;
			nextOneShape[0].y = 3;
			nextOneShape[1].x = 15;
			nextOneShape[1].y = 3;
			nextOneShape[2].x = 14;
			nextOneShape[2].y = 4;
			nextOneShape[3].x = 15;
			nextOneShape[3].y = 4;
			break;
		case 1:
			nextOneShape[0].x = 13;
			nextOneShape[0].y = 3;
			nextOneShape[1].x = 14;
			nextOneShape[1].y = 3;
			nextOneShape[2].x = 15;
			nextOneShape[2].y = 3;
			nextOneShape[3].x = 16;
			nextOneShape[3].y = 3;
			break;
		case 2:
			nextOneShape[0].x = 14;
			nextOneShape[0].y = 2;
			nextOneShape[1].x = 14;
			nextOneShape[1].y = 3;
			nextOneShape[2].x = 14;
			nextOneShape[2].y = 4;
			nextOneShape[3].x = 14;
			nextOneShape[3].y = 5;
			break;
		case 3:
			nextOneShape[0].x = 14;	//■■
			nextOneShape[0].y = 3;	//  ■
			nextOneShape[1].x = 15;	//  ■
			nextOneShape[1].y = 3;
			nextOneShape[2].x = 15;
			nextOneShape[2].y = 4;
			nextOneShape[3].x = 15;
			nextOneShape[3].y = 5;
			break;
		case 4:
			nextOneShape[0].x = 15;	//	  ■
			nextOneShape[0].y = 3;	//■■■
			nextOneShape[1].x = 13;	
			nextOneShape[1].y = 4;
			nextOneShape[2].x = 14;
			nextOneShape[2].y = 4;
			nextOneShape[3].x = 15;
			nextOneShape[3].y = 4;
			break;
		case 5:						//  ■
			nextOneShape[0].x = 14;	//	■
			nextOneShape[0].y = 3;	//■■
			nextOneShape[1].x = 14;	
			nextOneShape[1].y = 4;
			nextOneShape[2].x = 14;
			nextOneShape[2].y = 5;
			nextOneShape[3].x = 15;
			nextOneShape[3].y = 5;
			break;
		case 6:				
			nextOneShape[0].x = 13;	
			nextOneShape[0].y = 3;	//■■■
			nextOneShape[1].x = 14;	//■
			nextOneShape[1].y = 3;
			nextOneShape[2].x = 15;
			nextOneShape[2].y = 3;
			nextOneShape[3].x = 13;
			nextOneShape[3].y = 4;
			break;
		case 7:				
			nextOneShape[0].x = 14;	
			nextOneShape[0].y = 3;	//■■
			nextOneShape[1].x = 15;	//■
			nextOneShape[1].y = 3;	//■
			nextOneShape[2].x = 14;
			nextOneShape[2].y = 4;
			nextOneShape[3].x = 14;
			nextOneShape[3].y = 5;
			break;
		case 8:				
			nextOneShape[0].x = 13;	
			nextOneShape[0].y = 3;	//■■■
			nextOneShape[1].x = 14;	//	  ■
			nextOneShape[1].y = 3; 
			nextOneShape[2].x = 15;
			nextOneShape[2].y = 3;
			nextOneShape[3].x = 15;
			nextOneShape[3].y = 4;
			break;
		case 9:				
			nextOneShape[0].x = 15;	
			nextOneShape[0].y = 3;	//  ■
			nextOneShape[1].x = 15;	//	■
			nextOneShape[1].y = 4;	//■■
			nextOneShape[2].x = 15;
			nextOneShape[2].y = 5;
			nextOneShape[3].x = 14;
			nextOneShape[3].y = 5;
			break;
		case 10:				
			nextOneShape[0].x = 13;	
			nextOneShape[0].y = 3;	
			nextOneShape[1].x = 13;//■
			nextOneShape[1].y = 4; //■■■
			nextOneShape[2].x = 14;
			nextOneShape[2].y = 4;
			nextOneShape[3].x = 15;
			nextOneShape[3].y = 4;
			break;
		case 11:					//  ■
			nextOneShape[0].x = 14;	//■■■
			nextOneShape[0].y = 3;
			nextOneShape[1].x = 13;
			nextOneShape[1].y = 4;
			nextOneShape[2].x = 14;
			nextOneShape[2].y = 4;
			nextOneShape[3].x = 15;
			nextOneShape[3].y = 4;
			break;
		case 12:
			nextOneShape[0].x = 14;	//■
			nextOneShape[0].y = 3;	//■■
			nextOneShape[1].x = 14;	//■
			nextOneShape[1].y = 4;	
			nextOneShape[2].x = 15;
			nextOneShape[2].y = 4;
			nextOneShape[3].x = 14;
			nextOneShape[3].y = 5;
			break;
		case 13:			
			nextOneShape[0].x = 13;	//■■■
			nextOneShape[0].y = 3;	//  ■
			nextOneShape[1].x = 14;	
			nextOneShape[1].y = 3;
			nextOneShape[2].x = 15;
			nextOneShape[2].y = 3;
			nextOneShape[3].x = 14;
			nextOneShape[3].y = 4;
			break;
		case 14:
			nextOneShape[0].x = 14;	//	■
			nextOneShape[0].y = 4;	//■■
			nextOneShape[1].x = 15;	//  ■
			nextOneShape[1].y = 3;
			nextOneShape[2].x = 15;
			nextOneShape[2].y = 4;
			nextOneShape[3].x = 15;
			nextOneShape[3].y = 5;
			break;
		case 15:				//  ■■
			nextOneShape[0].x = 14;	//■■
			nextOneShape[0].y = 3;
			nextOneShape[1].x = 15;
			nextOneShape[1].y = 3;
			nextOneShape[2].x = 13;
			nextOneShape[2].y = 4;
			nextOneShape[3].x = 14;
			nextOneShape[3].y = 4;
			break;
		case 16:
			nextOneShape[0].x = 14;	//■
			nextOneShape[0].y = 3;	//■■
			nextOneShape[1].x = 14;	//  ■
			nextOneShape[1].y = 4;	
			nextOneShape[2].x = 15;
			nextOneShape[2].y = 4;
			nextOneShape[3].x = 15;
			nextOneShape[3].y = 5;
			break;
		case 17:			
			nextOneShape[0].x = 13;	//■■
			nextOneShape[0].y = 3;	//  ■■
			nextOneShape[1].x = 14;	
			nextOneShape[1].y = 3;
			nextOneShape[2].x = 14;
			nextOneShape[2].y = 4;
			nextOneShape[3].x = 15;
			nextOneShape[3].y = 4;
			break;
		case 18:
			nextOneShape[0].x = 15;	//	■
			nextOneShape[0].y = 3;	//■■
			nextOneShape[1].x = 14;	//■
			nextOneShape[1].y = 4;
			nextOneShape[2].x = 15;
			nextOneShape[2].y = 4;
			nextOneShape[3].x = 14;
			nextOneShape[3].y = 5;
			break;
	}
}
//清除满行
void clearFullLine()
{
	int i;
	for(i = _HIGH_-2; i >= 0; i--)
	{
		if(isLineFull(i))
		{
			clearOneLine(i);
			score += 100;
			i++;
		}
	}
}
//判断一行是否已满
int isLineFull(int line)
{
	int j;
	for(j = 1; j <= _WIDTH_-2; j++)
	{
		if(map[line][j] == 0)
		{
			return 0;
		}
	}
	if(j == _WIDTH_-1)
	{
		return 1;
	}
	
}
//清除一满行
void clearOneLine(int line)
{
	int i,j;
	for(i = line; i > 0; i--)
	{
		for(j = 1; j <= _WIDTH_-2; j++)
		{
			map[i][j] = map[i-1][j];
		}
	}
}
//判断是否能够进行旋转
int isChangeShape(int argy1,int argx1,int argy2,int argx2)
{
	int i;
	for(i = 0; i < _SHAPE_LEN_; i++)
	{
			if(map[shape[i].y+argy1][shape[i].x+argx1] != 0 || map[shape[i].y+argy2][shape[i].x+argx2] != 0)//不等于0,说明碰撞
			{
				return 0;
			}
	}
	return 1;
}
判断是否能够旋转图形—1
//int isChange01()
//{
//	int i;
//	for(i = 0; i < _SHAPE_LEN_; i++)
//	{
//		if(map[shape[i].y+2][shape[i].x] != 0 || map[shape[i].y-1][shape[i].x] != 0)//不等于0,说明碰撞
//		{
//			return 0;
//		}
//	}
//	return 1;
//}
判断是否能够旋转图形—2
//int isChange02()
//{
//	int i;
//	for(i = 0; i < _SHAPE_LEN_; i++)
//	{
//		if(map[shape[i].y][shape[i].x+2] != 0 || map[shape[i].y][shape[i].x-1] != 0)
//		{
//			return 0;
//		}
//	}
//	return 1;
//}
//控制速度
void controlSpeed()
{
	if(score >= 0 && score < 500)
	{
		level = 1;
		speed = 20;
	}
	else if(score < 1000)
	{
		level = 2;
		speed = 15;
	}
	else if(score < 1500)
	{
		level = 3;
		speed = 10;
	}
	else if(score < 2000)
	{
		level = 4;
		speed = 5;
	}
}
//判断游戏是否结束
int isGameOver()
{
	int i;
	for(i = 1; i <= _WIDTH_ -2; i++)
	{
		if(map[0][i] != 0)
		{
			return 1;
		}
	}
	return 0;
}
//打印输出游戏结束提示
void printGameOver()
{
	gotoxy(2,5);
	printf("                   ");
	gotoxy(2,6);
	printf("   ▓※▓※▓※▓");
	gotoxy(2,7);
	printf("   ※ GAMEOVER ※");
	gotoxy(2,8);
	printf("   ▓※▓※▓※▓");
	gotoxy(2,9);
	printf("                   ");
	gotoxy(2,10);
	printf("                   ");
	gotoxy(2,11);
	printf("  按回车键重新开始");
	gotoxy(2,12);
	printf("                   ");
	gotoxy(2,13);
	printf("  按其它键游戏结束");
	gotoxy(2,14);
	printf("                   ");
}
//是否重新开始游戏
void isRestartGame()
{
	printGameOver();
	input = _getch();	
	if(input == 13)
	{
		initMap();	//初始化背景图
		srand((int)time(0));//初始化随机种子
		currentShape = rand()%19;	//生成随机图形号
		drawNewShape();	//描绘出画新图形
	}
	else
	{
		exit(-1);
	}
}
//暂停游戏
void pauseGame()
{
	char ch = 0;
	int count = 0;
	printPauseGame();
	while(1)
	{
		if(_kbhit())
		{
			ch = _getch();
		}
		if(ch == 32)
		{
			while(1)
			{
				if(_kbhit())
				{
					ch = _getch();
				}
				if(ch == 32)
				{
					return;
				}
			}
		}
	}
}
//打印输出暂停游戏提示
void printPauseGame()
{
	gotoxy(2,5);
	printf("                   ");
	gotoxy(2,6);
	printf("   ▓※▓※▓※▓");
	gotoxy(2,7);
	printf("   ※  PAUSE   ※");
	gotoxy(2,8);
	printf("   ▓※▓※▓※▓");
	gotoxy(2,9);
	printf("                   ");
	gotoxy(2,10);
	printf("                   ");
	gotoxy(2,11);
	printf("  第一次空格键暂停");
	gotoxy(2,12);
	printf("                   ");
	gotoxy(2,13);
	printf("  第二次空格键开始");
	gotoxy(2,14);
	printf("                   ");
}
//打印输出游戏说明
void printHowToPlay()
{
	initMap();
	printStaticMap();
	gotoxy(2,0);
	printf("★★★★★★★★★★★");
	gotoxy(2,2);
	printf("   俄 罗 斯 方 块");
	gotoxy(2,5);
	printf("      游戏说明");
	gotoxy(2,8);
	printf("   ↑:  变换图形");
	gotoxy(2,10);
	printf("   ↓:  向下移动");
	gotoxy(2,12);
	printf("   ←:  向左移动");
	gotoxy(2,14);
	printf("   →:  向右移动");
	gotoxy(2,16);
	printf("  Enter:  开始游戏");
	gotoxy(2,18);
	printf("  Space:  暂停游戏");
	while(1)
	{
		input =  _getch();
		if(input == 13)
		{
			break;
		}
	}
}
//打印输出下一个图形边框
void printNextBorder()
{
	gotoxy(24,0);
	printf("★★★★★★★");
	gotoxy(24,1);
	printf("            ★");
	gotoxy(24,2);
	printf("            ★");
	gotoxy(24,3);
	printf("            ★");
	gotoxy(24,4);
	printf("            ★");
	gotoxy(24,5);
	printf("            ★");
	gotoxy(24,6);
	printf("            ★");
	gotoxy(24,7);
	printf("★★★★★★★");
}
//打印输出下一个图形
void printNextShape()
{
	int i;
	for(i = 0; i < _SHAPE_LEN_; i++)
	{
		gotoxy(nextOneShape[i].x*2,nextOneShape[i].y);
		printf("■");
	}
}
//****************************************
//游戏开始前初始化
void initGame()
{
	printHowToPlay();	//显示游戏说明
	srand((int)time(0));//初始化随机种子
	currentShape = rand()%19;	//生成随机图形号
	drawNewShape();		//描绘出当前新图形
	drawNextShape();	//描绘下一个新图形
}
//游戏结束后是否需要重新开始
void gameOverOrRestart()
{
		/*gotoxy(2*x,y++);
		printf("■");*/
		if(isGameOver())
		{
			isRestartGame();
		}
		/*if(isAddMap)
		{
			isAddMap = 0;
			drawNewShape();
		}*/
}
//打印一张图片,包括背景图、动态图形、下一个图形
void printPicture()
{
	printStaticMap();	//打印静态背景图
	printDynamicShape();//打印动态图形
	printNextShape();	//打印下一个图形
}
//控制游戏
void contrlGame()
{
	controlSpeed();
	for(i= 0; i < speed; i++)
	{
		if(_kbhit())
		{
			input = _getch();
		}
		switch(input)
		{
			case 75:	//向左键
				moveLeft();		//向左移动
				input = 0;
				break;
			case 77:	//向右键
				moveRight();	//向右移动
				input = 0;
				break;
			case 80:	//向下键
				moveDown();		//向下移动
				input = 0;
				break;
			case 72:	//向下键
				changeShape();	//变换图形
				input = 0;
				break;
			case 32:	//空格键
				pauseGame();	//暂停游戏
				input = 0;
				break;
		}
		Sleep(25);	
	}
	moveDown();		
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以!以下是一个简单的用C语言实现俄罗斯方块小游戏的代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <Windows.h> #define WIDTH 10 #define HEIGHT 20 int board[HEIGHT][WIDTH] = {0}; int currentPiece[4][4] = {0}; int currentX = 0, currentY = 0; void drawBoard() { int i, j; for (i = 0; i < HEIGHT; i++) { for (j = 0; j < WIDTH; j++) { if (board[i][j] == 0) printf(" "); else printf("*"); } printf("\n"); } } void drawPiece() { int i, j; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { if (currentPiece[i][j] == 1) { board[currentY + i][currentX + j] = 1; } } } } int checkCollision() { int i, j; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { if (currentPiece[i][j] == 1 && (currentX + j >= WIDTH || currentX + j < 0 || currentY + i >= HEIGHT || board[currentY + i][currentX + j] == 1)) return 1; } } return 0; } void rotatePiece() { int tempPiece[4][4]; int i, j; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { tempPiece[i][j] = currentPiece[i][j]; } } for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { currentPiece[i][j] = tempPiece[3 - j][i]; } } } void clearLines() { int i, j; for (i = HEIGHT - 1; i >= 0; i--) { int lineComplete = 1; for (j = 0; j < WIDTH; j++) { if (board[i][j] == 0) { lineComplete = 0; break; } } if (lineComplete) { int k; for (k = i; k > 0; k--) { for (j = 0; j < WIDTH; j++) { board[k][j] = board[k - 1][j]; } } for (j = 0; j < WIDTH; j++) { board[0][j] = 0; } } } } int main() { char action; int gameOver = 0; // 初始化随机数种子 srand((unsigned int)time(NULL)); // 初始化方块形状 int pieces[7][4][4] = { {{1, 1, 0, 0}, {1, 1, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}, {{1, 1, 1, 1}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}, {{1, 1, 1, 0}, {1, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}, {{1, 1, 1, 0}, {0, 0, 1, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}, {{1, 1, 1, 0}, {0, 1, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}, {{1, 1, 1, 0}, {0, 0, 1, 1}, {0, 0, 0, 0}, {0, 0, 0, 0}}, {{1, 1, 1, 0}, {1, 1, 1, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}} }; // 游戏循环 while (!gameOver) { // 清空当前方块 int i, j; for (i = currentY; i < currentY + 4; i++) { for (j = currentX; j < currentX + 4; j++) { if (i >= 0 && i < HEIGHT && j >= 0 && j < WIDTH) { if (currentPiece[i - currentY][j - currentX] == 1) { board[i][j] = 0; } } } } // 生成新的方块 int nextPiece = rand() % 7; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { currentPiece[i][j] = pieces[nextPiece][i][j]; } } currentX = WIDTH / 2 - 2; currentY = 0; // 绘制当前方块 drawPiece(); // 绘制游戏界面 system("cls"); drawBoard(); // 等待用户输入 action = getch(); // 处理用户输入 switch (action) { case 'a': currentX--; if (checkCollision()) currentX++; break; case 'd': currentX++; if (checkCollision()) currentX--; break; case 's': currentY++; if (checkCollision()) { currentY--; drawPiece(); clearLines(); if (checkCollision()) { gameOver = 1; } } break; case 'w': rotatePiece(); if (checkCollision()) rotatePiece(); break; case 'q': gameOver = 1; break; } } printf("Game Over!\n"); return 0; } ``` 这是一个基本的俄罗斯方块游戏代码,使用了Windows.h头文件中的conio.h库来获取用户输入,使用了Windows的命令行窗口来进行绘制。你可以使用gcc编译器来编译运行该代码。 注意:这只是一个简单的示例,可能还需要进行进一步的优化和改进,比如添加计分系统、游戏结束判断等。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值