2048 (控制台版)

#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
using namespace std;

class ErLingSiBa
{
private:

    int Map[4][4], tmp[4][4];
    int k[4],result[4];

public:

    void init()
    {
        for(int i=0;i<4;i++)
        {
            for(int j=0;j<4;j++)
            {
                Map[i][j]=0;
            }
        }

        int pos=rand()%16;
        Map[pos/4][pos%4]=2;

    }

    void Rand()
    {
        int b[16], x=0;
        for(int i=0;i<4;i++)
        {
            for(int j=0;j<4;j++)
            {
                if(Map[i][j]==0)
                {
                    b[x]=i*4+j;
                    x++;
                }
            }
        }

        if(x>0)
        {
            int pos=rand()%x;
            Map[b[pos]/4][b[pos]%4]=2;
        }
    }

    void Merge()
    {
        for(int i=0;i<4;i++) result[i]=0;
        int x=0, last=0;

        for(int i=0;i<4;i++)
        {
            if(k[i]==0) continue;

            if(x==0)
            {
                result[x]=k[i];
                x++;
            }

            else
            {

                if(last==0&&k[i]==result[x-1])
                {
                    result[x-1]=2*result[x-1];
                    last=1;
                }

                else
                {
                    result[x]=k[i];
                    x++;
                    last=0;
                }
            }
        }
    }

    void check()
    {
        bool flag=0;
        for(int i=0;i<4;i++)
        {
            for(int j=0;j<4;j++)
            {
                if(tmp[i][j]!=Map[i][j]) flag=1;
            }
        }

        if(flag==1)
        {
            for(int i=0;i<4;i++)
            {
                for(int j=0;j<4;j++)
                {
                    Map[i][j]=tmp[i][j];
                }
            }
            Rand();
        }

        else
        {
           // cout<<"wu xiao"<<endl;
        }
    }

    void Up()
    {
        for(int j=0;j<4;j++)
        {
            for(int i=0;i<4;i++) k[i]=Map[i][j];
            Merge();
            for(int i=0;i<4;i++) tmp[i][j]=result[i];
        }
    }

    void Down()
    {
        for(int j=0;j<4;j++)
        {
            for(int i=0;i<4;i++) k[3-i]=Map[i][j];
            Merge();
            for(int i=0;i<4;i++) tmp[i][j]=result[3-i];
        }
    }

    void Left()
    {
        for(int i=0;i<4;i++)
        {
            for(int j=0;j<4;j++) k[j]=Map[i][j];
            Merge();
            for(int j=0;j<4;j++) tmp[i][j]=result[j];
        }
    }

    void Right()
    {
        for(int i=0;i<4;i++)
        {
            for(int j=0;j<4;j++) k[3-j]=Map[i][j];
            Merge();
            for(int j=0;j<4;j++) tmp[i][j]=result[3-j];
        }
    }

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

    bool die()
    {
        int sum=0;
        for(int i=0;i<4;i++)
        {
            for(int j=0;j<4;j++)
            {
                if(Map[i][j]!=0) sum++;
            }
        }
        if(sum!=16) return 0;

        for(int i=1;i<4;i++)
        {
            for(int j=1;j<4;j++)
            {

                if(Map[i][j]==Map[i][j-1]||Map[i][j]==Map[i][j+1]||
                   Map[i][j]==Map[i-1][j]||Map[i][j]==Map[i+1][j])
                    return 0;
            }
        }
        if(Map[0][0]==Map[0][1]||Map[0][1]==Map[0][2]||Map[0][2]==Map[0][3]||
           Map[0][0]==Map[1][0]||Map[1][0]==Map[2][0]||Map[2][0]==Map[3][0]) return 0;

        return 1;
    }

    void Show()
    {
        system("cls");//屏幕清空
        for(int i=0;i<4;i++)
        {
            for(int j=0;j<4;j++)
            {
                if(Map[i][j]==0) printf("    *");
                else printf("%5d",Map[i][j]);
            }
            cout<<endl;
            cout<<endl;
        }
    }
};

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

    ErLingSiBa _2048;

    _2048.init(); _2048.Show();

    while(1)
    {
        char op; cin>>op;

        if(op=='U') _2048.Up();
        else if(op=='D') _2048.Down();
        else if(op=='L') _2048.Left();
        else if(op=='R') _2048.Right();
        else continue;

        _2048.check();

        _2048.Show();

        if(_2048.die()) { cout<<"die"<<endl; break; }
        if(_2048.Success()) { cout<<"win"<<endl; break;}

    }

    return 0;
}
View Code

详解明天更啦 今天有 1.. 困啦 晚安!!

FH

猜你喜欢

转载自www.cnblogs.com/zlrrrr/p/10409808.html
今日推荐