easyx俄罗斯方块

· · 个人记录

#include<bits/stdc++.h>
#include<easyx.h>
#include<graphics.h>
#include<conio.h>
using namespace std;
bool flag;
int block_ready[8];
int mp[25][15];
int s[25];
int form,blockway,block_l,block_r;
pair<int,int> block[5];
bool time_js(int shichang);
void left(); 
void right();
void down();
void way();
void lr(int ll,int rr);
void ready(int i1,int i2,int i3,int i4,int j1,int j2,int j3,int j4);
signed main(){
    srand(time(NULL));
    initgraph(350,650,1);
    while(1){
        BeginBatchDraw();
        setlinestyle(PS_SOLID,1);
        for(int i=0;i<=10;i++){
            line(i*30+25,25,i*30+25,625);
        }
        for(int i=0;i<=20;i++){
            line(25,i*30+25,325,i*30+25);
        }
        if(flag==0){
            for(int i=1;i<=20;i++){
                int cnt=0;
                for(int j=1;j<=10;j++){
                    if(mp[i][j]!=0){
                        cnt++;
                    }
                }
                s[i]=cnt;
            }
            if(s[1]!=0){
                EndBatchDraw();
                cleardevice();
                settextstyle(75,0,"楷体");
                outtextxy(350/2-textwidth("GAME OVER")/2,650/2-textheight("GAME OVER")/2,"GAME OVER"); 
                Sleep(3000);
                return 0;
            }
            for(int o=2;o<=20;){
                for(int i=1;i<=20;i++){
                    int cnt=0;
                    for(int j=1;j<=10;j++){
                        if(mp[i][j]!=0){
                            cnt++;
                        }
                    }
                    s[i]=cnt;
                }
                if(s[o]==10){
                    for(int j=1;j<=10;j++){
                        mp[o][j]=0;
                    }
                    s[o]=0;
                    for(int k=o;k>=2;k--){
                        for(int y=1;y<=10;y++){
                            mp[k][y]=mp[k-1][y];
                        }
                    }
                }else{
                    o++;
                } 
            }
            form=3;
            if(s[2]!=0) form=1;
            blockway=1;
            block[1].first=0;
            block[1].second=0;
            block[2].first=0;
            block[2].second=0;
            block[3].first=0;
            block[3].second=0;
            block[4].first=0;
            block[4].second=0;
            if(s[2]==1) form=1;
            switch(form){
                case 1:{
                    block[1].first=1;
                    block[1].second=rand()%7+1;
                    for(int i=2;i<=4;i++){
                        block[i].first=block[1].first;
                        block[i].second=block[i-1].second+1;
                    }
                    break;
                }
                case 2:{
                    block[1].first=1;
                    block[1].second=rand()%9+1;
                    block[2].first=1;
                    block[2].second=block[1].second+1;
                    block[3].first=2;
                    block[3].second=block[1].second;
                    block[4].first=2;
                    block[4].second=block[1].second+1;
                    break;
                }
                case 3:{
                    block[1].first=1;
                    block[1].second=rand()%8+1;
                    block[2].first=2;
                    block[2].second=block[1].second;
                    for(int i=3;i<=4;i++){
                        block[i].first=2;
                        block[i].second=block[i-1].second+1;
                    }
                    break;
                }
            }
            for(int i=1;i<=4;i++){
                mp[block[i].first][block[i].second]=form;
            }
            flag=1;
        }
        if(_kbhit()){
            int m=_getch();
            switch(m){
                case 'w':
                case 'W':
                case 72:
                    way();
                    break;
                case 'S':
                case 's':
                case 80:
                    down();
                    break;
                case 'A':
                case 'a':
                case 75:
                    left();
                    break;
                case 'D':
                case 'd':
                case 77:
                    right();
                    break;
            }
        }
//      if(time_js(300)){
//          down();
//      }
        for(int i=1;i<=20;i++){
            int cnt=0;
            for(int j=1;j<=10;j++){
                switch(mp[i][j]){
                    case 1:{
                        setfillcolor(RGB(255,151,125));
                        break;
                    }
                    case 2:{
                        setfillcolor(RGB(240,250,140));
                        break;
                    }
                    case 3:{
                        setfillcolor(RGB(179,250,147));
                        break;
                    }
                    case 4:{
                        setfillcolor(RGB(152,250,250));
                        break;
                    }
                }
                if(mp[i][j]!=0){ 
                    solidrectangle(25+(j-1)*30+1,25+(i-1)*30+1,25+j*30-1,25+i*30-1);
                }
            }
        }
        EndBatchDraw();
        cleardevice();
    }
}
bool time_js(int shichang){
    static int begin=clock();
    if(clock()-begin>=shichang){
        begin=clock();
        return true;
    }
    return false;
}
void left(){
    for(int i=1;i<=4;i++){
        if(block[i].second-1<1){
            return ;
        }
        if(mp[block[i].first][block[i].second-1]!=0){
            bool flag_3=0;
            for(int j=1;j<=4;j++){
                if(block[j].first==block[i].first&&block[j].second==block[i].second-1){
                    flag_3=1;
                    break;
                }
            }
            if(flag_3==0){
                return ;
            }
        }
    }
    for(int i=1;i<=4;i++){
        mp[block[i].first][block[i].second]=0;
    }
    for(int i=1;i<=4;i++){
        block[i].second--;
    }
    for(int i=1;i<=4;i++){
        mp[block[i].first][block[i].second]=form;
    }
}
void right(){
    for(int i=1;i<=4;i++){
        if(block[i].second+1>10){
            return ;
        }
        if(mp[block[i].first][block[i].second+1]!=0){
            bool flag_3=0;
            for(int j=1;j<=4;j++){
                if(block[j].first==block[i].first&&block[j].second==block[i].second+1){
                    flag_3=1;
                    break;
                }
            }
            if(flag_3==0){
                return ;
            }
        }
    }
    for(int i=1;i<=4;i++){
        mp[block[i].first][block[i].second]=0;
    }
    for(int i=1;i<=4;i++){
        block[i].second+=1;
    }
    for(int i=1;i<=4;i++){
        mp[block[i].first][block[i].second]=form;
    }
}
void down(){                          
    for(int i=1;i<=4;i++){
        if(block[i].first+1>20){
            flag=0;
            return ;
        }
        if(mp[block[i].first+1][block[i].second]!=0){
            bool flag_3=0;
            for(int j=1;j<=4;j++){
                if(block[j].first==block[i].first+1&&block[j].second==block[i].second){
                    flag_3=1;
                    break;
                }
            }
            if(flag_3==0){
                flag=0;
                return ;
            }
        }
    }
    for(int i=1;i<=4;i++){
        mp[block[i].first][block[i].second]=0;
    }
    for(int i=1;i<=4;i++){
        block[i].first+=1;
    }
    for(int i=1;i<=4;i++){
        mp[block[i].first][block[i].second]=form;
    }
}
void way(){
    switch(form){
        case 1:{
            switch(blockway){
                case 1:{ 
                    ready(-1,0,1,2,1,0,-1,-2);
                    break;
                }
                case 2:{
                    ready(1,0,-1,-2,1,0,-1,-2);
                    break;
                }
                case 3:{
                    ready(1,0,-1,-2,-1,0,1,2);
                    break;
                }
                case 4:{
                    ready(-1,0,1,2,-1,0,1,2);
                    break;
                }
            }
            break;
        }
        case 2:{
            switch(blockway){
                case 1:{ 
                    ready(1,2,0,1,1,0,0,-1);
                    break;
                }
                case 2:{
                    ready(1,0,0,-1,-1,-2,0,-1);
                    break;
                }
                case 3:{
                    ready(-1,-2,0,-1,-1,0,0,1);
                    break;
                }
                case 4:{
                    ready(-1,0,0,1,1,2,0,1);
                    break;
                }
            }
            break;
        }
        case 3:{
            switch(blockway){
                case 1:{ 
                    ready(0,-1,0,1,2,1,0,-1);
                    break;
                }
                case 2:{
                    ready(2,1,0,-1,0,1,0,-1);
                    break;
                }
                case 3:{
                    ready(0,1,0,-1,-2,-1,0,1);
                    break;
                }
                case 4:{
                    ready(-2,-1,0,1,0,-1,0,1);
                    break;
                }
            }
            break;
        }
    }
    for(int i=1;i<=4;i++){
        if(block[i].first+block_ready[i-1]<1||block[i].first+block_ready[i-1]>20||block[i].second+block_ready[i-1+4]<1||block[i].second+block_ready[i-1+4]>10){
            return ;
        }
        if(mp[block[i].first+block_ready[i-1]][block[i].second+block_ready[i-1+4]]!=0){
            bool flag_3=0;
            for(int j=1;j<=4;j++){
                if(block[j].first==block[i].first+block_ready[i-1]&&block[j].second==block[i].second+block_ready[i-1+4]!=0){
                    flag_3=1;
                    break;
                }
            }
            if(flag_3==0){
                return ;
            }
        }
    }
    for(int i=1;i<=4;i++){
        mp[block[i].first][block[i].second]=0;
    }
    for(int i=1;i<=4;i++){
        block[i].first+=block_ready[i-1];
        block[i].second+=block_ready[i-1+4];
    }
    for(int i=1;i<=4;i++){
        mp[block[i].first][block[i].second]=form;
    }
    blockway=(blockway==4?1:blockway+1);
}
void ready(int i1,int i2,int i3,int i4,int j1,int j2,int j3,int j4){
    block_ready[0]=i1;
    block_ready[1]=i2;
    block_ready[2]=i3;
    block_ready[3]=i4;
    block_ready[4]=j1;
    block_ready[5]=j2;
    block_ready[6]=j3;
    block_ready[7]=j4;
}