游戏 2048

#include<windows.h>
#include <iostream>
#include <time.h>
#include<conio.h>

using namespace std;
 
int a[5][5];//棋盘 
char b;//移动 
int maxs; //记录最大值 
 
int bb[5];
bool xx; // 有无产生移动 
 
bool pd; 
int aa[5],aaa;//辅助移动 
 
bool s; // 输入是否正确 
 
bool ap(); // 游戏是否结束 
 
int qqq[17][3],su,whp;//随机生成2或4 
 
void  move(char a);
void left();
void right();
void sit();
void stand();//移动函数 
 
void print1();
void print0(int i,int j);//输出函数 
 
void found();//生成函数 

void color( int a) {
	if (a == 1)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 6);
	if (a == 2)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 3);
    if (a == 11)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 1);
    if (a == 12)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 2);
    if (a == 13)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 3);
    if (a == 14)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 4);
	if (a == 15)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 5);
	if (a == 16)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 6);
	if (a == 17)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
	if (a == 18)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 8);
	if (a == 19)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 9);
	if (a == 20)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 10);
	if (a == 21)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),224);
	if (a == 22)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 228);
}
char c; 
int main()
{
    system("title 2048");
	system("mode con cols=30 lines=15");
	HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
	DWORD mode;
	GetConsoleMode(hStdin, &mode);
	mode &= ~ENABLE_QUICK_EDIT_MODE;
	mode &= ~ENABLE_INSERT_MODE;
	mode &= ~ENABLE_MOUSE_INPUT;
	SetConsoleMode(hStdin, mode);
	CONSOLE_CURSOR_INFO cur = {1, 0};
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cur);
asddsf:	
    c='A';
	while(c!=' '){
		system("cls");
		color(1);
		printf("\n\n         游戏 2048\n  a s d w 控制 左 下 右 上\n       空格键开始游戏"); 
        c=_getch();
	} 
	found();
	do
	{
		print1();
		b='q';
		while(b!='a'&&b!='s'&&b!='d'&&b!='w')
		    b=_getch();
		move(b);
		if(xx==1)
	        found();
	    else if(xx==0) s=1;
	}while(ap()!=0);
    print1();
	color(1);
	cout<<"        GAME OVER"<<"\n"<<"        MAX is "<<maxs;
    Sleep(1500);
    goto asddsf;
    return 0;
}
 
void move(char a)
{
	switch(a)
	{
		case 'a':  left();break;
		case 's':  sit();break;
		case 'd':  right();break;
		case 'w':  stand();break;
		default:s=1;
	};
}
 
