#define UP     72
#define DOWN   80
#define LEFT   75
#define RIGHT  77
#define ESC    27
#define ENTER  13
#define F1     0x3b
#define F2     0x3c
#define F3     0x3d
#define KEY_B  0x30


#include<all256.h>
#include<stdio.h>
#include<time.h>
void Init(void);
void Logo(void);
void Menu(void);
void Botton(void);
void Sin_Game(void);
void Dou_Game(void);
void How_to(void);
void Help(void);
int  Quit(void);
int  Bet(int Score);
int  Play(char is_double,char is_two);
int  Push_Card(int row,int Card_Pos,int player,int is_see);
int  Cut(int Card_Pos);
int  Insure(int Score,int Bet_Score);
int  Host_Play(int row,int No_See_Card,int Point,int have_a);
int  Bet_Dou(int Bet_Score,int Score,int row,int Card_Pos,int Point,int have_a);
int  Dou_Card(int First_Card,int Sec_Card,int Score,int Bet_Score);
void Lost(void);
void Win(void);
void Peace(void);
int  Dou_Play(char is_click);
void Out(void);
void Win1(char i);
void Lost1(char i);
void Peace1(char i);
void Wait(void);
void King(void);


Bmp256  FA[13],HE[13],HO[13],ME[13];
int main (void)
{
    int i;
    Init();

    FA[0]=LoadBMP("images\\cards\\FA1.bmp");FA[1]=LoadBMP("images\\cards\\FA2.bmp");FA[2]=LoadBMP("images\\cards\\FA3.bmp");
    FA[3]=LoadBMP("images\\cards\\FA4.bmp");FA[4]=LoadBMP("images\\cards\\FA5.bmp");FA[5]=LoadBMP("images\\cards\\FA6.bmp");
    FA[6]=LoadBMP("images\\cards\\FA7.bmp");FA[7]=LoadBMP("images\\cards\\FA8.bmp");FA[8]=LoadBMP("images\\cards\\FA9.bmp");
    FA[9]=LoadBMP("images\\cards\\FA10.bmp");FA[10]=LoadBMP("images\\cards\\FA11.bmp");FA[11]=LoadBMP("images\\cards\\FA12.bmp");
    FA[12]=LoadBMP("images\\cards\\FA13.bmp");

    HE[0]=LoadBMP("images\\cards\\HE1.bmp");HE[1]=LoadBMP("images\\cards\\HE2.bmp");HE[2]=LoadBMP("images\\cards\\HE3.bmp");
    HE[3]=LoadBMP("images\\cards\\HE4.bmp");HE[4]=LoadBMP("images\\cards\\HE5.bmp");HE[5]=LoadBMP("images\\cards\\HE6.bmp");
    HE[6]=LoadBMP("images\\cards\\HE7.bmp");HE[7]=LoadBMP("images\\cards\\HE8.bmp");HE[8]=LoadBMP("images\\cards\\HE9.bmp");
    HE[9]=LoadBMP("images\\cards\\HE10.bmp");HE[10]=LoadBMP("images\\cards\\HE11.bmp");HE[11]=LoadBMP("images\\cards\\HE12.bmp");
    HE[12]=LoadBMP("images\\cards\\HE13.bmp");

    HO[0]=LoadBMP("images\\cards\\HO1.bmp");HO[1]=LoadBMP("images\\cards\\HO2.bmp");HO[2]=LoadBMP("images\\cards\\HO3.bmp");
    HO[3]=LoadBMP("images\\cards\\HO4.bmp");HO[4]=LoadBMP("images\\cards\\HO5.bmp");HO[5]=LoadBMP("images\\cards\\HO6.bmp");
    HO[6]=LoadBMP("images\\cards\\HO7.bmp");HO[7]=LoadBMP("images\\cards\\HO8.bmp");HO[8]=LoadBMP("images\\cards\\HO9.bmp");
    HO[9]=LoadBMP("images\\cards\\HO10.bmp");HO[10]=LoadBMP("images\\cards\\HO11.bmp");HO[11]=LoadBMP("images\\cards\\HO12.bmp");
    HO[12]=LoadBMP("images\\cards\\HO13.bmp");

    ME[0]=LoadBMP("images\\cards\\ME1.bmp");ME[1]=LoadBMP("images\\cards\\ME2.bmp");ME[2]=LoadBMP("images\\cards\\ME3.bmp");
    ME[3]=LoadBMP("images\\cards\\ME4.bmp");ME[4]=LoadBMP("images\\cards\\ME5.bmp");ME[5]=LoadBMP("images\\cards\\ME6.bmp");
    ME[6]=LoadBMP("images\\cards\\ME7.bmp");ME[7]=LoadBMP("images\\cards\\ME8.bmp");ME[8]=LoadBMP("images\\cards\\ME9.bmp");
    ME[9]=LoadBMP("images\\cards\\ME10.bmp");ME[10]=LoadBMP("images\\cards\\ME11.bmp");ME[11]=LoadBMP("images\\cards\\ME12.bmp");
    ME[12]=LoadBMP("images\\cards\\ME13.bmp");
    /*Logo();*/
    Menu();
    close256();
    return 0;
}
void Init(void)     /*256系统初始化*/
{
    init256(SINGLE_SURFACE);
    cls(0);

    initmouse();
   
}
void Logo (void)                       /*程序开始时显示LOGO*/
{

    Bmp256 logo1,logo2,logo3,*logo[3]; /*添加了一个图片,没记得更改它,结果……*/
    logo1=LoadBMP("images\\logo1.bmp");
    logo2=LoadBMP("images\\logo2.bmp");
    logo3=LoadBMP("images\\logo3.bmp");
    logo[0]=&logo1;logo[1]=&logo2;logo[2]=&logo3;
    TEXT_SIZE=TX_BIG;
    go_inout(0,5000,0);
    cls(0);
    PutImage(128,170,*logo[0],0);
    vpost();
    go_inout(0,5000,1);
    delay(50000);
    go_inout(0,5000,0);
    PutImage((640-logo[1]->width)/2,(480-logo[1]->height)/2,*logo[1],0);
    vpost();
    go_inout(0,5000,1);
    delay(50000);
    go_inout(0,5000,0);
    cls(0);
    PutImage((640-logo[2]->width)/2,(480-logo[2]->height)/2,*logo[2],0);
    vpost();
    go_inout(0,5000,1);
    delay(50000);

}

 

