2048小游戏

· · 个人记录

在队长的帮助下,写了一个2048小游戏(附破解版)

按 w a s d 操作:

#include<cstdio>
#include<time.h>
#include<conio.h>
#include<algorithm>
using namespace std;

const int nn=4;
const int n_n=nn*nn;

unsigned int seed;
int a[nn][nn];
int ax;
int b[nn][nn];
int m; 

void work();

void print();
void Putnum();
int Doplay();
void solve1(int);
void solve2(int);

int givnum();
bool checkok();

int main()
{
    seed=(unsigned)time(NULL);
    srand(seed);

    b[0][0]=1;
    Putnum();
    Putnum();
    while(1) work();
    return 0;
}
void work()
{
    print();
    int d=Doplay();
    solve1(d);
    solve2(d);
    solve1(d);
    if(ax>=n_n) exit(0);
    system("cls");
    Putnum();
    return;
}
void print()
{
    printf("Mark  %d\n\n",m);
    for(int i=0;i<nn;i++)
    {
        for(int j=0;j<nn;j++)
        {
            b[i][j]=a[i][j];
            if(a[i][j]) printf("%4d  ",a[i][j]);else printf("   .  ");
            //printf("%4d ",a[i][j]);
        }
        printf("\n\n");
    }
    return;
}
void Putnum()
{
    if(!checkok()) return;
    int x,y,v;
    //scanf("%d%d%d",&x,&y,&v);
    x=rand()%nn,y=rand()%nn,v=rand()%2;v<<=1;v+=2;//
    while(a[x][y]!=0){x=rand()%nn,y=rand()%nn,v=rand()%2;v<<=1;v+=2;}//
    printf("Add %d %d %d\n",x,y,v);//
    a[x][y]=v;
    ax++;
    return;
}
int Doplay()
{
    int d;
    //d=findpl();
    d=givnum();
    return d;
}
void solve1(int d)
{
    for(int qwe=0;qwe<nn;qwe++)
    {
        for(int i=0;i<nn;i++)
        {
            for(int j=0;j<nn;j++)
            {
                if(d==1)
                {
                    if(i!=0&&a[i-1][j]==0)
                    {
                        a[i-1][j]=a[i][j];
                        a[i][j]=0;
                    }
                }
                else if(d==2)
                {
                    if(i+1<nn&&a[i+1][j]==0)
                    {
                        a[i+1][j]=a[i][j];
                        a[i][j]=0;
                    }
                }
                else if(d==3)
                {
                    if(j!=0&&a[i][j-1]==0)
                    {
                        a[i][j-1]=a[i][j];
                        a[i][j]=0;
                    }
                }
                else if(d==4)
                {
                    if(j+1<nn&&a[i][j+1]==0)
                    {
                        a[i][j+1]=a[i][j];
                        a[i][j]=0;
                    }
                }
            }
        }
    }
    return;
}
void solve2(int d)
{
    if(d==1)
    {
        for(int i=0;i+1<nn;i++)
        {
            for(int j=0;j<nn;j++)
            {
                if(a[i][j]==a[i+1][j]&&a[i][j]!=0)
                {
                    a[i][j]<<=1,a[i+1][j]=0,ax--;
                    m+=a[i][j];
                }
            }
        }
    }
    else if(d==2)
    {
        for(int i=nn-1;i>0;i--)
        {
            for(int j=0;j<nn;j++)
            {
                if(a[i][j]==a[i-1][j]&&a[i][j]!=0)
                {
                    a[i][j]<<=1,a[i-1][j]=0,ax--;
                    m+=a[i][j];
                }
            }
        }
    }
    else if(d==3)
    {
        for(int i=0;i<nn;i++)
        {
            for(int j=0;j+1<nn;j++)
            {
                if(a[i][j]==a[i][j+1]&&a[i][j]!=0)
                {
                    a[i][j]<<=1,a[i][j+1]=0,ax--;
                    m+=a[i][j];
                }
            }
        }
    }
    else if(d==4)
    {
        for(int i=0;i<nn;i++)
        {
            for(int j=nn-1;j>0;j--)
            {
                if(a[i][j]==a[i][j-1]&&a[i][j]!=0)
                {
                    a[i][j]<<=1,a[i][j-1]=0,ax--;
                    m+=a[i][j];
                }
            }
        }
    }
    return;
}
int givnum()
{
    char c=_getch();
    if(c=='w') return 1;
    if(c=='a') return 3;
    if(c=='s') return 2;
    if(c=='d') return 4;
}
bool checkok()
{
    for(int i=0;i<nn;i++)
    {
        for(int j=0;j<nn;j++)
        {
            if(b[i][j]!=a[i][j]) return 1;
        }
    }
    return 0;
}

破解版:(已公开)