سلام.
اينو چند روز پيش نوشتم. گفتم بزارم بقيه هم استفاده کنند. کار نسبتا ساده اي بود البته اين الان بازنده رو تشخيص نميده :smile:
اونو ديگه خودتون اضافه کنيد و اگه خواستيد تو همين تاپيک بزاريد.

البته يه سري مشکلات جزعي هست که ميشد رفعش کرد ولي کد رو از سادگي در مي اورد. مثلا الان پاک کردن صفحه يه کمي کند هست و پرش معلومه. دستورات خاص خودش بود ولي يکم کارو پيچيده ميکرد.

با کليد ها WASD کار ميکنه :redface:


اگه خوشتون اومد صلواتي براي تعجيل در فرج آقا صاحب الزمان بفرستيد :smile:

استفاده به عنوان پروژه دانشگاه و .... اکيدا ممنوع مگر اينکه خودتون يادش بگيريد و دوباره بنويسيد. در غير اينصورت بنده هيچگونه رضايتي ندارم.

کد:
#include <iostream>
#include <conio.h>
#include <time.h>
#define D_KEY 'D'
#define W_KEY 'W'
#define S_KEY 'S'
#define A_KEY 'A'

#define _0_KEY '0'

#define EMPTY_TILE -1

using namespace std;

void WaitForLastKey();
void Init();
void DrawTable();
void Step();
void MoveUp();
void MoveRight();
void MoveDown();
void MoveLeft();
void CreateRandomTile(bool shouldBeEmpty);
void SetFakseAllMergedTile();
char lastKey;
int tiles[4][4];
int tileLengths[4][4];
bool mergedTiles[4] = {false, false, false, false};
bool moved = false;
int main(int argv, char* args[])
{
	Init();

	DrawTable();
	

	while(lastKey != _0_KEY)
	{
		WaitForLastKey();
		Step();
		DrawTable();
	}
}

void WaitForLastKey()
{
	char key = 0;
	while( (key != W_KEY) &&
		  (key != D_KEY) &&
		  (key != S_KEY) &&
		  (key != A_KEY) &&
		  (key != _0_KEY))
	{
		key = _getch();
		key = toupper(key);
	}
	lastKey = key;

}

void Init()
{
	for(int i=0; i<4; i++)
		for(int j=0; j<4; j++)
			tiles[i][j]=EMPTY_TILE;
	srand(time(NULL));
	CreateRandomTile(false);
	CreateRandomTile(false);

}

void CreateRandomTile(bool shouldBeEmpty)
{
	int x = 0;
	int y = 0;
	int number = 2;
	int numberSelector = 0;
	do
	{
		x = rand()%4;
		y = rand()%4;
	}while((shouldBeEmpty == false ? false : tiles[x][y] != EMPTY_TILE));
	numberSelector = rand()%4;
	if(numberSelector < 3)
		number = 2;
	else
		number = 4;
	tiles[x][y] = number;
	 
}

void DrawTable()
{
	for(int i=0; i<4; i++)
	{
		for(int j=0; j<4; j++)
		{
			if(tiles[i][j] < 1)
				tileLengths[i][j] = 0;
			else if(tiles[i][j] < 10)
				tileLengths[i][j] = 1;
			else if(tiles[i][j] < 100)
				tileLengths[i][j] = 2;
			else if(tiles[i][j] < 1000)
				tileLengths[i][j] = 3;
			else if(tiles[i][j] < 10000)
				tileLengths[i][j] = 4;
			else if(tiles[i][j] < 100000)
				tileLengths[i][j] = 5;
			else if(tiles[i][j] < 1000000)
				tileLengths[i][j] = 6;

		}
	}
	system("cls");
	cout <<"|------|------|------|------|\n";
	for(int j=0; j<4; j++)
	{
		cout<<"|   |   |   |   |\n"<<"|";
		for(int i=0; i<4; i++)
		{
			
			if(tiles[i][j] != EMPTY_TILE)
			{
				cout << tiles[i][j];
			}
			for(int _i=0; _i<6-tileLengths[i][j]; _i++)
				cout<<" ";
			cout<<"|";
		}
		cout <<"\n|   |   |   |   |\n|------|------|------|------|\n";
	}	
}