void Menu()
{
    int arrowypos=1;
    char key,is_on;
    char Text[5][12]={"1.单人游戏>","2.双人游戏>","3.操作说明>","4.游戏规则>","5.退出游戏>"};
    int i,j;
    static char curtype=1;
Menu:


    while(1)
    {
            hidemouse();   /*为加载新的鼠标,先隐藏*/
            setmmove(30,40,610,440); /*设置鼠标活动范围为Botton绘图之内*/
            Botton();    /*背景*/
            TEXT_SIZE=TX_BIG;
            puts256("21  点  游  戏",260,65,RED);
            puts256(Text[0],270,170,LIGHTBLUE);
            puts256(Text[1],270,170+40,LIGHTBLUE);
            puts256(Text[2],270,170+40+40,LIGHTBLUE);
            puts256(Text[3],270,170+40+40+40,LIGHTBLUE);
            puts256(Text[4],270,170+40+40+40+40,LIGHTBLUE);

            getmousexy();

            is_on=-1;
            for(i=0;i<5;i++)
            if (mouse.getx>=270&&mouse.getx<=371&&mouse.gety>=170+i*40&&mouse.gety<=191+i*40)
            {
                is_on=i;
                puts256(Text[i],270,170+i*40,MAGENTA);   /*鼠标移动上去变色*/
                line(270,189+i*40,365,189+i*40,BLUE);         /*鼠标下划线*/
                                                                                         /*判断鼠标位置*/
            }

            if (is_on>=0)
            {
                if(curtype)
                {
                    loadcursor(HAND_CURSOR);      /*加载3D光标*/
                    curtype=0;
                }
                if(getmkeyin(mbLeft)==mbLeft)
                    switch(is_on)
                    {
                        case 0:Sin_Game();continue;
                        case 1:Dou_Game();continue;
                        case 2:How_to();continue;
                        case 3:Help();continue;
                        case 4:;Quit();break;
                    }

            }
            else
            if(!curtype)
            {
                loadcursor(DEFAULT_CURSOR);    /*加载手型光标*/
                curtype=1;
            }
            showmouse();
            getmkeyin(mbLeft);   /*取走鼠标缓冲*/

            if(kbhit())
            {
            key=getch();
            if (0==key) continue;
            if(UP==key) {arrowypos--;if(arrowypos<1) arrowypos=5;}
            if(DOWN==key) {arrowypos++;if(arrowypos>5) arrowypos=1;}
            if(F1==key) {Help();goto Menu;}
            if(F2==key) {How_to();goto Menu;}
            if(ENTER==key)
            switch(arrowypos)
            {
                case 1:Sin_Game();continue;
                case 2:Dou_Game();continue;
                case 3:How_to();continue;
                case 4:Help();continue;
                case 5:key=ESC;Quit();continue;
            }
            switch(key)
            {
                case '1':Sin_Game();continue;
                case '2':Dou_Game();continue;
                case '3':How_to();continue;
                case '4':Help();continue;
                case '5':key=ESC;Quit();continue;
            }
            if (ESC==key) Quit();
            }
            


            bar(220,170+(arrowypos-1)*40,40,15,LIGHTGRAY);  /*清除选择箭头*/
            bar(220,170+(arrowypos-1)*40,40,15,LIGHTGRAY);
            rectangle(267,169+(arrowypos-1)*40,369,189+(arrowypos-1)*40,LIGHTGRAY);/*清除选择框*/


            line(270,189+i*40,369,185+i*40,LIGHTGRAY);  /*清除鼠标下划线*/

            puts256("-->",240,170+(arrowypos-1)*40,PINK);      /*画箭头*/
            rectangle(267,169+(arrowypos-1)*40,369,189+(arrowypos-1)*40,0);/*选择框*/

            vpost();
    }

}


