#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;
}
游戏 2048
于 2024-05-18 14:04:22 首次发布