easyx2048

· · 个人记录

#include<bits/stdc++.h>
#include<easyx.h>
#include<graphics.h>
#define int long long
using namespace std;
int a[6][6]={0};
bool p[6][6]={0};
int fx[8]={-1,1,0,0,0,0,-1,1};
int point=0,fx_=0,wx=0,wy=0;
void jz(int x,int y,LPCTSTR s,int daxiao);
void csh();
bool sx();
signed main(){
    srand(time(NULL));
    initgraph(600,600,1);
//  csh();
    sx();
    setbkmode(TRANSPARENT);
    while(1){
        TCHAR atchar[1000];
        _stprintf(atchar,_T("%d"),point);
        outtextxy(300-textwidth(atchar)/2,25,atchar);

        BeginBatchDraw();
        setlinestyle(PS_SOLID,5);
        for(int i=1;i<=5;i++){
            line(100,i*100,500,i*100);
        }
        for(int i=1;i<=5;i++){
            line(i*100,100,i*100,500);
        }
        for(int i=1;i<=4;i++){
            for(int j=1;j<=4;j++){
                switch(a[i][j]){
                    case 1:{
                        setfillcolor(RGB(255,150,150));
                        break;
                    }
                    case 2:{
                        setfillcolor(RGB(253,173,125));
                        break;
                    }
                    case 4:{
                        setfillcolor(RGB(252,239,126));
                        break;
                    }
                    case 8:{
                        setfillcolor(RGB(153,254,124));
                        break;
                    }
                    case 16:{
                        setfillcolor(RGB(172,253,226));
                        break;
                    }
                    case 32:{
                        setfillcolor(RGB(122,115,253));
                        break;
                    }
                    case 64:{
                        setfillcolor(RGB(193,122,245));
                        break;
                    }
                    case 128:{
                        setfillcolor(RGB(247,166,240));
                        break;
                    }
                    case 256:{
                        setfillcolor(RGB(0,128,64));
                        break;
                    }
                    case 512:{
                        setfillcolor(RGB(128,64,0));
                        break;
                    }
                    case 1024:{
                        setfillcolor(RGB(128,128,128));
                        break;
                    }
                    case 2048:{
                        setfillcolor(RGB(10,0,86));
                        break;
                    }
                    case 4096:{
                        setfillcolor(RGB(11,45,14));
                        break;
                    }
                    case 8192:{
                        setfillcolor(RGB(121,24,65));
                        break;
                    }
                    case 16384:{
                        setfillcolor(RGB(89,36,92));
                        break;
                    }
                    case 32768:{
                        setfillcolor(RGB(16,94,13));
                        break;
                    }
                }
                if(a[i][j]!=0){
                    TCHAR tchar[1000];
                    _stprintf(tchar,_T("%d"),a[i][j]);
                    int td=a[i][j],w=0;
                    while(td){
                        td/=10;
                        w++; 
                    }
                    solidrectangle(j*100+4,i*100+4,j*100+100-4,i*100+100-4);
                    jz(j*100+2,i*100+2,tchar,65-6*w);
                }
            }
        }
        ExMessage msg={0};
        peekmessage(&msg,EX_KEY);
        if(msg.message==WM_KEYDOWN&&(msg.vkcode=='W'||msg.vkcode=='A'||msg.vkcode=='S'||msg.vkcode=='D')){
            memset(p,0,sizeof(p));
            switch(msg.vkcode){
                case 'W':{
                    fx_=0;
                    break;
                }
                case 'S':{
                    fx_=1;
                    break;
                }
                case 'A':{
                    fx_=2;
                    break;
                }
                case 'D':{
                    fx_=3;
                    break;
                }
            }
            for(int c=1;c<=4;c++){
                for(int i=1;i<=4;i++){
                    for(int j=1;j<=4;j++){
                        int u=i+fx[fx_],v=j+fx[4+fx_];
                        if(a[u][v]==0&&u>=1&&u<=4&&v>=1&&v<=4){
                            a[u][v]=a[i][j];
                            a[i][j]=0;
                        }
                    }
                }
            }
            for(int i=1;i<=4;i++){
                for(int j=1;j<=4;j++){
                    int u=i+fx[fx_],v=j+fx[4+fx_];
                    if(a[u][v]==a[i][j]&&a[i][j]!=0&&p[i][j]==0){
                        a[u][v]=a[i][j]*2;
                        point+=a[i][j];
                        a[i][j]=0;
                        p[u][v]=1;
                    }
                }
            }
            for(int c=1;c<=4;c++){
                for(int i=1;i<=4;i++){
                    for(int j=1;j<=4;j++){
                        int u=i+fx[fx_],v=j+fx[4+fx_];
                        if(a[u][v]==0&&u>=1&&u<=4&&v>=1&&v<=4){
                            a[u][v]=a[i][j];
                            a[i][j]=0;
                        }
                    }
                }
            }
            if(sx()==0){
                EndBatchDraw();
                _sleep(3000);
                return 0;
            }
        }
        EndBatchDraw();
        cleardevice();
    } 
}
void jz(int x,int y,LPCTSTR jz_s,int daxiao){
    settextstyle(daxiao,0,"楷体");
    int w=textwidth(jz_s),h=textheight(jz_s);
    outtextxy(x-w/2+50,y-h/2+50,jz_s);
}
void csh(){
    int t=0;
    for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            a[i][j]=pow(2,t++);
        }
    } 
}
bool sx(){
    bool p=0;
    for(int ii=1;ii<=4;ii++){
        for(int jj=1;jj<=4;jj++){
            if(a[ii][jj]==0){
                p=1;
                break;
            }
        }
    }
    if(p==0){
        return false;
    }
    wx=0,wy=0;
    while((wx==0&&wy==0)||a[wx][wy]!=0){
        wx=rand()%4+1,wy=rand()%4+1;
    }
    int xixi=1+rand()%100;
    if(xixi<=90){
        a[wx][wy]=1;
    }else if(xixi>=91&&xixi<=98){
        a[wx][wy]=2;
    }else{
        a[wx][wy]=4;
    }
    return true;
}
//原创:cyx1234