void Sin_Game()  /********************单人游戏***************************/
{
    struct Player
    {
        int Score;
        int Point_Num;
        int have_a;

    };
    struct Player Player1,Player2,Player3;     /*Player3如果可以拆牌为玩家的第二手牌*/
    Bmp256 Back;

    int i;
    time_t t;
    int Card_Pos[53]={0};
    int temp,j,k;
    int temp1,temp2;
    char key;
    int Bet_Score;
    int Point_Num1,Point_Num2;
    char is_double;     /*是否可以拆牌*/
    int First_Card;
    int Sec_Card;
    char is_A;     /*是否可以保险*/
    int row1,row2,row3;
    int choose;
    int No_See_Card;   /*庄家第二张牌*/
    int Dec,Dec1;            /*玩家点数之差*/
    int State2;         /*庄家发第二张牌后状态*/
    char is_two;      /*是否为仅发了两张牌*/
    int State1;
    char is_click;  /*两付牌时第一付是否叫完牌*/
    char In;
    Back=LoadBMP("images\\Back.bmp");
    Player1.Score=10000;
    Player2.Score=1000;
Again:

    i=temp=j=k=temp1=temp2=0;is_double=is_A=0;
    Player1.have_a=0;Player2.have_a=0;
    Dec=0;State2=0;is_two=1;State1=0;
    Sec_Card=0;Dec1=0;
    Player1.Point_Num=0;
    Player2.Point_Num=0;

    setmmove(30,40,610,440);
    srand((unsigned) time(&t));
    for(i=1;i<=52;i++)    Card_Pos[i]=i;
    for(i=1;i<=1000;i++)
    {
        temp1=rand()%53;
        temp2=rand()%53;
        if(temp1!=0) j=temp1;
        if(temp2!=0) k=temp2;

        temp=Card_Pos[j];
        Card_Pos[j]=Card_Pos[k];
        Card_Pos[k]=temp;
    }                                  /*洗牌(利用随机产生的数字调换相应牌的位置)*/
    while(getmkeyin(mbRight)!=mbRight)
    {

        hidemouse();
        Botton();
        bar(30,40,580,410,BLACK);

        getmousexy();
                      /*PutImage(30,40,Back,0);  /*游戏中背景图片*/*/
        Bet_Score=Bet(Player2.Score);
        i=1;
        j=Card_Pos[i];
l1:     Player1.Point_Num=Push_Card(1,j,1,1);
        if(1==Cut(j)) {Player1.have_a=1;is_A=1;}        /*有"A"则标记,is_A可以保险,.have_a牌中有A*/

        if(1==is_A)
        {   
            In=Insure(Player2.Score,Bet_Score);

        }
        i++;
        j=Card_Pos[i];
l2:     Player2.Point_Num=Push_Card(1,j,2,1);
        if(1==Cut(j)) Player2.have_a=1;
        First_Card=Cut(j);          /*记录玩家第一张牌面,与下一张比较看是否相同*/
        i++;
        j=Card_Pos[i];  No_See_Card=j;/*记录庄家第二张牌*/

l1_2:   Player1.Point_Num+=Push_Card(2,j,1,0);    /*Push_Card参数:牌位置,牌面,玩家,是否显示*/
        if(1==is_A && (10==Cut(j)))
        {
            Push_Card(2,j,1,1);
            King();
            if(1==In) {Lost;goto Again;}
            else
            {
                Lost();
                Player2.Score-=Bet_Score;goto Again;
            }
        }                                    /*如果庄家开局获得黑杰克*/
        else
        if(1==In) Player2.Score-=Bet_Score/2;

        if(1==Cut(j)) Player1.have_a=1;
        i++;
        j=Card_Pos[i];

l2_2:   Player2.Point_Num+=Push_Card(2,j,2,1);
        if(1==First_Card && (10==Cut(j))) {King();Win();Player2.Score+=Bet_Score;goto Again;}/*如果玩家开局获得黑杰克*/
        if(1==Cut(j)) Player2.have_a=1;
        Sec_Card=Cut(j);
        if(First_Card==Sec_Card) is_double=1;        /*记录玩家前两张牌是否相同*/
        /*if(1==Player1.have_a)
        {
            if(Player1.Point_Num+10>21) printf256(100,100,RED,"%d",Player1.Point_Num);
            else printf256(100,100,RED,"%d或%d",Player1.Point_Num,Player1.Point_Num+10);
        }
        else printf256(100,100,RED,"%d",Player1.Point_Num);    */ /*显示庄家点数*/

        if(1==Player2.have_a)
        {
            if(Player2.Point_Num+10>21) printf256(100,300,RED,"%d",Player2.Point_Num);
            printf256(100,300,RED,"%d或%d",Player2.Point_Num,Player2.Point_Num+10);
        }
        else printf256(100,300,RED,"%d",Player2.Point_Num);

        i++;
        j=Card_Pos[i];                                                     /*以上为开始两张牌*/

 

        row1=3;row2=3;
        while(1)
        {

            choose=Play(is_double,is_two);           /*Play参数:牌面,是否可拆牌*/
            is_two=0;            /*1为可加注,第一次选择后置0不可加注*/
            is_double=0;
            switch (choose)
            {
                case 0:Player2.Point_Num+=Push_Card(row2,j,2,1);break;
Dou:            case 1:State2=Host_Play(row1,No_See_Card,Player1.Point_Num,Player1.have_a);break;  /*参数:位置,第二张牌,点数,是否有A*/
                case 2:State1=Bet_Dou(Bet_Score,Player2.Score,row2,j,Player2.Point_Num,Player2.have_a);break;  /*下注分数,玩家分数,位置,牌面,点数,是否有A*/
                case 3:Dou_Card(First_Card,Sec_Card,Player2.Score-Bet_Score*2,Bet_Score);break;
            }
            if(0==choose)
            {
                bar(100,300,46,16,BLACK);  /*清除显示点数*/
                if(1==Cut(j)) Player2.have_a=1;

                if(1==Player2.have_a)
                {
                    if(Player2.Point_Num+10>21) {Player2.have_a=0;printf256(100,300,RED,"%d",Player2.Point_Num);}
                    else printf256(100,300,RED,"%d或%d",Player2.Point_Num,Player2.Point_Num+10);
                }
                else printf256(100,300,RED,"%d",Player2.Point_Num);
                if(Player2.Point_Num>21) {Out();Lost();Player2.Score-=Bet_Score;goto Again;} /*玩家爆牌:输*/
            }
            if(1==choose)
            {

                if(State2>21) {Out();Win();Player2.Score+=Bet_Score;goto Again;}  /*庄家爆牌*/
                if(0==State2)   /*返回22说明需要继续发牌*/
                {
                    while(1)
                    {
                        Player1.Point_Num+=Push_Card(row1,j,1,1);
                        if(1==Cut(j)) Player1.have_a=1;
                        if(Player1.Point_Num>21) {Out();Win();Player2.Score+=Bet_Score;goto Again;}   /*庄家爆*/
                        if (1==Player1.have_a)
                        {
                            if(Player1.Point_Num+10>21) Player1.have_a=0;   /*如果再发一张牌超过21点则以一张A按1点计算*/
                            if(Player1.Point_Num+10>=17 && Player1.Point_Num+10<22) {Player1.Point_Num+=10;goto Compare;}
                        }
                        if (Player1.Point_Num>=17) goto Compare;

                        row1++;i++;j=Card_Pos[i];vpost();
                    }
                }
                if(State2>=17 && State2<=21) Player1.Point_Num=State2;
Compare:        if(1==Player2.have_a) Dec=Player1.Point_Num-Player2.Point_Num-10;
                else Dec=Player1.Point_Num-Player2.Point_Num;
                if(Dec>0)  {Lost();Player2.Score-=Bet_Score;goto Again;}      /*玩家牌面小于庄家:输*/
                if(0==Dec) {Peace();goto Again;}
                if(Dec<0)  {Win();Player2.Score+=Bet_Score;goto Again;}
            }
            if(2==choose)
            {
                Bet_Score*=2;
                if(0==State1) {Lost();Player2.Score-=Bet_Score;goto Again;}
                else {choose=1;Player2.Point_Num=State1;goto Dou;}
            }
            if(3==choose)
            {
                Player2.Point_Num=Player3.Point_Num=Cut(First_Card);
                if(1==Player2.have_a) Player3.have_a=1;
                row2=row3=2;
                is_click=0;
                while(1)
                {
                    choose=Dou_Play(is_click);
                    switch(choose)
                    {
                        case 0:Player2.Point_Num+=Push_Card(row2,j,2,1);row2++;i++;break;
Next:                   case 1:is_click=1;continue;
                        case 2:Player3.Point_Num+=Push_Card(row3,j,3,1);row3++;i++;break;
Host:                   case 3:choose=3;State2=Host_Play(row1,No_See_Card,Player1.Point_Num,Player1.have_a);break;
                    }
                    if(0==choose)
                    {
                        bar(100,300,46,16,BLACK);  /*清除显示点数*/
                        if(1==Cut(j)) Player2.have_a=1;

                        if(1==Player2.have_a)
                        {
                            if(Player2.Point_Num+10>21) {Player2.have_a=0;printf256(100,300,RED,"%d",Player2.Point_Num);}
                            else printf256(100,300,RED,"%d或%d",Player2.Point_Num,Player2.Point_Num+10);
                        }
                        else printf256(100,300,RED,"%d",Player2.Point_Num);
                        if(Player2.Point_Num>21) {Out();goto Next;} /*玩家第一付牌爆,继续下一付牌,Dec=1,*/
                    }
                    if(2==choose)
                    {
                        bar(340,100,46,16,BLACK);  /*清除显示点数*/
                        if(1==Cut(j)) Player3.have_a=1;

                        if(1==Player3.have_a)
                        {
                            if(Player3.Point_Num+10>21) {Player3.have_a=0;printf256(340,100,RED,"%d",Player3.Point_Num);}
                            else printf256(340,100,RED,"%d或%d",Player3.Point_Num,Player3.Point_Num+10);
                        }
                        else printf256(340,100,RED,"%d",Player3.Point_Num);
                        if(Player3.Point_Num>21)
                        {
                            if(Player2.Point_Num>21) {Lost1(1);Lost1(2);Out();Lost();Player2.Score-=Bet_Score*2;goto Again;}/*玩家两付牌全都爆则:输*/
                            else {Out();goto Host;} /*玩家第二付牌爆,庄家开牌*/
                        }
                    }
                    if(3==choose)
                    {
                        if(State2>21)
                        {
                            if(Player2.Point_Num>=State2 && Player2.Point_Num>21);
                            {
                                Lost1(1);Win1(2);Peace();
                                goto Again;
                            }
                            if(Player3.Point_Num>=State2 && Player3.Point_Num>21)
                            {
                                Win1(1);Lost1(2);Peace();
                                goto Again;
                            }

                            Win();Player2.Score+=Bet_Score*2;goto Again;

                        }  /*庄家爆牌*/
                        if(0==State2)   /*返回22说明需要继续发牌*/
                        {
                            while(1)
                            {
                                Player1.Point_Num+=Push_Card(row1,j,1,1);
                                if(1==Cut(j)) Player1.have_a=1;
                                if(Player1.Point_Num>21) {Win();Player2.Score+=Bet_Score*2;goto Again;}   /*庄家爆*/
                                if (1==Player1.have_a)
                                {
                                    if(Player1.Point_Num+10>21) Player1.have_a=0;   /*如果再发一张牌超过21点则以一张A按1点计算*/
                                    if(Player1.Point_Num+10>=17 && Player1.Point_Num+10<22) {Player1.Point_Num+=10;goto Compare;}
                                }
                                if (Player1.Point_Num>=17) goto Compare1;

                                row1++;i++;j=Card_Pos[i];vpost();
                            }
                        }
                        if(State2>=17 && State2<=21) Player1.Point_Num=State2;
Compare1:               if(Player2.Point_Num>21) Dec=1;
                        else
                        {
                            if(1==Player2.have_a) Dec=Player1.Point_Num-Player2.Point_Num-10;
                            else Dec=Player1.Point_Num-Player2.Point_Num;
                        }
                        if(Player3.Point_Num>21) Dec1=1;
                        else
                        {
                            if(1==Player3.have_a) Dec1=Player1.Point_Num-Player3.Point_Num-10;
                            else Dec1=Player1.Point_Num-Player3.Point_Num;
                        }
                        if(Dec>0)  {Lost1(1);Player2.Score-=Bet_Score;}      /*玩家牌面小于庄家:输*/
                        if(0==Dec)  Peace1(1);
                        if(Dec<0)  {Win1(1);Player2.Score+=Bet_Score;}

                        if(Dec1>0) {Lost1(2);Player2.Score-=Bet_Score;}
                        if(0==Dec1) Peace1(2);
                        if(Dec1<0)  {Win1(2);Player2.Score+=Bet_Score;}

                        if((0==Dec && 0==Dec1) || (Dec>0 && Dec1<0) || (Dec<0 && Dec1>0)) {Peace();goto Again;}
                        if(Dec>0 && Dec1>0) {Lost();goto Again;}
                        if(Dec1<0 && Dec1<0) {Win();goto Again;}

                    }/*3==choose end*/
                    j=Card_Pos[i];
                }/*while(1) end */
            }/*3==choose(Out) end*/
            row2++;i++;
            j=Card_Pos[i];
        }/*while(1) end */
    }/*while(mbRight) end  */

}
int Dou_Play(char is_click)                /*两付牌玩家开始操作*/
{
    char key;
    char is_on;
    char Text[3][5]={"继续","停牌","开牌"};
    static char curtype=1;
    int i,j=2;
    char arrowypos=1;

    bar(350,340,50,110,BLACK);vpost();
    while(1)
    {
        hidemouse();
        is_on=-1;
        TEXT_SIZE=TX_NORMAL;
        for(i=0;i<2;i++)
        {
            bar(356,348+i*25,40,17,ORANGE);
            rectangle(355,347+i*25,396,365+i*25,GREEN);
            rectangle(354,346+i*25,397,366+i*25,BROWN);


        }
        if(1==is_click)
        {
            puts256(Text[0],360,350,BLACK);

            puts256(Text[2],360,375,BLACK);

        }

        else {puts256(Text[0],360,350,BLACK);puts256(Text[1],360,375,BLACK);}
        getmousexy();
        i=0;
        if(1==is_click)
        {
            if(mouse.getx>=360 && mouse.getx<=392 && mouse.gety>=350 && mouse.gety<=376)
            {
                is_on=0;
                puts256(Text[0],360,350,2);
            }
            if(mouse.getx>=360 && mouse.getx<=392 && mouse.gety>=350+25 && mouse.gety<=376+25)
            {
                is_on=1;
                puts256(Text[2],360,350+25,2);
            }

        }
        else
        while(i<j)
        {
            if(mouse.getx>=360 && mouse.getx<=392 && mouse.gety>=350+25*i && mouse.gety<=376+25*i)
            {
                is_on=i;
                puts256(Text[i],360,350+i*25,2);
            }
            i++;
        }

        if (is_on>=0)
        {
            if(!curtype)
            {
                loadcursor(HAND_CURSOR);      /*加载3D光标*/
                curtype=1;
            }
            if(getmkeyin(mbLeft)==mbLeft)
            {
                if(1==is_click)
                {
                    switch(is_on)
                    {
                        case 0:return 2;
                        case 1:return 3;
                    }
                }
                else
                switch(is_on)
                {
                    case 0:return 0;
                    case 1:return 1;
                }

            }
        }
        else
        if(curtype)
        {
            loadcursor(DEFAULT_CURSOR);    /*加载手型光标*/
            curtype=0;
        }
        if(kbhit())
        {
            key=getch();
            if (0==key) continue;
            if(UP==key) {if(arrowypos>1) arrowypos--;}
            if(DOWN==key) {if(arrowypos<j) arrowypos++;}
            if(F1==key) Help();
            if(F2==key) How_to();
            if(ENTER==key)
            if(1==is_click)
            {
                switch(arrowypos)
                {
                    case 1:return 2;
                    case 2:return 3;
                }
            }
            else
            switch(arrowypos)
            {
                case 1:return 0;
                case 2:return 1;
            }


        }
        if(3==arrowypos) bar(330,350+25,24,13,BLACK);
        else
        {
        bar(330,350+arrowypos*25,24,13,BLACK);
        bar(330,350+(arrowypos-2)*25,24,13,BLACK);
        }
        puts256("-->",330,350+(arrowypos-1)*25,BROWN);
        showmouse();
        getmkeyin(mbLeft);
        vpost();
    }

}
int Host_Play(int row,int No_See_Card,int Point,int have_a)   /*开牌,庄家亮出底牌*/
{
    while(1)
    {
        Push_Card(row-1,No_See_Card,1,1);
        if(Point>21) return Point;   /*如果庄家爆牌则返回爆牌点数*/
        if (1==have_a)
        {

            if(Point+10>=17) return Point+10;
        }
        if (Point>=17) return Point;
        else return 0;/*如果需要继续发牌则返回特殊值0*/
    }
}
int Bet_Dou(int Bet_Score,int Score,int row,int Card_Pos,int Point,int have_a)
{
    bar(570,420,30,14,BLACK); /*清除原显示余额*/
    bar(300,300,20,10,BLACK);  /*清除原显示赌注*/
    printf256(300,300,BLUE,"%d",Bet_Score*2);
    printf256(570,420,RED,"%d",Score-Bet_Score*2);
    Point+=Push_Card(row,Card_Pos,2,1);
    if(1==Cut(Card_Pos)) have_a=1;
    if(Point>21) return 0;      /*如果玩家爆牌返回特殊值*/

    if(1==have_a)
    {
        if(Point+10>21) {bar(100,300,46,16,BLACK);printf256(100,300,RED,"%d",Point);return Point;}
        else {bar(100,300,46,16,BLACK);printf256(100,300,RED,"%d",Point);return Point+10;}
    }
    else {bar(100,300,46,16,BLACK);printf256(100,300,RED,"%d",Point);return Point;}

}
int Dou_Card(int First_Card,int Sec_Card,int Score,int Bet_Score)         /*玩家两付牌开始,两付牌显示初始化*/
{
    bar(100,350,117,96,BLACK);  /*清除玩家前两张牌的显示*/
    Push_Card(1,First_Card,2,1);
    bar(100,300,46,16,BLACK);/*清除显示点数*/
    bar(570,420,30,14,BLACK);/*清除余额显示*/
    printf256(100,300,RED,"%d",Cut(First_Card));
    Push_Card(1,Sec_Card,3,1);
    printf256(340,100,RED,"%d",Cut(First_Card));  /*第二付牌点数显示*/

    printf256(570,420,RED,"%d",Score);
    bar(300,300,20,10,BLACK);     /*清除原显示赌注*/
    printf256(300,300,BLUE,"%d",Bet_Score*2);
    return 0;
}

