• 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.. 困啦 晚安!!

     

  • 相关阅读:
    Css实现漂亮的滚动条样式
    清除浮动的方式有哪些?比较好的是哪一种?
    Cookie、sessionStorage、localStorage的区别
    http和https的区别?
    git 拉取分支切换分支
    css 三角形
    js中??和?.的意思
    js this指向
    tsconfig.json配置
    查看本地安装的所有npm包
  • 原文地址:https://www.cnblogs.com/zlrrrr/p/10409808.html
Copyright © 2020-2023  润新知