zoukankan      html  css  js  c++  java
  • 用C++实现俄罗斯方块(Tetris)游戏

    我是一个C++初学者,控制台实现了一个俄罗斯方块游戏。

    代码如下:

    //"俄罗斯方块"V1.0
    //李国良于2017年1月20日编写完成
    #include <iostream>
    #include <string>
    #include <ctime>
    #include <cstdlib>
    #include <windows.h>
    #include <conio.h>
    
    using namespace std;
    
    int block00[4][4] = { { 10,0,0,0 },{ 1,1,1,1 },{ 0,0,0,0 },{ 0,0,0,0 } };
    int block01[4][4] = { { 11,0,1,0 },{ 0,0,1,0 },{ 0,0,1,0 },{ 0,0,1,0 } };
    int block02[4][4] = { { 12,0,0,0 },{ 0,0,0,0 },{ 1,1,1,0 },{ 0,1,0,0 } };
    int block03[4][4] = { { 13,0,0,0 },{ 0,1,0,0 },{ 1,1,0,0 },{ 0,1,0,0 } };
    int block04[4][4] = { { 14,0,0,0 },{ 0,0,0,0 },{ 0,1,0,0 },{ 1,1,1,0 } };
    int block05[4][4] = { { 15,0,0,0 },{ 0,1,0,0 },{ 0,1,1,0 },{ 0,1,0,0 } };
    int block06[4][4] = { { 16,0,0,0 },{ 0,0,0,0 },{ 1,1,1,0 },{ 1,0,0,0 } };
    int block07[4][4] = { { 17,0,0,0 },{ 1,1,0,0 },{ 0,1,0,0 },{ 0,1,0,0 } };
    int block08[4][4] = { { 18,0,0,0 },{ 0,0,0,0 },{ 0,0,1,0 },{ 1,1,1,0 } };
    int block09[4][4] = { { 19,0,0,0 },{ 0,1,0,0 },{ 0,1,0,0 },{ 0,1,1,0 } };
    int block10[4][4] = { { 20,0,0,0 },{ 0,0,0,0 },{ 1,1,1,0 },{ 0,0,1,0 } };
    int block11[4][4] = { { 21,0,0,0 },{ 0,1,0,0 },{ 0,1,0,0 },{ 1,1,0,0 } };
    int block12[4][4] = { { 22,0,0,0 },{ 0,0,0,0 },{ 1,0,0,0 },{ 1,1,1,0 } };
    int block13[4][4] = { { 23,0,0,0 },{ 0,1,1,0 },{ 0,1,0,0 },{ 0,1,0,0 } };
    int block14[4][4] = { { 24,0,0,0 },{ 0,0,0,0 },{ 0,1,1,0 },{ 1,1,0,0 } };
    int block15[4][4] = { { 25,0,0,0 },{ 1,0,0,0 },{ 1,1,0,0 },{ 0,1,0,0 } };
    int block16[4][4] = { { 26,0,0,0 },{ 0,0,0,0 },{ 1,1,0,0 },{ 0,1,1,0 } };
    int block17[4][4] = { { 27,0,0,0 },{ 0,0,1,0 },{ 0,1,1,0 },{ 0,1,0,0 } };
    int block18[4][4] = { { 28,0,0,0 },{ 0,0,0,0 },{ 1,1,0,0 },{ 1,1,0,0 } };
    
    void initialWindow(HANDLE hOut);//初始化窗口
    void initialPrint(HANDLE hOut);//初始化界面
    void gotoXY(HANDLE hOut, int x, int y);//移动光标
    void roundBlock(HANDLE hOut, int block[4][4]);//随机生成方块并打印到下一个方块位置
    bool collisionDetection(int block[4][4], int map[21][12], int x, int y);//检测碰撞
    void printBlock(HANDLE hOut, int block[4][4], int x, int y);//打印方块
    void clearBlock(HANDLE hOut, int block[4][4], int x, int y);//消除方块
    void myLeft(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//左移
    void myRight(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//右移
    void myUp(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//顺时针旋转90度
    int myDown(HANDLE hOut, int block[4][4], int map[21][12], int &x, int y);//加速下落
    void myStop(HANDLE hOut, int block[4][4]);//游戏暂停
    void gameOver(HANDLE hOut, int block[4][4], int map[21][12]);//游戏结束
    void eliminateRow(HANDLE hOut, int map[21][12], int &val, int &fraction, int &checkpoint);//判断是否能消行并更新分值
    int main()
    {
    	int map[21][12];
    	int blockA[4][4];//候选区的方块
    	int blockB[4][4];//下落中的方块
    	int positionX, positionY;//方块左上角的坐标
    	bool check;//检查方块还能不能下落
    	char key;//用来存储按键
    	int val;//用来控制下落速度
    	int fraction;//用来存储得分
    	int checkpoint;//用来存储关卡
    	int times;
    	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);//获取标准输出设备句柄
    	initialWindow(hOut);
    initial:
    	gotoXY(hOut, 0, 0);
    	initialPrint(hOut);
    	check = true;
    	val = 50;
    	fraction = 0;
    	checkpoint = 1;
    	times = val;
    	for (int i = 0; i < 20; ++i)
    	{
    		for (int j = 1; j < 11; ++j)
    		{
    			map[i][j] = 0;
    		}
    	}
    	for (int i = 0; i < 20; ++i)
    	{
    		map[i][0] = map[i][11] = 1;
    	}
    	for (int i = 0; i < 12; ++i)
    	{
    		map[20][i] = 1;
    	}
    
    	srand((unsigned)time(NULL));
    	roundBlock(hOut, blockA);
    	while (true)
    	{
    		if (check)
    		{
    			eliminateRow(hOut, map, val, fraction, checkpoint);
    			check = false;
    			positionX = -3;
    			positionY = 4;
    			if (collisionDetection(blockA, map, positionX, positionY))
    			{
    				for (int i = 0; i < 4; ++i)
    				{
    					for (int j = 0; j < 4; ++j)
    					{
    						blockB[i][j] = blockA[i][j];
    					}
    				}
    				roundBlock(hOut, blockA);
    			}
    			else
    			{
    				gameOver(hOut, blockA, map);
    				goto initial;
    			}
    		}
    		printBlock(hOut, blockB, positionX, positionY);
    		if (_kbhit())
    		{
    			key = _getch();
    			switch (key)
    			{
    			case 72:
    				myUp(hOut, blockB, map, positionX, positionY);
    				break;
    			case 75:
    				myLeft(hOut, blockB, map, positionX, positionY);
    				break;
    			case 77:
    				myRight(hOut, blockB, map, positionX, positionY);
    				break;
    			case 80:
    				switch (myDown(hOut, blockB, map, positionX, positionY))
    				{
    				case 0:
    					check = false;
    					break;
    				case 1:
    					check = true;
    					break;
    				case 2:
    					gameOver(hOut, blockB, map);
    					goto initial;
    				default:
    					break;
    				}
    				break;
    			case 32:
    				myStop(hOut, blockA);
    				break;
    			case 27:
    				exit(0);
    			default:
    				break;
    			}
    		}
    		Sleep(20);
    		if (0 == --times)
    		{
    			switch (myDown(hOut, blockB, map, positionX, positionY))
    			{
    			case 0:
    				check = false;
    				break;
    			case 1:
    				check = true;
    				break;
    			case 2:
    				gameOver(hOut, blockB, map);
    				goto initial;
    			default:
    				break;
    			}
    			times = val;
    		}
    	}
    	cin.get();
    	return 0;
    }
    
    void initialWindow(HANDLE hOut)
    {
    	SetConsoleTitle("俄罗斯方块");
    	COORD size = { 80, 25 };
    	SetConsoleScreenBufferSize(hOut, size);
    	SMALL_RECT rc = { 0, 0, 79, 24 };
    	SetConsoleWindowInfo(hOut, true, &rc);
    	CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
    	SetConsoleCursorInfo(hOut, &cursor_info);
    }
    
    void initialPrint(HANDLE hOut)
    {
    	SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
    	for (int i = 0; i < 20; ++i)
    	{
    		cout << "■                    ■☆                      ☆" << endl;
    	}
    	gotoXY(hOut, 26, 0);
    	cout << "☆☆☆☆☆☆☆☆☆☆☆";
    	gotoXY(hOut, 0, 20);
    	cout << "■■■■■■■■■■■■☆☆☆☆☆☆☆☆☆☆☆☆☆";
    	gotoXY(hOut, 26, 1);
    	cout << "分    数:      ";
    	gotoXY(hOut, 26, 2);
    	cout << "关    卡:      ";
    	gotoXY(hOut, 26, 4);
    	cout << "下一方块:";
    	gotoXY(hOut, 26, 9);
    	cout << "操作方法:";
    	gotoXY(hOut, 30, 11);
    	cout << "↑:旋转 ↓:速降";
    	gotoXY(hOut, 30, 12);
    	cout << "→:右移 ←:左移";
    	gotoXY(hOut, 30, 13);
    	cout << "空格键:开始/暂停";
    	gotoXY(hOut, 30, 14);
    	cout << "Esc 键:退出";
    	gotoXY(hOut, 26, 16);
    	cout << "关    于:";
    	gotoXY(hOut, 30, 18);
    	cout << "俄罗斯方块V1.0";
    	gotoXY(hOut, 35, 19);
    	cout << "作者:李国良";
    }
    
    void gotoXY(HANDLE hOut, int x, int y)
    {
    	COORD pos;
    	pos.X = x;
    	pos.Y = y;
    	SetConsoleCursorPosition(hOut, pos);
    }
    
    void roundBlock(HANDLE hOut, int block[4][4])
    {
    	clearBlock(hOut, block, 5, 15);
    	switch (rand() % 19)
    	{
    	case 0:
    		for (int i = 0; i < 4; ++i)
    		{
    			for (int j = 0; j < 4; ++j)
    			{
    				block[i][j] = block00[i][j];
    			}
    		}
    		break;
    	case 1:
    		for (int i = 0; i < 4; ++i)
    		{
    			for (int j = 0; j < 4; ++j)
    			{
    				block[i][j] = block01[i][j];
    			}
    		}
    		break;
    	case 2:
    		for (int i = 0; i < 4; ++i)
    		{
    			for (int j = 0; j < 4; ++j)
    			{
    				block[i][j] = block02[i][j];
    			}
    		}
    		break;
    	case 3:
    		for (int i = 0; i < 4; ++i)
    		{
    			for (int j = 0; j < 4; ++j)
    			{
    				block[i][j] = block03[i][j];
    			}
    		}
    		break;
    	case 4:
    		for (int i = 0; i < 4; ++i)
    		{
    			for (int j = 0; j < 4; ++j)
    			{
    				block[i][j] = block04[i][j];
    			}
    		}
    		break;
    	case 5:
    		for (int i = 0; i < 4; ++i)
    		{
    			for (int j = 0; j < 4; ++j)
    			{
    				block[i][j] = block05[i][j];
    			}
    		}
    		break;
    	case 6:
    		for (int i = 0; i < 4; ++i)
    		{
    			for (int j = 0; j < 4; ++j)
    			{
    				block[i][j] = block06[i][j];
    			}
    		}
    		break;
    	case 7:
    		for (int i = 0; i < 4; ++i)
    		{
    			for (int j = 0; j < 4; ++j)
    			{
    				block[i][j] = block07[i][j];
    			}
    		}
    		break;
    	case 8:
    		for (int i = 0; i < 4; ++i)
    		{
    			for (int j = 0; j < 4; ++j)
    			{
    				block[i][j] = block08[i][j];
    			}
    		}
    		break;
    	case 9:
    		for (int i = 0; i < 4; ++i)
    		{
    			for (int j = 0; j < 4; ++j)
    			{
    				block[i][j] = block09[i][j];
    			}
    		}
    		break;
    	case 10:
    		for (int i = 0; i < 4; ++i)
    		{
    			for (int j = 0; j < 4; ++j)
    			{
    				block[i][j] = block10[i][j];
    			}
    		}
    		break;
    	case 11:
    		for (int i = 0; i < 4; ++i)
    		{
    			for (int j = 0; j < 4; ++j)
    			{
    				block[i][j] = block11[i][j];
    			}
    		}
    		break;
    	case 12:
    		for (int i = 0; i < 4; ++i)
    		{
    			for (int j = 0; j < 4; ++j)
    			{
    				block[i][j] = block12[i][j];
    			}
    		}
    		break;
    	case 13:
    		for (int i = 0; i < 4; ++i)
    		{
    			for (int j = 0; j < 4; ++j)
    			{
    				block[i][j] = block13[i][j];
    			}
    		}
    		break;
    	case 14:
    		for (int i = 0; i < 4; ++i)
    		{
    			for (int j = 0; j < 4; ++j)
    			{
    				block[i][j] = block14[i][j];
    			}
    		}
    		break;
    	case 15:
    		for (int i = 0; i < 4; ++i)
    		{
    			for (int j = 0; j < 4; ++j)
    			{
    				block[i][j] = block15[i][j];
    			}
    		}
    		break;
    	case 16:
    		for (int i = 0; i < 4; ++i)
    		{
    			for (int j = 0; j < 4; ++j)
    			{
    				block[i][j] = block16[i][j];
    			}
    		}
    		break;
    	case 17:
    		for (int i = 0; i < 4; ++i)
    		{
    			for (int j = 0; j < 4; ++j)
    			{
    				block[i][j] = block17[i][j];
    			}
    		}
    		break;
    	case 18:
    		for (int i = 0; i < 4; ++i)
    		{
    			for (int j = 0; j < 4; ++j)
    			{
    				block[i][j] = block18[i][j];
    			}
    		}
    		break;
    	default:
    		break;
    	}
    	printBlock(hOut, block, 5, 15);
    }
    
    bool collisionDetection(int block[4][4], int map[21][12], int x, int y)
    {
    	for (int i = 0; i < 4; ++i)
    	{
    		for (int j = 0; j < 4; ++j)
    		{
    			if (x + i >= 0 && y + j >= 0 && map[x + i][y + j] == 1 && block[i][j] == 1)
    			{
    				return false;
    			}
    		}
    	}
    	return true;
    }
    
    void printBlock(HANDLE hOut, int block[4][4], int x, int y)
    {
    	switch (block[0][0])
    	{
    	case 10:
    	case 11:
    		SetConsoleTextAttribute(hOut, FOREGROUND_GREEN);
    		break;
    	case 12:
    	case 13:
    	case 14:
    	case 15:
    		SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
    		break;
    	case 16:
    	case 17:
    	case 18:
    	case 19:
    		SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
    		break;
    	case 20:
    	case 21:
    	case 22:
    	case 23:
    		SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
    		break;
    	case 24:
    	case 25:
    		SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
    		break;
    	case 26:
    	case 27:
    		SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
    		break;
    	case 28:
    		SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
    		break;
    	default:
    		break;
    	}
    	for (int i = 0; i < 4; ++i)
    	{
    		if (i + x >= 0)
    		{
    			for (int j = 0; j < 4; ++j)
    			{
    				if (block[i][j] == 1)
    				{
    
    					gotoXY(hOut, 2 * (y + j), x + i);
    					cout << "■";
    				}
    			}
    		}
    	}
    }
    
    void clearBlock(HANDLE hOut, int block[4][4], int x, int y)
    {
    	for (int i = 0; i < 4; ++i)
    	{
    		if (i + x >= 0)
    		{
    			for (int j = 0; j < 4; ++j)
    			{
    				if (block[i][j] == 1)
    				{
    					gotoXY(hOut, 2 * (y + j), x + i);
    					cout << "  ";
    				}
    			}
    		}
    	}
    }
    
    void gameOver(HANDLE hOut, int block[4][4], int map[21][12])
    {
    	SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
    	gotoXY(hOut, 9, 8);
    	cout << "GAME OVER";
    	gotoXY(hOut, 8, 9);
    	cout << "空格键:重来";
    	gotoXY(hOut, 8, 10);
    	cout << "ESC键:退出";
    	char key;
    	while (true)
    	{
    		key = _getch();
    		if (key == 32)
    		{
    			return;
    		}
    		if (key == 27)
    		{
    			exit(0);
    		}
    	}
    }
    
    int myDown(HANDLE hOut, int block[4][4], int map[21][12], int &x, int y)
    {
    	if (collisionDetection(block, map, x + 1, y))
    	{
    		clearBlock(hOut, block, x, y);
    		++x;
    		return 0;
    	}
    	if (x < 0)
    	{
    		return 2;
    	}
    	for (int i = 0; i < 4; ++i)
    	{
    		for (int j = 0; j < 4; ++j)
    		{
    			if (block[i][j] == 1)
    			{
    				map[x + i][y + j] = 1;
    				SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
    				gotoXY(hOut, 2 * (y + j), x + i);
    				cout << "■";
    			}
    		}
    	}
    	return 1;
    }
    
    void myLeft(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y)
    {
    	if (collisionDetection(block, map, x, y - 1))
    	{
    		clearBlock(hOut, block, x, y);
    		--y;
    	}
    }
    
    void myRight(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y)
    {
    	if (collisionDetection(block, map, x, y + 1))
    	{
    		clearBlock(hOut, block, x, y);
    		++y;
    	}
    }
    
    void myUp(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y)
    {
    	switch (block[0][0])
    	{
    	case 10:
    		if (collisionDetection(block01, map, x, y))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block01[i][j];
    				}
    			}
    		}
    		break;
    	case 11:
    		if (collisionDetection(block00, map, x, y))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block00[i][j];
    				}
    			}
    		}
    		else if (collisionDetection(block00, map, x, y - 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block00[i][j];
    				}
    			}
    			--y;
    		}
    		else if (collisionDetection(block00, map, x, y + 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block00[i][j];
    				}
    			}
    			++y;
    		}
    		else if (collisionDetection(block00, map, x, y - 2))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block00[i][j];
    				}
    			}
    			y = y - 2;
    		}
    		else if (collisionDetection(block00, map, x, y + 2))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block00[i][j];
    				}
    			}
    			y = y + 2;
    		}
    		break;
    	case 12:
    		if (collisionDetection(block03, map, x, y))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block03[i][j];
    				}
    			}
    		}
    		else if (collisionDetection(block03, map, x, y - 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block03[i][j];
    				}
    			}
    			--y;
    		}
    		else if (collisionDetection(block03, map, x, y + 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block03[i][j];
    				}
    			}
    			++y;
    		}
    		break;
    	case 13:
    		if (collisionDetection(block04, map, x, y))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block04[i][j];
    				}
    			}
    		}
    		else if (collisionDetection(block04, map, x, y - 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block04[i][j];
    				}
    			}
    			--y;
    		}
    		else if (collisionDetection(block04, map, x, y + 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block04[i][j];
    				}
    			}
    			++y;
    		}
    		break;
    	case 14:
    		if (collisionDetection(block05, map, x, y))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block05[i][j];
    				}
    			}
    		}
    		else if (collisionDetection(block05, map, x, y - 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block05[i][j];
    				}
    			}
    			--y;
    		}
    		else if (collisionDetection(block05, map, x, y + 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block05[i][j];
    				}
    			}
    			++y;
    		}
    		break;
    	case 15:
    		if (collisionDetection(block02, map, x, y))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block02[i][j];
    				}
    			}
    		}
    		else if (collisionDetection(block02, map, x, y - 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block02[i][j];
    				}
    			}
    			--y;
    		}
    		else if (collisionDetection(block02, map, x, y + 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block02[i][j];
    				}
    			}
    			++y;
    		}
    		break;
    
    	case 16:
    		if (collisionDetection(block07, map, x, y))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block07[i][j];
    				}
    			}
    		}
    		else if (collisionDetection(block07, map, x, y - 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block07[i][j];
    				}
    			}
    			--y;
    		}
    		else if (collisionDetection(block07, map, x, y + 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block07[i][j];
    				}
    			}
    			++y;
    		}
    		break;
    	case 17:
    		if (collisionDetection(block08, map, x, y))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block08[i][j];
    				}
    			}
    		}
    		else if (collisionDetection(block08, map, x, y - 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block08[i][j];
    				}
    			}
    			--y;
    		}
    		else if (collisionDetection(block08, map, x, y + 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block08[i][j];
    				}
    			}
    			++y;
    		}
    		break;
    	case 18:
    		if (collisionDetection(block09, map, x, y))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block09[i][j];
    				}
    			}
    		}
    		else if (collisionDetection(block09, map, x, y - 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block09[i][j];
    				}
    			}
    			--y;
    		}
    		else if (collisionDetection(block09, map, x, y + 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block09[i][j];
    				}
    			}
    			++y;
    		}
    		break;
    	case 19:
    		if (collisionDetection(block06, map, x, y))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block06[i][j];
    				}
    			}
    		}
    		else if (collisionDetection(block06, map, x, y - 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block06[i][j];
    				}
    			}
    			--y;
    		}
    		else if (collisionDetection(block06, map, x, y + 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block06[i][j];
    				}
    			}
    			++y;
    		}
    		break;
    	case 20:
    		if (collisionDetection(block11, map, x, y))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block11[i][j];
    				}
    			}
    		}
    		else if (collisionDetection(block11, map, x, y - 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block11[i][j];
    				}
    			}
    			--y;
    		}
    		else if (collisionDetection(block11, map, x, y + 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block11[i][j];
    				}
    			}
    			++y;
    		}
    		break;
    	case 21:
    		if (collisionDetection(block12, map, x, y))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block12[i][j];
    				}
    			}
    		}
    		else if (collisionDetection(block12, map, x, y - 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block12[i][j];
    				}
    			}
    			--y;
    		}
    		else if (collisionDetection(block12, map, x, y + 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block12[i][j];
    				}
    			}
    			++y;
    		}
    		break;
    	case 22:
    		if (collisionDetection(block13, map, x, y))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block13[i][j];
    				}
    			}
    		}
    		else if (collisionDetection(block13, map, x, y - 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block13[i][j];
    				}
    			}
    			--y;
    		}
    		else if (collisionDetection(block13, map, x, y + 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block13[i][j];
    				}
    			}
    			++y;
    		}
    		break;
    	case 23:
    		if (collisionDetection(block10, map, x, y))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block10[i][j];
    				}
    			}
    		}
    		else if (collisionDetection(block10, map, x, y - 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block10[i][j];
    				}
    			}
    			--y;
    		}
    		else if (collisionDetection(block10, map, x, y + 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block10[i][j];
    				}
    			}
    			++y;
    		}
    		break;
    	case 24:
    		if (collisionDetection(block15, map, x, y))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block15[i][j];
    				}
    			}
    		}
    		else if (collisionDetection(block15, map, x, y - 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block15[i][j];
    				}
    			}
    			--y;
    		}
    		else if (collisionDetection(block15, map, x, y + 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block15[i][j];
    				}
    			}
    			++y;
    		}
    		break;
    	case 25:
    		if (collisionDetection(block14, map, x, y))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block14[i][j];
    				}
    			}
    		}
    		else if (collisionDetection(block14, map, x, y - 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block14[i][j];
    				}
    			}
    			--y;
    		}
    		else if (collisionDetection(block14, map, x, y + 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block14[i][j];
    				}
    			}
    			++y;
    		}
    		break;
    	case 26:
    		if (collisionDetection(block17, map, x, y))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block17[i][j];
    				}
    			}
    		}
    		else if (collisionDetection(block17, map, x, y - 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block17[i][j];
    				}
    			}
    			--y;
    		}
    		else if (collisionDetection(block17, map, x, y + 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block17[i][j];
    				}
    			}
    			++y;
    		}
    		break;
    	case 27:
    		if (collisionDetection(block16, map, x, y))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block16[i][j];
    				}
    			}
    		}
    		else if (collisionDetection(block16, map, x, y - 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block16[i][j];
    				}
    			}
    			--y;
    		}
    		else if (collisionDetection(block16, map, x, y + 1))
    		{
    			clearBlock(hOut, block, x, y);
    			for (int i = 0; i < 4; ++i)
    			{
    				for (int j = 0; j < 4; ++j)
    				{
    					block[i][j] = block16[i][j];
    				}
    			}
    			++y;
    		}
    		break;
    	default:
    		break;
    	}
    }
    
    void myStop(HANDLE hOut, int block[4][4])
    {
    	clearBlock(hOut, block, 5, 15);
    	SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
    	gotoXY(hOut, 30, 7);
    	cout << "游戏暂停";
    	char key;
    	while (true)
    	{
    		key = _getch();
    		if (key == 32)
    		{
    			gotoXY(hOut, 30, 7);
    			cout << "        ";
    			printBlock(hOut, block, 5, 15);
    			return;
    		}
    		if (key == 27)
    		{
    			exit(0);
    		}
    	}
    }
    
    void eliminateRow(HANDLE hOut, int map[21][12], int &val, int &fraction, int &checkpoint)
    {
    	SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
    	for (int i = 19; i >= 0; --i)
    	{
    		int x = 0;
    		for (int j = 1; j < 11; ++j)
    		{
    			x += map[i][j];
    		}
    		if (x == 10)
    		{
    			fraction += 100;
    			if (val > 1 && fraction / 1000 + 1 != checkpoint)
    			{
    				checkpoint = fraction / 1000 + 1;
    				val -= 5;
    			}
    			for (int m = i; m > 0; --m)
    			{
    				for (int n = 1; n < 11; ++n)
    				{
    					map[m][n] = map[m - 1][n];
    					gotoXY(hOut, 2 * n, m);
    					if (map[m][n] == 1)
    					{
    						cout << "■";
    					}
    					else
    					{
    						cout << "  ";
    					}
    				}
    			}
    			++i;
    		}
    	}
    	gotoXY(hOut, 36, 1);
    	cout << fraction;
    	gotoXY(hOut, 36, 2);
    	cout << checkpoint;
    }
    
  • 相关阅读:
    Windows Console 程序中定时器的使用
    AT91SAM7SE应用 IRQ
    AT91SAM7SE应用 PIT 周期中断(1ms)
    AT91SAM7SE应用 UART
    Modelsim图像处理算法的仿真——图像数据操作
    按照一定的间隔,从视频中截图并保存(OpenCV)
    MacBook Pro下关闭全局网络代理
    jmeter的HTTP取样器设置重连的次数
    【C#】比较 Random 与 RandomNumberGenerator 生成随机字符串
    KendoGrid基础
  • 原文地址:https://www.cnblogs.com/yonggandefeng/p/6322561.html
Copyright © 2011-2022 走看看