easyx象棋

· · 个人记录

#include<bits/stdc++.h>
#include<easyx.h>
#include<graphics.h>
#define int long long 
using namespace std;
int mp[15][15];
void draw(); 
void star();
int endqizi=-1;
int t=1;
pair<int,int>start,end;
signed main(){
    star(); 
    initgraph(600,660,0); 
    draw();
    while(1){
        ExMessage msg;
        peekmessage(&msg,EX_MOUSE);
        bool hongjiang=0,heijiang=0; 
        for(int i=1;i<=9;i++){
            for(int j=1;j<=10;j++){
                if(mp[j][i]==11) hongjiang=1;
                if(mp[j][i]==21) heijiang=1;

                if(msg.x>=i*60-25&&msg.x<=i*60+25&&msg.y>=j*60-25&&msg.y<=j*60+25&&msg.message==WM_LBUTTONDOWN){
                    if(start.first==j&&start.second==i){
                        start.first=-1;
                        start.second=-1;
                    }else{
                        if(start.first==-1&&start.second==-1&&mp[j][i]!=0&&mp[j][i]/10==t){
                            start.first=j;
                            start.second=i;
                        }else{
                            if(start.first!=-1&&start.second!=-1){
                                end.first=j;
                                end.second=i;
                                endqizi=mp[start.first][start.second];
                            }
                        }
                    }
                }
                endqizi=mp[start.first][start.second];
            }
        }
        if(hongjiang==0||heijiang==0){
            draw(); 
            _sleep(3000);
            exit(0);
        }
        if(end.first!=-1&&end.second!=-1){
            bool p=0;
            if(mp[end.first][end.second]/10!=endqizi/10){

                switch(endqizi%10){
                    case 1:{
                        bool flog_qi=0;
                        int u=start.first,v=end.first;
                        if(u>v) swap(u,v);
                        for(int i=u+1;i<=v-1;i++){
                            if(mp[i][start.second]!=0){
                                flog_qi=1;
                                break;
                            }
                        }
                        if(((endqizi/10==1&&(abs(start.first-end.first))+(abs(start.second-end.second))==1&&end.first>=8&&end.first<=10&&end.second>=4&&end.second<=6)||(endqizi/10==2&&(abs(start.first-end.first))+(abs(start.second-end.second))==1&&end.first>=1&&end.first<=3&&end.second>=4&&end.second<=6))||(start.second==end.second&&!flog_qi)){
                            mp[end.first][end.second]=endqizi;
                            mp[start.first][start.second]=0;
                            p=1;
                        }
                        break;
                    }
                    case 2:{
                        if((endqizi/10==1&&(abs(start.first-end.first))==1&&(abs(start.second-end.second))==1&&end.first>=8&&end.first<=10&&end.second>=4&&end.second<=6)||(endqizi/10==2&&(abs(start.first-end.first))==1&&(abs(start.second-end.second))==1&&end.first>=1&&end.first<=3&&end.second>=4&&end.second<=6)){
                            mp[end.first][end.second]=endqizi;
                            mp[start.first][start.second]=0;
                            p=1;
                        }
                        break;
                    }
                    case 3:{
                        if((endqizi/10==1&&(abs(start.first-end.first))==2&&(abs(start.second-end.second))==2&&end.first>=6&&end.first<=10)||(endqizi/10==2&&(abs(start.first-end.first))==2&&(abs(start.second-end.second))==2&&end.first>=1&&end.first<=5)){
                            int u=(start.first+end.first)/2,v=(start.second+end.second)/2;
                            if(mp[u][v]==0){
                                mp[end.first][end.second]=endqizi;
                                mp[start.first][start.second]=0;
                                p=1;
                            }
                        }
                        break;
                    }
                    case 4:{
                        if((abs(start.first-end.first)==1||abs(start.first-end.first)==2)&&(abs(start.second-end.second)==1||abs(start.second-end.second)==2)&&abs(start.first-end.first)!=abs(start.second-end.second)){
                            int u=0,v=0;
                            if(abs(start.first-end.first)==2){
                                u=start.first;
                                v=end.first;
                                if(mp[(u+v)/2][start.second]==0){
                                    mp[end.first][end.second]=endqizi;
                                    mp[start.first][start.second]=0;
                                    p=1;
                                }
                            }
                            if(abs(start.second-end.second)==2){
                                u=start.second;
                                v=end.second;
                                if(mp[start.first][(u+v)/2]==0){
                                    mp[end.first][end.second]=endqizi;
                                    mp[start.first][start.second]=0;
                                    p=1;
                                }
                            }
                        }
                        break;
                    }
                    case 5:{
                        if(start.first-end.first==0||start.second-end.second==0){
                            bool flog_qi=0;
                            int u=start.first,v=end.first;
                            if(u>v) swap(u,v);
                            for(int i=u+1;i<=v-1;i++){
                                if(mp[i][start.second]!=0){
                                    flog_qi=1;
                                    break;
                                }
                            }
                            u=start.second,v=end.second;
                            if(u>v) swap(u,v);
                            for(int i=u+1;i<=v-1;i++){
                                if(mp[start.first][i]!=0){
                                    flog_qi=1;
                                    break;
                                }
                            }
                            if(!flog_qi){
                                mp[end.first][end.second]=endqizi;
                                mp[start.first][start.second]=0;
                                p=1;
                            }
                        }
                        break;
                    }
                    case 6:{
                        if(start.first-end.first==0||start.second-end.second==0){
                            int flog_qi=0;
                            int u=start.first,v=end.first;
                            if(u>v) swap(u,v);
                            for(int i=u+1;i<=v-1;i++){
                                if(mp[i][start.second]!=0){
                                    flog_qi++;
                                }
                            }
                            u=start.second,v=end.second;
                            if(u>v) swap(u,v);
                            for(int i=u+1;i<=v-1;i++){
                                if(mp[start.first][i]!=0){
                                    flog_qi++;
                                }
                            }
                            if((flog_qi==1&&mp[end.first][end.second]!=0)||(flog_qi==0&&mp[end.first][end.second]==0)){
                                mp[end.first][end.second]=endqizi;
                                mp[start.first][start.second]=0;
                                p=1;
                            }
                        }
                        break;
                    }
                    case 7:{
                        if((abs(start.first-end.first))+(abs(start.second-end.second))==1){
                            bool flog_zou=0;
                            if(endqizi/10==1){
                                if(start.first-end.first!=-1){
                                    if(start.first<=5){
                                        flog_zou=1;
                                    }else{
                                        if(start.second-end.second==0){
                                            flog_zou=1;
                                        }
                                    }
                                }
                            }else{
                                if(start.first-end.first!=1){
                                    if(start.first>=6){
                                        flog_zou=1;
                                    }else{
                                        if(start.second-end.second==0){
                                            flog_zou=1;
                                        }
                                    }
                                }
                            }
                            if(flog_zou==1){
                                mp[end.first][end.second]=endqizi;
                                mp[start.first][start.second]=0;
                                p=1;
                            }
                        }
                        break;
                    }
                }
            }
            start.first=-1;
            start.second=-1;
            end.first=-1;
            end.second=-1;
            endqizi=-1;
            if(p){
                if(t==1) t=2;
                else t=1;
            }
        }
        if(msg.message==WM_LBUTTONDOWN){
            draw();
            msg={0};
        }
    }
}
void draw(){
    setbkmode(TRANSPARENT);
    setlinestyle(PS_SOLID,3);
    setlinecolor(WHITE);
    setfillcolor(BROWN);
    settextstyle(40,0,"楷体");
    cleardevice();
    BeginBatchDraw();
    for(int i=1;i<=10;i++){
        line(60,i*60,540,i*60);
    }
    for(int i=1;i<=9;i++){
        line(i*60,60,i*60,300);
    }
    for(int i=1;i<=9;i++){
        line(i*60,60+300,i*60,300+300);
    }
    line(60,300,60,360);
    line(540,300,540,360);
    setfillcolor(BROWN);
    for(int i=1;i<=9;i++){
        for(int j=1;j<=10;j++){
            setfillcolor(BROWN);
            if(mp[j][i]>=10&&mp[j][i]<20){
                settextcolor(RED);
            }
            if(mp[j][i]>=20&&mp[j][i]<30){
                settextcolor(BLACK);
            }
            if(j==start.first&&i==start.second){
                setfillcolor(GREEN);
            }
            if(mp[j][i]!=0){
                solidcircle(i*60,j*60,25);
            }   
            switch(mp[j][i]%10){
                case 1:{
                    outtextxy(i*60-20,j*60-20,"将");
                    break;
                }
                case 2:{
                    outtextxy(i*60-20,j*60-20,"士");
                    break;
                }
                case 3:{
                    outtextxy(i*60-20,j*60-20,"象");
                    break;
                }
                case 4:{
                    outtextxy(i*60-20,j*60-20,"马");
                    break;
                }
                case 5:{
                    outtextxy(i*60-20,j*60-20,"车");
                    break;
                } 
                case 6:{
                    outtextxy(i*60-20,j*60-20,"炮");
                    break;
                }
                case 7:{
                    outtextxy(i*60-20,j*60-20,"兵");
                    break;
                }
            }
        }
    }
    EndBatchDraw();
}
void star(){
    mp[1][1]=25;
    mp[1][2]=24;
    mp[1][3]=23;
    mp[1][4]=22;
    mp[1][5]=21;
    mp[1][6]=22;
    mp[1][7]=23;
    mp[1][8]=24;
    mp[1][9]=25;
    mp[3][2]=26;
    mp[3][8]=26;
    mp[4][1]=27;
    mp[4][3]=27;
    mp[4][5]=27;
    mp[4][7]=27;
    mp[4][9]=27;

    mp[10][1]=15;
    mp[10][2]=14;
    mp[10][3]=13;
    mp[10][4]=12;
    mp[10][5]=11;
    mp[10][6]=12;
    mp[10][7]=13;
    mp[10][8]=14;
    mp[10][9]=15;
    mp[8][2]=16;
    mp[8][8]=16;
    mp[7][1]=17;
    mp[7][3]=17;
    mp[7][5]=17;
    mp[7][7]=17;
    mp[7][9]=17;

    start.first=-1;
    start.second=-1;
    end.first=-1;
    end.second=-1;
}
//原创:cyx1234