int Insure(int Score,int Bet_Score)            /*************保险**************/
{
    char key;
    int i;
    char is_on;
    static char curtype=1;
    char Text1[2][5]={"是 Y","否 N"};

    while(1)
    {
    hidemouse();
    is_on=-1;


    bar(220,210,190,45,244);
    bar(225,215,180,35,170);
    puts256("保  险",280,222,2);
    TEXT_SIZE=TX_BIG;
    puts256(Text1[0],225,222,1);
    puts256(Text1[1],360,222,1);
    setmmove(220,210,410,250);      /*设置鼠标的活动范围为菜单对话框*/
    getmousexy();
    for(i=0;i<2;i++)
    {
        if(mouse.getx>=225+i*142 && mouse.getx<=255+i*142 && mouse.gety>=222 && mouse.gety<=236)
        {
            is_on=i;
            puts256(Text1[i],225+i*135,222,RED);

        }

    }
    if (is_on>=0)
    {
        if(!curtype)
        {
            loadcursor(HAND_CURSOR);      /*加载3D光标*/
            curtype=1;
        }
        if(getmkeyin(mbLeft)==mbLeft)
        {

            if(0==is_on)
            {
                setmmove(30,40,610,440);
                bar(570,420,30,14,BLACK);/*清除余额显示*/
                printf256(570,420,RED,"%d",Score-Bet_Score);
                bar(220,210,190,45,BLACK);
                return 1;
            }
            if(1==is_on)
            {
                setmmove(30,40,610,440);
                bar(220,210,190,45,BLACK);
                return 0;
            }


        }


    }
    else
    if(curtype)
    {
        loadcursor(DEFAULT_CURSOR);    /*加载手型光标*/
        curtype=0;
    }
    if(kbhit())
    {
        key=getche();
        if ('y'==key || 'Y'==key) {setmmove(30,40,610,440);bar(220,210,190,45,BLACK);bar(570,420,30,14,BLACK);printf256(570,420,RED,"%d",Score-Bet_Score/2);return 1;}
        if ('n'==key || 'N'==key) {setmmove(30,40,610,440);bar(220,210,190,45,BLACK);return 0;}

    }

    showmouse();
    getmkeyin(mbLeft);
    vpost();
    }
}
int Play(char is_double,char is_two)                /*玩家开始操作*/
{
    char key;
    char is_on;
    char Text[4][5]={"继续","开牌","加注","拆牌"};
    static char curtype=1;
    int i,j=3;
    int Cant=2;  /*置为加注项*/
    char arrowypos=1;


    while(1)
    {
        hidemouse();
        is_on=-1;
        TEXT_SIZE=TX_NORMAL;
        for(i=0;i<4;i++)
        {
            bar(356,348+i*25,40,17,ORANGE);
            rectangle(355,347+i*25,396,365+i*25,GREEN);
            rectangle(354,346+i*25,397,366+i*25,BROWN);


        }
        puts256(Text[0],360,350,BLACK);
        puts256(Text[1],360,375,BLACK);
        puts256(Text[2],360,400,BLACK);
        puts256(Text[3],360,425,BLACK);

        getmousexy();
        i=0;
        if(1==is_double) j=4; /*如果可以拆牌且为第一次选择则全部选项可以点击*/
        if(1==is_two) Cant=10;
        while(i<j)
        {
            if(i!=Cant)
            {
                if(mouse.getx>=360 && mouse.getx<=392 && mouse.gety>=350+25*i && mouse.gety<=376+25*i)
                {
                    is_on=i;
                    puts256(Text[i],360,350+i*25,2);
                }
            }
            i++;
        }
        if (is_on>=0)
        {
            if(!curtype)
            {
                loadcursor(HAND_CURSOR);      /*加载3D光标*/
                curtype=1;
            }
            if(getmkeyin(mbLeft)==mbLeft)
            {
                switch(is_on)
                {
                    case 0:return 0;
                    case 1:return 1;
                    case 2:return 2;
                    case 3:return 3;
                }

            }
        }
        else
        if(curtype)
        {
            loadcursor(DEFAULT_CURSOR);    /*加载手型光标*/
            curtype=0;
        }
        if(kbhit())
        {
            key=getch();
            if (0==key) continue;
            if(UP==key) {if(arrowypos>1) arrowypos--;}
            if(DOWN==key) {if(arrowypos<j) arrowypos++;}
            if(arrowypos-1==Cant) arrowypos=1;

            if(F1==key) Help();
            if(F2==key) How_to();
            if(ENTER==key)
            switch(arrowypos)
            {
                case 1:return 0;
                case 2:return 1;
                case 3:return 2;
                case 4:return 3;
            }


        }
        if(j==arrowypos) bar(330,350+25*(j-2),24,13,BLACK);
        else
        {
        bar(330,350+arrowypos*25,24,13,BLACK);
        bar(330,350+(arrowypos-2)*25,24,13,BLACK);
        }
        puts256("-->",330,350+(arrowypos-1)*25,BROWN);
        showmouse();
        getmkeyin(mbLeft);
        vpost();
    }

}
int Push_Card(int row,int Card_Pos,int player,int is_see)     /*发牌,返回是否含有A牌*/
{
    Bmp256 Card[53];
    Bmp256 Back_Card;

    int i;
    int Pos;
    Back_Card=LoadBMP("images//BackCard.bmp");

    for(i=1;i<=13;i++)
    {
        Card[i]=FA[i-1];
        Card[i+13]=HE[i-1];
        Card[i+26]=HO[i-1];
        Card[i+39]=ME[i-1];        /*载入各花色牌*/
    }
    if(1==player)
    {
        if(1==is_see) {bar(100+row*20,150,71,96,BLACK);PutImage(100+row*20,150,Card[Card_Pos],0);vpost();delay(50000);}
        else {bar(100+row*20,150,71,96,BLACK);PutImage(100+row*20,150,Back_Card,0);vpost();delay(50000);}
    }                                                                                      /*bar函数清除要显示
                                                                                            *的区域,这样不会有                                                                                            *重影*/


    if(2==player)
    {
        if(1==is_see) {bar(100+row*20,350,71,96,BLACK);PutImage(100+row*20,350,Card[Card_Pos],0);vpost();delay(50000);}
        else {bar(100+row*20,350,71,96,BLACK);PutImage(100+row*50,350,Back_Card,0);}
    }
    if(3==player)
    {
        bar(390+row*20,150,71,96,BLACK);
        PutImage(390+row*20,150,Card[Card_Pos],0);
        vpost();delay(50000);
    }
    return Cut(Card_Pos);

 

}
int Cut(int Card_Pos)    /*计算点数,A按"1"计*/
{
    if(Card_Pos>39) Card_Pos=Card_Pos-39;
    if(Card_Pos>26) Card_Pos=Card_Pos-26;
    if(Card_Pos>13) Card_Pos=Card_Pos-13;
    if(Card_Pos>10) return 10;
    return Card_Pos;
}
int Bet(int Score)    /**********************下注**********************************/
{
    Bmp256 Left;
    Bmp256 Right;
    char key;
    char is_on;
    static char curtype=1;
    int arrowstep=0;
    int bet_step[10]={10,20,30,40,50,60,70,80,90,100};
    Left=LoadBMP("images//Left.bmp");
    Right=LoadBMP("images//Right.bmp");

    while(1)
    {

    is_on=-1;
    TEXT_SIZE=TX_NORMAL;
    hidemouse();
    bar(30,40,580,410,BLACK);

 

    puts256("余额:",530,420,RED);
    rectangle(448,338,496,358,BROWN);
    rectangle(449,339,495,357,GREEN); /*"下注"字样边框*/
    bar(450,340,45,17,ORANGE);
    puts256("下 注",452,342,2);
    printf256(570,420,RED,"%d",Score-bet_step[arrowstep]);
    getmousexy();

 

    if(mouse.getx>=490 && mouse.getx<=514 && mouse.gety>=376 && mouse.gety<=400) is_on=0;

    if(mouse.getx>=530 && mouse.getx<=554 && mouse.gety>=376 && mouse.gety<=400) is_on=1;

    if(mouse.getx>=450 && mouse.getx<=484 && mouse.gety>=340 && mouse.gety<=354)
    {
        is_on=2;
        puts256("下 注",452,342,BLACK);
    }
    if (is_on>=0)
    {
        if(!curtype)
        {
            loadcursor(HAND_CURSOR);      /*加载3D光标*/
            curtype=1;
        }
        if(getmkeyin(mbLeft)==mbLeft)
        {
            switch(is_on)
            {
                case 0:bar(460,380,16,14,BLACK);bar(570,420,30,14,BLACK);arrowstep--;break;
                case 1:bar(460,380,16,14,BLACK);bar(570,420,30,14,BLACK);arrowstep++;break;
                case 2:printf256(300,300,BLUE,"%d",bet_step[arrowstep]);return bet_step[arrowstep]; /*按下下注以后返回赌注值*/

            }
            if(arrowstep>9) arrowstep=0;
            if(arrowstep<0) arrowstep=9;
         }
    }
    else
    if(curtype)
    {
        loadcursor(DEFAULT_CURSOR);    /*加载手型光标*/
        curtype=0;
    }
    if(kbhit())
    {
        key=getch();
        if (0==key) continue;
        if(UP==key) {bar(460,380,16,14,BLACK);bar(570,420,30,14,BLACK);arrowstep++;}
        if(DOWN==key) {bar(460,380,16,14,BLACK);bar(570,420,30,14,BLACK);arrowstep--;}
        if(LEFT==key) {bar(460,380,16,14,BLACK);bar(570,420,30,14,BLACK);arrowstep--;}
        if(RIGHT==key) {bar(460,380,16,14,BLACK);bar(570,420,30,14,BLACK);arrowstep++;}
        if(F1==key) Help();
        if(F2==key) How_to();
        if(ENTER==key || 'b'==key || 'B'==key)  {printf256(300,300,BLUE,"%d",bet_step[arrowstep]);return bet_step[arrowstep];}

        if (ESC==key) Quit();
        if(arrowstep>9) arrowstep=0;
        if(arrowstep<0) arrowstep=9;
    }

    printf256(460,380,2,"%3d",bet_step[arrowstep]);

    PutImage(490,376,Left,0);
    PutImage(530,376,Right,0);
    showmouse();
    getmkeyin(mbLeft);   /*取走鼠标缓冲*/
    vpost();

    }
}
void Lost(void)
{
    bar(220,210,160,45,244);
    bar(225,215,150,35,170);
    puts256("您输了!",260,222,2);
    vpost();
    Wait();
}