void left()
{
	xx=0;
	for(int i=1;i<=4;i++)
	{
		memset(aa,0,sizeof(aa));
		aaa=0;pd=0;
		memset(bb,0,sizeof(bb));
		for(int j=1;j<=4;j++)
		{
			bb[j]=a[i][j];
			if(a[i][j]!=0&&(a[i][j]!=aa[aaa]||pd==1))
			{
			   aa[++aaa]=a[i][j];
			   pd=0;
			}
			else if(a[i][j]==aa[aaa]&&pd==0&&a[i][j]!=0)
			{
				aa[aaa]+=a[i][j];
				pd=1;xx=1;
			}
			
		}
		for(int w=1;w<=4;w++)
			a[i][w]=0;
		for(int w=1;w<=aaa;w++)
			a[i][w]=aa[w];
		for(int w=1;w<=4;w++)
			if(bb[w]!=a[i][w]) 
			  xx=1;
		
	}
	return;
}
void right()
{
	xx=0;
		for(int i=1;i<=4;i++)
		{
			memset(aa,0,sizeof(aa));
			aaa=5;pd=0;
			memset(bb,0,sizeof(bb));
			for(int j=4;j>=1;j--)
			{
				bb[j]=a[i][j];
				if(a[i][j]!=0&&(a[i][j]!=aa[aaa]||pd==1))
				{
				   aa[--aaa]=a[i][j];
				   pd=0;
				}
				else if(a[i][j]==aa[aaa]&&pd==0&&a[i][j]!=0)
				{
					aa[aaa]+=a[i][j];
					pd=1;xx=1;
				}
				
			}
			for(int w=1;w<=4;w++)
				a[i][w]=0;
			for(int w=4;w>=aaa;w--)
				a[i][w]=aa[w];
			for(int w=1;w<=4;w++)
				if(bb[w]!=a[i][w]) 
				  xx=1;
			
		}
		return;
}
void stand()
{
	xx=0;
	for(int j=1;j<=4;j++)
	{
		memset(aa,0,sizeof(aa));
		aaa=0;pd=0;
		memset(bb,0,sizeof(bb));
		for(int i=1;i<=4;i++)
		{
			bb[i]=a[i][j];
			if(a[i][j]!=0&&(a[i][j]!=aa[aaa]||pd==1))
			{
			   aa[++aaa]=a[i][j];
			   pd=0;
			}
			else if(a[i][j]==aa[aaa]&&pd==0&&a[i][j]!=0)
			{
				aa[aaa]+=a[i][j];
				pd=1;xx=1;
			}
		}
		for(int w=1;w<=4;w++)
			a[w][j]=0;
    	for(int w=1;w<=aaa;w++)
			a[w][j]=aa[w];
		for(int w=1;w<=4;w++)
			if(bb[w]!=a[w][j]) xx=1;
	}
	return;	
}
void sit()
{
	xx=0;
		for(int j=1;j<=4;j++)
		{
			memset(aa,0,sizeof(aa));
			aaa=5;pd=0;
			memset(bb,0,sizeof(bb));
			for(int i=4;i>=1;i--)
			{
				bb[i]=a[i][j];
				if(a[i][j]!=0&&(a[i][j]!=aa[aaa]||pd==1))
				{
				   aa[--aaa]=a[i][j];
				   pd=0;
				}
				else if(a[i][j]==aa[aaa]&&pd==0&&a[i][j]!=0)
				{
					aa[aaa]+=a[i][j];
					pd=1;xx=1;
				}
			}
			for(int w=1;w<=4;w++)
				a[w][j]=0;
	    	for(int w=4;w>=aaa;w--)
				a[w][j]=aa[w];
			for(int w=1;w<=4;w++)
				if(bb[w]!=a[w][j]) xx=1;
		}
		return;	
}
 
void print1()
{
	system("cls");
	color(2);
	cout<<"\n";
	int f,ji=0;
	for(int i=1;i<=4;i++)
	{
	    cout<<"\n ";
	    for(int j=1;j<=4;j++)
	    {
	  	    f=a[i][j];ji=0;
	  	    if(f!=0)
			{
				while(f!=1) f=f/2,ji++;
			    color(ji+10);
			} 
			else{
				color(2);
			}
			print0(i,j);cout<<" ";
	        maxs=max(maxs,a[i][j]);
	    }
	    cout<<"\n";
	}    
	return;
}
void print0(int i,int j)
{
	if(a[i][j]==0) printf("  .   ");
	else if(a[i][j]>0&&a[i][j]<=9) printf("  %d   ",a[i][j]);
	else if(a[i][j]<=99)  printf(" %d   ",a[i][j]);
	else if(a[i][j]<=999)  printf(" %d  ",a[i][j]);
	else if(a[i][j]<=9999) printf(" %d ",a[i][j]);
	return;
}
 
void found()
{
	su=0;memset(qqq,0,sizeof(qqq));
	for(int i=1;i<=4;i++)
	{
		for(int w=1;w<=4;w++)
		  if(a[i][w]==0)
	      {
	    	qqq[++su][1]=a[i][w];
	    	qqq[su][2]=i;
	    	qqq[su][3]=w;
	      }
	}
	if(su==0) 
	  return;
    srand(time(0));
	whp=rand()%su+1;
	a[qqq[whp][2]][qqq[whp][3]]=(rand()%2+1)*2;
	return;
}
bool ap()
{
	for(int i=1;i<=4;i++)
	{
		for(int j=1;j<=3;j++)
		 if(a[i][j]==a[i][j+1]||a[i][j]==0||a[i][j+1]==0) 
		  return 1;
	}
	for(int j=1;j<=4;j++)
    {
		for(int i=1;i<=3;i++)
		if(a[i][j]==a[i+1][j]||a[i][j]==0||a[i+1][j]==0) 
		  return 1;
	}
	return 0;
	
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值