void Step()
{
	if(lastKey == W_KEY)
	{
		MoveUp();
	}
	else if(lastKey == D_KEY)
	{
		MoveRight();
	}
	else if(lastKey == S_KEY)
	{
		MoveDown();
	}
	else if(lastKey == A_KEY)
	{
		MoveLeft();
	}
	if(moved)
	{
		CreateRandomTile(true);
		SetFakseAllMergedTile();
		moved = false;
	}
}

void MoveUp()
{

	for(int i=0; i<4; i++)
	{
		for(int j=0; j<4; j++)
		{
			for(int _j=0; _j<j; _j++)
			{
				for(int __j=0; __j<j; __j++)
				{
					if(__j<3)
					{
						if(tiles[i][__j] == EMPTY_TILE)
						{
							tiles[i][__j] = tiles[i][__j+1]; 
							tiles[i][__j+1] = EMPTY_TILE;
							moved=true;
						}
						else if((tiles[i][__j] == tiles[i][__j+1]) && !mergedTiles[__j+1])
						{	
							tiles[i][__j] *= 2;
							tiles[i][__j+1] = EMPTY_TILE;
							mergedTiles[__j] = true;
							moved=true;
						}
					}
				}
			}
		}
	}
}
void MoveRight()
{
	for(int j=0; j<4; j++)
	{
		for(int i=3; i>0; i--)
		{
			for(int _i=i; _i>0; _i--)
			{
				for(int __i=i; __i>0; __i--)
				{
					if(__i>0)
					{
						if(tiles[__i][j] == EMPTY_TILE)
						{
							tiles[__i][j] = tiles[__i-1][j]; 
							tiles[__i-1][j] = EMPTY_TILE;
							moved=true;
						}
						else if((tiles[__i][j] == tiles[__i-1][j]) && !mergedTiles[__i-1])
						{
							tiles[__i][j] *= 2;
							tiles[__i-1][j] = EMPTY_TILE;
							mergedTiles[__i] = true;
							moved=true;
						}
						
					}
				}
			}
		}
	}
}
void MoveDown()
{
	for(int i=0; i<4; i++)
	{
		for(int j=3; j>0; j--)
		{
			for(int _j=j; _j>0; _j--)
			{
				for(int __j=j; __j>0; __j--)
				{
					if(__j>0)
					{
						if(tiles[i][__j] == EMPTY_TILE)
						{
							tiles[i][__j] = tiles[i][__j-1]; 
							tiles[i][__j-1] = EMPTY_TILE;
							moved=true;
						}
						else if((tiles[i][__j] == tiles[i][__j-1]) && !mergedTiles[__j-1])
						{
							tiles[i][__j] *= 2;
							tiles[i][__j-1] = EMPTY_TILE;
							mergedTiles[__j] = true;
							moved=true;
						}
						
					}
				}
			}
		}
	}
}
void MoveLeft()
{
	for(int j=0; j<4; j++)
	{
		for(int i=0; i<4; i++)
		{
			for(int _i=0; _i<i; _i++)
			for(int __i=0; __i<i; __i++)
			{
				if(__i<3)
				{
					if(tiles[__i][j] == EMPTY_TILE)
					{
						tiles[__i][j] = tiles[__i+1][j]; 
						tiles[__i+1][j] = EMPTY_TILE;
						moved=true;
					}
					else if((tiles[__i][j] == tiles[__i+1][j]) && !mergedTiles[__i+1])
					{
						tiles[__i][j] *= 2;
						tiles[__i+1][j] = EMPTY_TILE;
						mergedTiles[__i] = true;
						moved=true;
					}
						
				}
			}
		}
	}
}

void SetFakseAllMergedTile()
{
	for(int i=0; i<4; i++)
	{
		mergedTiles[i] = false;
	}
}