void Win(void)
{
    bar(220,210,160,45,244);
    bar(225,215,150,35,170);
    puts256("您胜利了!",260,222,2);
    vpost();
    Wait();
}
void Peace(void)
{
    bar(220,210,160,45,244);
    bar(225,215,150,35,170);
    puts256("平局",285,222,2);
    vpost();
    Wait();
}
void King(void)
{
    bar(220,210,160,45,244);
    bar(225,215,150,35,170);
    puts256("获得黑杰克",260,222,2);
    vpost();
    Wait();
}
void Out(void)  /*爆牌退出对话框*/
{
    char key;
    bar(260,210,100,45,244);
    bar(265,215,90,35,170);
    TEXT_SIZE=TX_BIG;
    puts256("爆牌",295,222,3);
    vpost();
    Wait();
    bar(260,210,100,45,BLACK);

}
void Win1(char i)
{
    if(1==i) {puts256("第一付牌赢",150,300,RED);vpost();}
    else {puts256("第二付牌赢",390,100,RED);vpost();}
    
}
void Lost1(char i)
{
    if(1==i) {puts256("第一付牌输",150,300,RED);vpost();}
    else {puts256("第二付牌输",390,100,RED);vpost();}
    
}
void Peace1(char i)
{
    if(1==i) {puts256("第一付牌和",150,300,RED);vpost();}
    else {puts256("第二付牌和",390,100,RED);vpost();}
}
void Dou_Game()
{

    Bmp256 Back_Card;
    Botton();
    Back_Card=LoadBMP("images//BackCard.bmp");
    TEXT_SIZE=TX_BIG;
    puts256("Just a Joke !",300,120,RED);
    TEXT_SIZE=TX_NORMAL;
    puts256("也不想想啊,两个人怎么玩啊,那底牌不是都看到了吗?",120,200,RED);
    vpost();
    getche();
}

