2048low版

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h> 
char c;
int num[6][6],step;

char * d2s(int n)
{
    switch(n)
    {
        case 0:
            return " ";
        case 2:
            return "2";
        case 4:
            return "4";
        case 8:
            return "8";
        case 16:
            return "16";
        case 32:
            return "32";
        case 64:
            return "64";
        case 128:
            return "128";
        case 256:
            return "256";
        case 512:
            return "512";
        case 1024:
            return "1024";
        case 2048:
            return "2048";
    }
}

void Show()
{
    printf("	  请按上下左右键操作
");
    printf("	  当前已走步数:%d
",step);
    printf ("	┏━━┳━━┳━━┳━━┓
");
    printf ("	┃%4s┃%4s┃%4s┃%4s┃
",d2s(num[1][1]),d2s(num[1][2]),d2s(num[1][3]),d2s(num[1][4]));
    printf ("	┣━━╋━━╋━━╋━━┫
");
    printf ("	┃%4s┃%4s┃%4s┃%4s┃
",d2s(num[2][1]),d2s(num[2][2]),d2s(num[2][3]),d2s(num[2][4]));
    printf ("	┣━━╋━━╋━━╋━━┫
");
    printf ("	┃%4s┃%4s┃%4s┃%4s┃
",d2s(num[3][1]),d2s(num[3][2]),d2s(num[3][3]),d2s(num[3][4]));
    printf ("	┣━━╋━━╋━━╋━━┫
");
    printf ("	┃%4s┃%4s┃%4s┃%4s┃
",d2s(num[4][1]),d2s(num[4][2]),d2s(num[4][3]),d2s(num[4][4]));
    printf ("	┗━━┻━━┻━━┻━━┛
");
}

int NewNum()
{
    int n=((rand()*rand()+rand())%2+1)*2;
//    printf("%d
",n); 
    int i,j;
    if(c=='w'||c==' ')
    {
        i=4;
        while(j=rand()%4+1)
            if(num[i][j]==0)
            {
                num[i][j]=n;
                return n;
            }
    }
    else if(c=='s')
    {
        i=1;
        while(j=rand()%4+1)
            if(num[i][j]==0)
            {
                num[i][j]=n;
                return n;
            }
    }
    else if(c=='a')
    {
        j=4;
        while(i=rand()%4+1)
            if(num[i][j]==0)
            {
                num[i][j]=n;
                return n;
            }
    }
    else if(c=='d')
    {
        j=1;
        while(i=rand()%4+1)
            if(num[i][j]==0)
            {
                num[i][j]=n;
                return n;
            }
    }
    return 0;
}

int cal()
{
    int i,j,ok=0,k;
    if(c=='w')
        for(j=1;j<=4;++j)
        {
            //push    
            for(i=1;i<4;++i)
            {
                k=0;
                while(num[i][j]==0)
                {
                    ++k;
                    if(num[i+k][j])
                    {
                        ok=1;
                        num[i][j]=num[i+k][j];
                        num[i+k][j]=0;
                        break;
                    }
                    if(i+k>4)
                        break;
                }
                if(i+k>4)
                    break;                
            }            
            //calculate
            for(i=1;i<=3;++i)
            {
                if(num[i][j]==num[i+1][j]&&num[i][j]!=0)
                {
                    ok=1;
                    num[i][j]*=2;
                    num[i+1][j]=0;
                }                
            }    
            //push    
            for(i=1;i<4;++i)
            {
                k=0;
                while(num[i][j]==0)
                {
                    ++k;
                    if(num[i+k][j])
                    {
                        ok=1;
                        num[i][j]=num[i+k][j];
                        num[i+k][j]=0;
                        break;
                    }
                    if(i+k>4)
                        break;
                }
                if(i+k>4)
                    break;                
            }
        }
    if(c=='s')
        for(j=1;j<=4;++j)
        {
            //push    
            for(i=4;i>0;--i)
            {
                k=0;
                while(num[i][j]==0)
                {
                    ++k;
                    if(num[i-k][j])
                    {
                        ok=1;
                        num[i][j]=num[i-k][j];
                        num[i-k][j]=0;
                        break;
                    }
                    if(i-k<0)
                        break;
                }
                if(i-k<0)
                    break;                
            }            
            //calculate
            for(i=4;i>0;--i)
            {
                if(num[i][j]==num[i-1][j]&&num[i][j]!=0)
                {
                    ok=1;
                    num[i][j]*=2;
                    num[i-1][j]=0;
                }                
            }    
            //push    
            for(i=4;i>0;--i)
            {
                k=0;
                while(num[i][j]==0)
                {
                    ++k;
                    if(num[i-k][j])
                    {
                        ok=1;
                        num[i][j]=num[i-k][j];
                        num[i-k][j]=0;
                        break;
                    }
                    if(i-k<0)
                        break;
                }
                if(i-k<0)
                    break;                
            }
        }
    if(c=='a')
        for(i=1;i<=4;++i)
        {
            //push    
            for(j=1;j<4;++j)
            {
                k=0;
                while(num[i][j]==0)
                {
                    ++k;
                    if(num[i][j+k])
                    {
                        ok=1;
                        num[i][j]=num[i][j+k];
                        num[i][j+k]=0;
                        break;
                    }
                    if(j+k>4)
                        break;
                }
                if(j+k>4)
                    break;                
            }
            //calculate
            for(j=1;j<=3;++j)
            {
                if(num[i][j]==num[i][j+1]&&num[i][j]!=0)
                {
                    ok=1;
                    num[i][j]*=2;
                    num[i][j+1]=0;
                }                
            }    
            //push    
            for(j=1;j<4;++j)
            {
                k=0;
                while(num[i][j]==0)
                {
                    ++k;
                    if(num[i][j+k])
                    {
                        ok=1;
                        num[i][j]=num[i][j+k];
                        num[i][j+k]=0;
                        break;
                    }
                    if(j+k>4)
                        break;
                }
                if(j+k>4)
                    break;                
            }
        }
    if(c=='d')
        for(i=1;i<=4;++i)
        {
            //push    
            for(j=4;j>0;--j)
            {
                k=0;
                while(num[i][j]==0)
                {
                    ++k;
                    if(num[i][j-k])
                    {
                        ok=1;
                        num[i][j]=num[i][j-k];
                        num[i][j-k]=0;
                        break;
                    }
                    if(j-k<0)
                        break;
                }
                if(j-k<0)
                    break;                
            }            
            //calculate
            for(j=4;j>0;--j)
            {
                if(num[i][j]==num[i][j-1]&&num[i][j]!=0)
                {
                    ok=1;
                    num[i][j]*=2;
                    num[i][j-1]=0;
                }                
            }    
            //push    
            for(j=4;j>0;--j)
            {
                k=0;
                while(num[i][j]==0)
                {
                    ++k;
                    if(num[i][j-k])
                    {
                        ok=1;
                        num[i][j]=num[i][j-k];
                        num[i][j-k]=0;
                        break;
                    }
                    if(j-k<0)
                        break;
                }
                if(j-k<0)
                    break;                
            }
        }                    
    return ok;
}

int fail()
{
    for(int i=1;i<=4;++i)
    {
        for(int j=1;j<=4;++j)
        {
            if(num[i][j]==0)
                return 0;
            if(num[i][j]==num[i+1][j]||
            num[i][j]==num[i-1][j]||
            num[i][j]==num[i][j+1]||
            num[i][j]==num[i][j-1])
            {
                return 0;
            }
        }
    }
    return 1;
}

int operate(int key)
{
        if(key==72)
        {
            c='w';
            if(cal())
            {
                NewNum();
                return 1;
            }                
        }
            
        else if(key==75)
        {
            c='a';
            if(cal())
            {
                NewNum();
                return 1;
            }                
        }
            
        else if(key==77)
        {
            c='d';
            if(cal())
            {
                NewNum();
                return 1;
            }                
        }
            
        else if(key==80)
        {
            c='s';
            if(cal())
            {
                NewNum();
                return 1;
            }                
        }    
        return 0;
}

int success()
{
    for(int i=1;i<=4;++i)
    {
        for(int j=1;j<=4;++j)
        {
            if(num[i][j]==2048)
                return 1;
        }
    }
    return 0;
}

int main()
{
    c=' ';
    int key,a=1;
    step=0;
    a=NewNum();
    while(1)
    {    
        Show();        
        if((key=getch())<0)
        {
            key=getch();        
        }
        if(fail())
        {
            printf("GAME OVER!!!
");            
            break;
        }    
        if(success())
        {
            printf("WIN!!!
");            
            break;
        }        
        if(operate(key))
        {
            step++;
        }
            
        system("cls");
    }
    system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/Traveller-Leon/p/5129521.html