2048的人生历程
2025.3.25 【修改第1次】
2025.3.29 【修改第2次】
2025.3.29 【修改第3次】
//一个类似消消乐的小游戏,通过2,4,6,8来控制上下左右滑动,相同的数字可以相加变为新的数字,并获得相应分数
//到无法再移动消除数字时游戏结束
//7 8 9
//4 5 6
//1 2 3
//8为上移,2为下移,4为左移,6为右移。
#include<bits/stdc++.h>
#define xx x&-x
using namespace std;
void print(int x){
if(x<0)putchar('-'),x=-x;
if(x<10){putchar(x+'0');return;}
print(x/10);
putchar(x%10+'0');
}
const int N=1e6+5;
const int M=1e3+5;
int n,m,k;
int T;
int f[N];
int a[N];
int c[M][M];
// 0 1 2 3 4 5 6
int p[N]={2,4,8,16,32,64,128};
int ans;
int cnt=3;
void init(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(c[i][j]==0){
c[i][j]=p[rand()%cnt];//随机给定一个数
return;
}
}
}
}
bool check(){//判断游戏是否结束
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(!c[i][j])return 1;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(c[i][j]==c[i-1][j]||c[i][j]==c[i+1][j]||c[i][j]==c[i][j-1]||c[i][j]==c[i][j+1])return 1;
}
}
return 0;
}
void checks(){
int mx=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
mx=max(mx,c[i][j]);
}
}
if(mx==256)cnt=4;
if(mx==512)cnt=5;
if(mx==1024)cnt=6;
}
signed main(){
srand(time(0));
n=4;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
c[i][j]=0;
}
}
int ppp=1;
while(1){
system("cls");
cout<<"Score:"<<ans<<'\n';
if(ppp)init();
else ppp=1;
if(!check())break;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(c[i][j]/100000==0)cout<<' ';
if(c[i][j]/10000==0)cout<<' ';
if(c[i][j]/1000==0)cout<<' ';
if(c[i][j]/100==0)cout<<' ';
if(c[i][j]/10==0)cout<<' ';
if(c[i][j])cout<<c[i][j];
else cout<<'.';
}
cout<<'\n';
}
char op;
cin>>op;
int flag=0;
if(op=='8'||op=='w'){//上移
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
int p=c[i][j];
for(int k=i-1;k>=1;k--){
if(c[k][j]==0){c[k][j]=c[k+1][j],c[k+1][j]=0;continue;}
if(c[k][j]!=p)break;
else c[k][j]=c[k][j]*2,c[k+1][j]=0,flag+=c[k][j]/2;
}
}
}
}
else if(op=='2'||op=='s'){//下移
for(int i=n;i>=1;i--){
for(int j=1;j<=n;j++){
int p=c[i][j];
for(int k=i+1;k<=n;k++){
if(c[k][j]==0){c[k][j]=c[k-1][j],c[k-1][j]=0;continue;}
if(c[k][j]!=p)break;
else c[k][j]=c[k][j]*2,c[k-1][j]=0,flag+=c[k][j]/2;
}
}
}
}
else if(op=='4'||op=='a'){//左移
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
int p=c[i][j];
for(int k=j-1;k>=1;k--){
if(c[i][k]==0){c[i][k]=c[i][k+1],c[i][k+1]=0;continue;}
if(c[i][k]!=p)break;
else c[i][k]=c[i][k]*2,c[i][k+1]=0,flag+=c[i][k]/2;
}
}
}
}
else if(op=='6'||op=='d'){//右移
for(int i=1;i<=n;i++){
for(int j=n;j>=1;j--){
int p=c[i][j];
for(int k=j+1;k<=n;k++){
if(c[i][k]==0){c[i][k]=c[i][k-1],c[i][k-1]=0;continue;}
if(c[i][k]!=p)break;
else c[i][k]=c[i][k]*2,c[i][k-1]=0,flag+=c[i][k]/2;
}
}
}
}
else ppp=0;
checks();
ans+=flag;//计分
}
cout<<"END!\nScore:"<<ans<<'\n';
}