void Help()   /*二十一点游戏规则*/
{
    int i;
    char key;

    while(1)
    {
    hidemouse();
    loadcursor(DEFAULT_CURSOR);

    Botton();
    puts256("21点游戏规则",250,80,0);
    TEXT_SIZE=TX_NORMAL;

    puts256("计  点:花牌(K,Q,J)和10都计算为10点,A牌可作1或11点计,其它牌则按照牌面",58,120,3);
    puts256("       上的点数计算.",58,120+25,3);
    puts256("黑杰克:起手牌为A+（10 或 J 或 Q 或 K）=黑杰克",58,120+25*2,3);

    puts256("加  注:玩家在获发两张牌后,可选择加倍投注,但要牌方面,则只能多要一张牌",58,120+25*4,3);
    puts256("       后便必须停牌",58,120+25*5,3);
    puts256("分  牌:如玩家最初获发的两张牌是一对的,便可分牌成为两手牌, 而新增的一",58,120+25*6,3);
    puts256("       手牌的投注金,将与原投注金一样",58,120+25*7,3);
    puts256("保  险:当庄家反开的牌是A牌时，玩家便有权选择投注在保险上, 只要庄家获",58,120+25*8,3);
    puts256("       得黑杰克时，玩家便可赢取保险投注金的双倍奖金",58,120+25*9,3);
    puts256("计  点:",58,120,RED);
    puts256("黑杰克:",58,120+25*2,RED);
    puts256("加  注:",58,120+25*4,RED);
    puts256("分  牌:",58,120+25*6,RED);
    puts256("保  险:",58,120+25*8,RED);
    puts256("ESC或鼠标右键退出",250,430,BROWN);
    if(getmkeyin(mbRight)==mbRight) break;

    if(kbhit())
    {
        key=getche();
        if(ESC==key) break;
    }

    showmouse();
    getmkeyin(mbLeft);    /*取走鼠标缓冲*/
    vpost();

    }
}

 

 


