俄罗斯方块

 

简介

高一时写的、继推箱子之后的第二个C++小游戏

代码

#include <iostream>
#include <sstream>
#include <fstream>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <windows.h>
#define TIMEUSUALLY500 100
using namespace std;
string o(int i)
{
	switch (i)
	{
	case 0:return "  ";
	case 1:return "▇";
	case 2:return "□";
	}
}
char f(int i)
{
	switch (i)
	{
	case 0:return '0';
	case 1:return '1';
	case 2:return '2';
	case 3:return '3';
	case 4:return '4';
	case 5:return '5';
	case -1:return ' ';
	case 20:return 'n';
	case 21:return 'y';
	}
}
void drawmap(int H, int L, int x, int y, int maptest[][100], int mapobj[][6])
{
	stringstream ss;
	for (int i = 0; i <= H + 1; i++)
	{
		for (int j = 0; j <= L + 1; j++)
		{
			if (i - x <= 4 && i - x >= 1 && j - y >= 1 && j - y <= 4)
			{
				if (mapobj[i - x][j - y] == 2)
					ss << o(2);
				else
					ss << o(maptest[i][j]);
			}
			else
			{
				ss << o(maptest[i][j]);
			}
		}
		ss << endl;
	}
	string out = ss.str();
	system("cls");				//删去此行可以防画面抖动
	cout << out;
}
void drawobj(int mapobj[][6])
{
	for (int i = 0; i <= 5; i++)
	{
		for (int j = 0; j <= 5; j++)
		{
			//cout<<o(mapobj[i][j]);
			cout << f(mapobj[i][j]);
		}
		cout << endl;
	}
}
void objfootfind(int mapobj[][6])
{
	for (int j = 1; j <= 4; j++)
	{
		mapobj[5][j] = -1;
		for (int i = 4; i >= 1; i--)
		{
			if (mapobj[i][j] == 2)
			{
				mapobj[5][j] = i + 1;
				break;
			}
		}
	}
	for (int j = 1; j <= 4; j++)
	{
		mapobj[0][j] = -1;
		for (int i = 1; i <= 4; i++)
		{
			if (mapobj[i][j] == 2)
			{
				mapobj[0][j] = i - 1;
				break;
			}
		}
	}
	for (int i = 1; i <= 4; i++)
	{
		mapobj[i][0] = -1;
		for (int j = 1; j <= 4; j++)
		{
			if (mapobj[i][j] == 2)
			{
				mapobj[i][0] = j - 1;
				break;
			}
		}
	}
	for (int i = 1; i <= 4; i++)
	{
		mapobj[i][5] = -1;
		for (int j = 4; j >= 1; j--)
		{
			if (mapobj[i][j] == 2)
			{
				mapobj[i][5] = j + 1;
				break;
			}
		}
	}
}
void objchange(int mapobj[][6])
{
	srand((int)time(0));
	int type = rand() % 7 + 1;
	for (int i = 0; i <= 5; i++)
	{
		for (int j = 0; j <= 5; j++)
		{
			mapobj[i][j] = 0;
		}
	}
//	cout << type << endl;
	int freedom = 0;
	switch (type)
	{
	case 1:mapobj[1][3] = 2, mapobj[2][3] = 2, mapobj[3][3] = 2, mapobj[4][3] = 2, freedom = 20; break;
	case 2:mapobj[2][2] = 2, mapobj[2][3] = 2, mapobj[3][2] = 2, mapobj[3][3] = 2, freedom = 1; break;
	case 3:mapobj[2][2] = 2, mapobj[3][2] = 2, mapobj[3][3] = 2, mapobj[3][4] = 2, freedom = 4; break;
	case 4:mapobj[3][1] = 2, mapobj[3][2] = 2, mapobj[3][3] = 2, mapobj[2][3] = 2, freedom = 4; break;
	case 5:mapobj[3][2] = 2, mapobj[3][3] = 2, mapobj[2][3] = 2, mapobj[2][4] = 2, freedom = 20; break;
	case 6:mapobj[2][2] = 2, mapobj[2][3] = 2, mapobj[3][3] = 2, mapobj[3][4] = 2, freedom = 20; break;
	case 7:mapobj[3][2] = 2, mapobj[3][3] = 2, mapobj[3][4] = 2, mapobj[2][3] = 2, freedom = 4; break;
	}
	mapobj[0][0] = freedom;
	mapobj[0][5] = freedom;
	mapobj[5][0] = freedom;
	mapobj[5][5] = freedom;
	objfootfind(mapobj);
}
void objtwist(int mapobj[][6], int mapobj2[][6])
{
	int freedom = mapobj[0][0];
	int time = 0;
	if (freedom == 1);
	else if (freedom / 10 == 2)
	{
		if (freedom % 10 == 1)
		{
			time = 3;
			freedom = 20;
		}
		else if (freedom % 10 == 0)
		{
			time = 1;
			freedom = 21;
		}
	}
	else if (freedom == 4)
	{
		time = 1;
	}
	int mapobj3[6][6];
	for (int i = 1; i <= 4; i++)
	{
		for (int j = 1; j <= 4; j++)
		{
			mapobj3[i][j] = mapobj[i][j];
			mapobj2[i][j] = mapobj[i][j];
		}
	}
	for (; time >= 1; time--)
	{
		for (int i = 1; i <= 4; i++)
		{
			for (int j = 1; j <= 4; j++)
			{
				mapobj2[5 - j][i] = mapobj3[i][j];
			}
		}
		for (int i = 1; i <= 4; i++)
		{
			for (int j = 1; j <= 4; j++)
			{
				mapobj3[i][j] = mapobj2[i][j];
			}
		}
	}
	mapobj2[0][0] = freedom;
	mapobj2[0][5] = freedom;
	mapobj2[5][0] = freedom;
	mapobj2[5][5] = freedom;
	objfootfind(mapobj2);
}
void objmove(char dir, int& x, int& y, int mapobj[][6], int maptest[][100])
{
	if (dir == 'a')
	{
		bool mov = 1;
		for (int i = 1; i <= 4; i++)
		{
			if (mapobj[i][0] != -1)
			{
				if (maptest[i + x][mapobj[i][0] + y] != 2 && maptest[i + x][mapobj[i][0] + y] != 1)
				{
					mov = 1;
				}
				else
				{
					mov = 0;
					break;
				}
			}
		}
		if (mov == 1)
		{
			y--;
		}
	}
	if (dir == 'd')
	{
		bool mov = 1;
		for (int i = 1; i <= 4; i++)
		{
			if (mapobj[i][5] != -1)
			{
				if (maptest[i + x][mapobj[i][5] + y] != 2 && maptest[i + x][mapobj[i][5] + y] != 1)
				{
					mov = 1;
				}
				else
				{
					mov = 0;
					break;
				}
			}
		}
		if (mov == 1)
		{
			y++;
		}
	}
	if (dir == 'w')
	{
		int mapobj2[6][6];
		objtwist(mapobj, mapobj2);
		bool mov = 1;
		for (int i = 1; i <= 4; i++)
		{
			for (int j = 1; j <= 4; j++)
			{
				if (mapobj2[i][j] == 2)
				{
					if (maptest[x + i][y + j] == 2 || maptest[x + i][y + j] == 1)
					{
						mov = 0;
						break;
					}
				}
			}
			if (mov == 0)
				break;
		}
		if (mov == 1)
		{
			for (int i = 0; i <= 5; i++)
			{
				for (int j = 0; j <= 5; j++)
				{
					mapobj[i][j] = mapobj2[i][j];
				}
			}
		}
	}
}
void dirread(int& x, int& y, int mapobj[][6], int maptest[][100])
{
	int t1 = clock();
	int t2 = clock();
	while (t2 - t1 <= TIMEUSUALLY500 && x >= 1)
	{
		if (_kbhit() != 0)
		{
			char dir = _getch();
			objmove(dir, x, y, mapobj, maptest);
		}
		t2 = clock();
	}
}
int objdown(int& x, int& y, int mapobj[][6], int maptest[][100])
{
	bool down = 1;
	if (x >= 0)
	{
		for (int i = 1; i <= 4; i++)
		{
			if (mapobj[5][i] != -1)
			{
				if (maptest[mapobj[5][i] + x][i + y] != 2 && maptest[mapobj[5][i] + x][i + y] != 1)
				{
					down = 1;
				}
				else
				{
					down = 0;
					break;
				}
			}
		}
	}
	if (down == 1)
	{
		x++;
		return 1;
	}
	else
	{
		return 0;
	}
}
bool mapnext(int H, int L, int& x, int& y, int next, int maptest[][100], int mapobj[][6])
{
	if (next == 0)
	{
		for (int i = 1; i <= 4; i++)
		{
			for (int j = 1; j <= 4; j++)
			{
				if (mapobj[i][j] == 2)
				{
					maptest[x + i][y + j] = mapobj[i][j];
				}

			}
		}
		x = 0;
		y = L / 2 - 2;
//		cout << x << " " << y << endl;
		objchange(mapobj);
		for (int i0 = H; i0 >= 1; i0--)
		{
			int eat;
			for (int j = 1; j <= L; j++)
			{
				if (maptest[i0][j] == 2)
				{
					eat = i0;
				}
				else
				{
					eat = 0;
					break;
				}
			}
			if (eat > 0)
			{
				for (int i = eat; i > 1; i--)
				{
					for (int j = 1; j <= L; j++)
					{
						maptest[i][j] = maptest[i - 1][j];
					}
				}
				i0 = i0 + 1;
			}
		}
		bool mov = 1;
		for (int i = 1; i <= 4; i++)
		{
			for (int j = 1; j <= 4; j++)
			{
				if (mapobj[i][j] == 2)
				{
					if (maptest[x + i][y + j] == 2 || maptest[x + i][y + j] == 1)
					{
						mov = 0;
						break;
					}
				}
			}
			if (mov == 0)
				break;
		}
		if (mov == 0)
			return 1;
	}
	return 0;
}
void gamemain()
{
	int maptest[100][100];
	int H = 30, L = 10;
	int mapobj[6][6];
	int x = 0, y = L / 2 - 2;
	{//maptest初始程序
		for (int i = 0; i <= H + 1; i++)
		{
			for (int j = 0; j <= L + 1; j++)
			{
				maptest[i][j] = 0;
			}
		}
		for (int i = 0; i <= L + 1; i++)
		{
			maptest[0][i] = 1;
			maptest[H + 1][i] = 1;
		}
		for (int j = 0; j <= H + 1; j++)
		{
			maptest[j][0] = 1;
			maptest[j][L + 1] = 1;
		}
		drawmap(H, L, x, y, maptest, mapobj);
	}
	objchange(mapobj);
	for (;;)
	{//出物块
		int next = objdown(x, y, mapobj, maptest);
		int die=mapnext(H, L, x, y, next, maptest, mapobj);
		if (die == 1)
			return;
		drawmap(H, L, x, y, maptest, mapobj);
		dirread(x, y, mapobj, maptest);
	}
}
void findwrong()
{
	for (;;)
	{
		int mapobj[6][6];
		objchange(mapobj);
		drawobj(mapobj);
		cout << endl;
		int mapobj2[6][6];
		objtwist(mapobj, mapobj2);
		drawobj(mapobj2);
		cout << endl;
		int mapobj3[6][6];
		objtwist(mapobj2, mapobj3);
		drawobj(mapobj3);
		cout << endl;
		Sleep(20000);
	}
}
int main()
{
	gamemain();
	//findwrong();
	cout << endl << "You died." << endl;
	return 0;
}

图片

Tetris

>