int Quit(void)   /*退出菜单询问*/
{
    char key;
    int i;
    char is_on;
    static char curtype=1;
    char Text1[2][5]={"是 Y","否 N"};

    while(1)
    {
    hidemouse();
    is_on=-1;
    Botton();
    bar(30,40,580,410,BLACK);
    bar(220,210,190,45,244);
    bar(225,215,180,35,170);
    puts256("退出游戏",280,222,2);
    TEXT_SIZE=TX_BIG;
    puts256(Text1[0],225,222,1);
    puts256(Text1[1],360,222,1);
    setmmove(220,210,410,250);      /*设置鼠标的活动范围为菜单对话框*/
    getmousexy();
    for(i=0;i<2;i++)
    {
        if(mouse.getx>=225+i*142 && mouse.getx<=255+i*142 && mouse.gety>=222 && mouse.gety<=236)
            {
                is_on=i;
                puts256(Text1[i],225+i*135,222,RED);

            }

    }
    if (is_on>=0)
    {
        if(!curtype)
        {
            loadcursor(HAND_CURSOR);      /*加载3D光标*/
            curtype=1;
        }
        if(getmkeyin(mbLeft)==mbLeft)
        switch(is_on)
            {
            case 0:exit(0);
            case 1:return 0;

            }   

    }
        else
        if(curtype)
            {
                loadcursor(DEFAULT_CURSOR);    /*加载手型光标*/
                curtype=0;
             }
    if(kbhit())
    {
        key=getche();
        if ('y'==key || 'Y'==key  || ESC==key) exit(0);
        if ('n'==key || 'N'==key) return 0;

    }

    showmouse();
    getmkeyin(mbLeft);
    vpost();
    }

}

void How_to(void)    /*操作说明*/
{
    int i;
    char key;
    while(1)
    {
    hidemouse();
    loadcursor(DEFAULT_CURSOR);
    Botton();
    puts256("操作说明",270,80,0);
    TEXT_SIZE=TX_NORMAL;
    puts256("<->本游戏全面支持键盘与鼠标同时操作",120,120,BROWN);
    puts256("<->ESC=退出 ETHER 进入 B 下注 F1 游戏规则 F2 操作说明",120,150,BROWN);
    puts256("<->方向键可以用来选择菜单,以及赌注增加或者减少",120,180,BROWN);
    puts256("<->进入相应的菜单也可以用键盘的数字键选择",120,210,BROWN);
    puts256("<->ESC或鼠标右键退出",250,430,BROWN);
    if(getmkeyin(mbRight)==mbRight) break;

    if(kbhit())
    {
        key=getche();
        if(ESC==key) break;
    }

    showmouse();
    getmkeyin(mbLeft);    /*取走鼠标缓冲*/
    vpost();

    }
}
void Botton()                    /*背景与边框*/
{
    cls(0);
    rectangle(15,25,610,440,0);
    bar(15,25,610,440,291);
    rectangle(20,30,600,430,256);
    bar(20,30,600,430,256);
    rectangle(25,35,590,420,1);
    bar(25,35,590,420,3);
    rectangle(30,40,580,410,3);
    bar(30,40,580,410,LIGHTGRAY);


}
void Wait(void)            /*爆牌,或者一局结束后等侍玩家确认*/
{
    char key;
    setmmove(220,210,380,255);
    while(1)
    {
    hidemouse();
    loadcursor(DEFAULT_CURSOR);
    if(getmkeyin(mbLeft)==mbLeft) break;

    if(kbhit())
    {
        key=getche();
        if(ENTER==key) break;
    }

    showmouse();
    getmkeyin(mbLeft);    /*取走鼠标缓冲*/
    vpost();

    }
}

