纸牌游戏梭哈设计制作(C语言)

纸牌游戏梭哈设计制作 (C语言)

我是编程爱好者。早期使用windows时就被扫雷游戏,钻石棋游戏,红心大战游戏迷住。相信大家也都玩过吧。在学习VB6编程时就编制过钻石棋和红心大战那样的纸牌游戏。都是标准Windows图形界面的。感兴趣的同好可参考我在同站上传的资源《纸牌游戏设计(VB6源码)》,其中有纸牌卡座制作和博眼子游戏。

前些天在本站发布了三款纸牌游戏《博眼子》《21点》《炸金花》。我再接再厉今天再与大家共享C语言的纸牌游戏《梭哈》。试编此游戏程序介绍一些界面设计方法和游戏设计各个功能的算法。代码中加了注释,也展示了算法的设计要点和算法检验以及程序调试方法与过程。

算法设计:52张牌面制作显示。洗牌,随机显示52张牌。牌序0到51换算为A234...到JQK。程序设计了漂亮友好的游戏界面。界面上纸牌显示圆角牌背牌面。界面提示文字显示。程序主要介绍了一些测试调试方法。代码中有详细注释。

下面是纸牌游戏设计的通用部分,其他纸牌游戏可通用功能函数:
drawcards ( ){  //  设计制作显示52张牌,

                        验牌测试     }
showcard ( ){   //  验牌测试,洗牌显示  
                          //  设计过程:画牌验牌洗牌测试用  }
shuffle_cards ( ){    //  洗牌设计       }
cardback (){    //发牌时隐藏牌面显示牌背图案    }
renewscreen (){      //画界面按钮   }

      程序界面美工方面的设计。全用简单的绘图语句写就。展示有魅力的界面。  

画出纸牌的设计是 transcards( ){.  }
transcards ( ){   //牌序号转为牌点和牌花色,画出牌张     }
print_t ( ){   //打印标题提示等文字,打印设置可重复使用。   //**  参数:位置 sx ,  sy,字串 t$,文字尺寸 tsize }

精彩的是比分大小算法 cal_score( ){.  }
程序提供了一个框架,VB , VC,  VS 或 JAVA  改写可作为参考。此样例可用 VB6 ,C++ ,  java  改写。

1b69e946afdf4fee9508e912072642a5.png

7f4292ddbf0e4070b7e0b62e82aacb8e.png 

 

//以下是源码:
//********************************************
//*    纸牌游戏《梭哈》  Version   1.1.0        *
//*     Five  Card  Stud    (  沙  蟹  )
//*    制作:张纯叔   ( micelu@126.com )    *
//********************************************
Canvas cs ;       //画布
string sBarDes[10];
int nBarId[10];
string sMenu[50];
int nMenu[50];
float src[4];  //ClearDraw (cls) clear screen
string s,ss ;          //print text
string ss0,ss1,ss2,ss3,ss4,ss5;      //print text
int sx,sy,dx,dy,px,py;      //draw
int i,j,n,t,k;    //t = times
int num,num1 ;      //select card number
int pn ;        //发牌计数
int pnum[54];    //洗牌后的牌序列
int cardnum,cardstyle;   //牌点牌花色
string cas1,cas2,cas4;   //牌点牌花色图案$
string cas3,cas5 ;            //牌背花色, 下注图案
double Rn;    //random 洗牌
string t$;     //提示文字
int tsize;      //textsize
int users1,users2,users3;  //东北西玩家分数
int bankers ;      //庄家分数 score
 int bs,us1,us2,us3 ;   //计算分数 banker & users
int zf1,zf2,zf3,zf4 ;   //计算庄家zf1胜负分数
int c1,c2,c3,c4,c5 ;      //calculate score
 int c1s,c2s,c3s,c4s,c5s ;      //calculate score
 int b1,b2,b3,b4,b5 ;    //庄家和玩家都杂牌时比大小
 int b1s,b2s,b3s,b4s,b5s ; //玩家都杂牌时比大小
int csh1,csh2,csh3,csh4,csh5 ;   //玩家5张牌花色
int bf1,bf2 ;   //计算分数比大小
int cc[5] ;       //计算比分排序
int temp ;     //排序
int spn[5];     //user south 牌序列
int epn[5];     //user east   牌序列
int npn[5];     //user north 牌序列
int wpn[5];    //user west  牌序列
int nn,wn,sn,en ;    //北西南东牌序号
int gscore ;    //输入c1c2c3计算return各家分数
int bet ;          //赌注,预设10,20,30
int zu1,zu2,zu3,zu4 ;    //北西南东下注数
int wnum ;  //庄家和3玩家id切换,1,   2,3 4
int isdo;       //1 可发牌翻牌可计算分,0 不可
int context;    //canvasProc  手机触屏
int obj;
int id;
int event;      //canvasProc

main(){
setDisplay(1);
  cs.SetBackground(205,205,205);
  cs.Active();
  cs.SetProc (context, mycanvasProc);
   sBarDes[0]=" 开    局 ";
   nBarId[0]=100;
   sBarDes[1]=" 发    牌 ";
   nBarId[1]=101;
   sBarDes[2]="切换玩家";
   nBarId[2]=102;
   sBarDes[3]="加注跟注";
   nBarId[3]=103;
   sBarDes[4]="退出程序";
   nBarId[4]=104;
   sBarDes[5]="V.";
   nBarId[5]=105;
   setToolBarHeight(6);
   setButtonTextSize(13);
   setToolBarBackgroundColor(255,192,192,192);
   setButtonColor(255,0,0,240);
   setButtonTextColor(255,255,255,0);
   setToolBar(100,myToolBarProc,sBarDes,nBarId,6);

   sMenu[0]="重新开始";
   nMenu[0]=200;
   sMenu[1]="测试:预设牌>翻牌>查看计分" ;
   nMenu[1]=201;
   sMenu[2]="  ";
   nMenu[2]=202;
   sMenu[3]="翻牌结算";
   nMenu[3]=203;
   sMenu[4]="测试 => 洗牌验牌";
   nMenu[4]=204;
   sMenu[5]="测试 => 查看计分";
   nMenu[5]=205;
   sMenu[6]="显示游戏主屏幕";
   nMenu[6]=206;
   sMenu[7]="退出";
   nMenu[7]=207;
   setMenu(200,myMenuProc,sMenu,nMenu,8);
  setTitle("纸牌游戏-梭哈   ");
//**********
      cas3="🐵";         //预设牌背图案
      cas4="🐒";         //预设牌面图案
      cas5="💸";         //预设下注图案
    bankers=5000;    //预定分数
      users1=5000;
      users2=5000;
      users3=5000;
      bet=10 ;    wnum=0 ;
      isdo=1 ;
      drawcover ();
 while (){}
  }//main ()

drawcover (){     // 画启动界面封面版本号
    cs.SetColor (255,0,120,0);  //back color
     cs.DrawRect (2,2,718,900);
     cs.SetColor (255,0,180,0);
     cs.DrawRect (50,320,650,326);
     cs.SetColor (255,250,0,0);
     cs.DrawRect (52,322,648,324);
   px=260;    py=100;   //A
        num=22 ;     c1=num ;
        transcards ();
    px=330;    py=80;   //K
        num=23;    c2=num ;
        transcards ();
     px=400;    py=60;   //Q
        num=24;    c2=num ;
        transcards ();
     px=470;    py=90;   //J
        num=25;    c2=num ;
        transcards ();
     px=540;    py=120;   //10
        num=13;    c2=num ;
        transcards ();
     t$=cas4 ;
     sx=450;   sy=350;    tsize=120;
     print_t ();
     t$="纸牌游戏" ;
     sx=100;   sy=160;   tsize=60;
     print_t ();
     t$="梭  哈" ;
     sx=120;   sy=260;   tsize=80;
     print_t ();
     t$="欢迎加入纸牌游戏团" ;
     sx=135;   sy=440;   tsize=50;
     print_t1 ();
     ss="Copyright  v.1.1.0   micelu@126.com ";
     cs.SetTextSize (22);
     cs.SetColor (255,250,250,250);
     cs.DrawText (ss,50,360);      
     renewscreen () ;
     cs.Update ();
     isdo=0 ;
 }//drawcover ()

664f0e368bc14890a707b39e74f6c093.png

38da61d9fd7940bebe0b89e18b76dfcf.png 

 

mycanvasProc (int context,int obj,int id,int event,float x,float y){
   //  cs.SetFillMode(0);//0不填色,1填色,调试
    //     cs.SetColor (255,250,50,0);  
   // cs.DrawRect (180,640,550,850);  //南
  //  cs.DrawRect (180,30,550,240);  //北
   // cs.DrawRect (430,310,710,520); //东
   // cs.DrawRect (20,310,290,520);  //西
//     cs.DrawRect (560,720,710,800);
    // cs.DrawRect (560,820,710,900);
    // cs.DrawRect (560,920,710,1000);

    // cs.DrawRect (30,890,150,1010);
     //cs.DrawRect (180,890,300,1010);
     // cs.DrawRect (330,890,450,1010);
    //  cs.Update ();

//纸牌区域点击切换玩家
    if (x>180&&x<550&&y>30&&y<240){
          wnum=0 ;    change_id () ;   }    //北
    if (x>20&&x<290&&y>310&&y<520){
          wnum=1 ;    change_id () ;   }    //西
    if (x>180&&x<550&&y>640&&y<850){
          wnum=2 ;    change_id () ;   }    //南
    if (x>430&&x<710&&y>310&&y<520){
          wnum=3 ;    change_id () ;   }    //东

 //**** button 1 - 6 **** test  用于调试
    if (x>560&&x<710&&y>720&&y<800){  
              watch () ;        }        //看牌
    if (x>560&&x<710&&y>820&&y<900){
                      }      //盖牌暂未设置
    if (x>560&&x<710&&y>920&&y<1000){
             result () ;          }       //翻牌结算

     //****  下注预设 10,20,30 三种分值
    if (x>30&&x<150&&y>890&&y<1010) {
             bet=10 ;    putbet () ;         }
    if (x>180&&x<300&&y>890&&y<1010) {
             bet=20 ;    putbet () ;         }
    if (x>330&&x<450&&y>890&&y<1010) {
             bet=30 ;    putbet () ;         }
}//mycanvasProc ()

watch (){    //看牌  显示牌面
 // if (wnum==1) {   //看牌   庄家牌不可看
   //px=180;    py=120;   //北家  
    // for (i=0;i<=nn;i++){
    //    px=i*60+180 ;
       // num=npn[i];
        //transcards ();      }  //看牌   庄家牌不可看
      //   sleep (500) ; 
       // num=npn[0];
       //  px=180 ;
        // cardback ();     
  //  for (i=1; i<=nn;i++){    //复原
       // px=i*60+180 ;
      //  num=npn[i];
        //transcards ();      }
          //      }     

  if (wnum==2) {
   px=5;    py=340;   //西家  
     for (i=0;i<=wn;i++){
        px=i*40+5 ;
        num=wpn[i];
        transcards ();      }  //看牌
         sleep (500) ; 
         num=epn[0];
         px=5 ;
         cardback ();     
    for (i=1; i<=wn;i++){    //复原
        px=i*40+5 ;
        num=wpn[i];
        transcards ();      }
                }   
   
   if (wnum==3) {
        px=180;    py=670;   //南家 
    for (i=0;i<=sn;i++){
        px=i*60+180 ;
        num=spn[i];
        transcards ();      }  //看牌
             sleep (500) ; 
         num=spn[0];
         px=180 ;
         cardback ();     
    for (i=1; i<=sn;i++){    //复原
          px=i*60+180 ;
          num=spn[i];
          transcards ();      }
                }   

   if (wnum==4) {
    px=435;    py=340;   //东家  
     for (i=0;i<=en;i++){
        px=i*40+435 ;
        num=epn[i];
        transcards ();      }  //看牌
         sleep (500) ; 
         num=epn[0];
         px=435 ;
         cardback ();     
    for (i=1; i<=en;i++){    //复原
        px=i*40+435 ;
        num=epn[i];
        transcards ();      }
                }   
}//watch ()

putbet (){    //下注   
    // 屏幕点击筹码显示下注数
     cs.SetColor (255,0,150,0);  //clear text
     cs.DrawRect (2,805,140,870);
     cs.DrawCircle (140,838,32);
     ss=intToString(bet) ;
     t$= cas5+"   "+ss ;
     sx=20;   sy=850;   tsize=40;
     print_t ();
     cs.Update ();
}//putbet ()

add_bet (){    //玩家加注,北西南东,限注90分
      if (wnum==1){
              zu1=zu1+bet ;
              if (zu1>90) zu1=90 ;    }
      if (wnum==2){
              zu2=zu2+bet ;    
             if (zu2>90) zu2=90 ;    }
      if (wnum==3){
              zu3=zu3+bet ;    
              if (zu3>90) zu3=90 ;    }
     if (wnum==4){
              zu4=zu4+bet ;    
              if (zu4>90) zu4=90 ;    }
    cs.SetColor (255,0,120,0);  //clear text
     cs.DrawRect (250,20,550,70);
     cs.DrawRect (20,480,700,530);
     cs.DrawRect (250,810,550,860);
 //*******显示"庄家"...文字及分数和下注数
         ss=intToString (bankers);
         s=intToString (zu1);
     t$="庄家 "+"  "+ss +"  "+s;    //北家
     sx=235;   sy=60;   tsize=40;
     print_t ();
  
        ss=intToString (users3);
        s=intToString (zu2);
      t$="西家 "+"  "+ss+"  "+s  ;
      sx=20;   sy=520;    tsize=40;
      print_t ();

         ss=intToString (users2);
         s=intToString (zu3);
      t$="南家 "+"  "+ss+"  "+s ;
      sx=235;   sy=850;    tsize=40;
      print_t ();

      t$="东家 " ;
      sx=620;   sy=520;    tsize=40;
      print_t ();
         ss=intToString (users1);
         s=intToString (zu4);
      t$=ss+"  "+s ;
      sx=440;   sy=520;    tsize=40;
      print_t ();

}//add_bet ()

renewscreen (){    
  //** draw interface 画界面按钮
   cs.SetStrokeWidth(1);//画笔线宽
   cs.SetFillMode (1);//0不填色,1填色
   px=700 ;   py=760 ;
   for (i=0;i<3;i++){     //cmd3p
   for (j=0;j<24;j++){
         cs.SetColor (255,255-j*8,255-j*5,255-j*7);   
         cs.DrawCircle (j*3+602,i*100+py+2,40);
            }   }
     cs.SetFillMode (0);//0不填色,1填色
  for (i=0;i<39;i++){    //彩球○
        cs.SetColor (255,255-i*2,255-i,255-i*2);
        cs.DrawCircle (px-30,py+2,i);  
        cs.DrawCircle (px-30,py+102,i);  
        cs.DrawCircle (px-30,py+202,i);  
                  }
 
  cs.SetFillMode (1);//0不填色,1填色
        t$="看牌" ;
     sx=590;   sy=py+15;    tsize=42;
     print_t1 ();
        t$="盖牌" ;
     sx=590;   sy=py+115;    tsize=42;
     print_t1 ();
        t$="翻牌" ;
     sx=590;   sy=py+215;    tsize=42;
     print_t1 ();

  // **** draw bet picecs  ****
   for (i=0;i<=2;i++){
         cs.SetColor (255,0,60,0);   
    cs.DrawCircle (i*150+92,952,62);
          cs.SetColor (255,250,180,30);   
    cs.DrawCircle (i*150+90,950,61);

        cs.SetColor (255,120,50,180);   
    cs.DrawCircle (i*150+90,950,60);
         cs.SetColor (255,250,220,30);   
    cs.DrawCircle (i*150+90,950,45);
         cs.SetColor (255,250,150,30);   
    cs.DrawCircle (i*150+91,951,45);
            }       
    cs.SetFillMode (0);//0不填色,1填色
        px=90 ;   py=950 ;
    for (i=0;i<44;i++){     //彩球○
      cs.SetColor (255,255-i*2,255-i*4,i*6);
      cs.DrawCircle (px,py,i);  
      cs.DrawCircle (px+150,py,i);  
      cs.DrawCircle (px+300,py,i);  
               }
 //预设下注额
  cs.SetFillMode (1);//0不填色,1填色
      t$="10" ;
     sx=56;   sy=970;    tsize=60;
     print_t ();
      t$="20" ;
     sx=206;   sy=970;    tsize=60;
     print_t ();
      t$="30" ;
     sx=356;   sy=970;    tsize=60;
     print_t ();
        cs.Update () ;
}//renewscreen ()

drawcards (){  //预制54张牌,验牌测试
//****  设计制作显示52张牌,调试
    cs.SetColor (255,0,120,0);  //back color
    cs.DrawRect (2,2,718,900);
      cs.SetTextStyle (1);
      t$="纸牌制作测试:画牌" ;
      sx=20;   sy=50;   tsize=30;
      print_t ();
   //**** 画牌 ********
   for (i=0;i<=51;i++){
        px=(i-i/13*13)*48+15;
        py=i/13*170+100;
    //**** draw cards 圆角 ****
      cs.SetColor (255,0,0,70);  //黑色框线
      cs.DrawRect (px+10,py-30,px+109,py+122);
      cs.DrawRect (px,py-20,px+117,py+112);
      cs.DrawCircle (px+10,py-20,9);
      cs.DrawCircle (px+10,py+112,9);
      cs.DrawCircle (px+108,py+113,9);
      cs.DrawCircle (px+108,py-20,9);
      cs.SetColor (255,250,250,250);  //牌面白色
      cs.DrawRect (px+12,py-28,px+107,py+120);
      cs.DrawRect (px+2,py-18,px+115,py+111);
      cs.DrawCircle (px+12,py-19,9);
      cs.DrawCircle (px+12,py+111,9);
      cs.DrawCircle (px+106,py+111,9);
      cs.DrawCircle (px+106,py-19,9);
    //牌号 0 => 51 转为4花色 A 1234...JQK ****
        cardnum=(i-i/13*13)+1;
        cardstyle=i/13;
        cas1=intToString(cardnum);
        if(cardnum==1) cas1="A";
        if(cardnum==11) cas1="J";
        if(cardnum==12) cas1="Q";
        if(cardnum==13) cas1="K";
        if (cardstyle==0) cas2="♠";
        if (cardstyle==1) cas2="❤";
        if (cardstyle==2) cas2="♣";
        if (cardstyle==3) cas2="🔶";
       // print i," , ",cardnum," , ",cardstyle;   
       // print cas1+" "+ cas2;    //*** test ***
     if(cardstyle==0||cardstyle==2) {
            cs.SetColor (255,0,0,0);     }
     if(cardstyle==1||cardstyle==3) {
            cs.SetColor (255,250,0,0);      }
     n=0;
     if (cardnum==10) n=8;           
      cs.SetTextSize (30);
      cs.DrawText (cas1,px+15-n,py+1);
      cs.DrawText (cas2,px+8,py+35);      
      cs.SetTextSize (60);
      cs.DrawText (cas4,px+37,py+93);      
               }
      cs.Update ();
      setDisplay(1);
}//drawcards ()

showcard (){  //验牌测试,洗牌显示
//设计过程:画牌验牌洗牌测试用
    cs.SetColor (255,0,120,0);  //backcolor
    cs.DrawRect (2,2,718,900);
     cs.Update ();
   cs.SetFillMode (1);//0不填色,1填色
      cs.SetTextStyle (1);
      t$="纸牌制作测试:洗牌" ;
      sx=20;   sy=50;   tsize=30;
      print_t1 ();
     for (k=0;k<=51;k++){
        i=pnum[k];
        px=(k-k/13*13)*48+15;
        py=k/13*170+100;
    //**** draw cards 圆角 ****
      cs.SetColor (255,0,0,60);  //黑色框线
      cs.DrawRect (px+10,py-30,px+109,py+122);
      cs.DrawRect (px,py-20,px+117,py+112);
      cs.DrawCircle (px+10,py-20,9);
      cs.DrawCircle (px+10,py+112,9);
      cs.DrawCircle (px+108,py+113,9);
      cs.DrawCircle (px+108,py-20,9);
      cs.SetColor (255,250,250,250);  //牌面白色
      cs.DrawRect (px+12,py-28,px+107,py+120);
      cs.DrawRect (px+2,py-18,px+115,py+111);
      cs.DrawCircle (px+12,py-19,9);
      cs.DrawCircle (px+12,py+111,9);
      cs.DrawCircle (px+106,py+111,9);
      cs.DrawCircle (px+106,py-19,9);
    //牌号 0 => 51 转为4花色 A 1234...JQK ****
        cardnum=(i-i/13*13)+1;
        cardstyle=i/13;
        cas1=intToString(cardnum);
        if(cardnum==1) cas1="A";
        if(cardnum==11) cas1="J";
        if(cardnum==12) cas1="Q";
        if(cardnum==13) cas1="K";
        if (cardstyle==0) cas2="♠";
        if (cardstyle==1) cas2="❤";
        if (cardstyle==2) cas2="♣";
        if (cardstyle==3) cas2="🔶";
       // print i," , ",cardnum," , ",cardstyle;   
       // print cas1+" "+ cas2;    //*** test ***
     if(cardstyle==0||cardstyle==2) {
            cs.SetColor (255,0,0,0);     }
     if(cardstyle==1||cardstyle==3) {
            cs.SetColor (255,250,0,0);      }
     n=0;
     if (cardnum==10) n=8;           
      cs.SetTextSize (30);
      cs.DrawText (cas1,px+15-n,py+1);
      cs.DrawText (cas2,px+8,py+35);      
      cs.SetTextSize (60);
      cs.DrawText (cas4,px+37,py+93);      
              }
      cs.Update ();
 }//showcard ()

//纸牌序列:
//cardP num   0 to 12 黑桃 A234..JQK
//cardP num 13 to 25 红心 A234..JQK
//cardP num 26 to 38 梅花 A234..JQK
//cardP num 39 to 51 方块 A234..JQK
// VB6,VS2007 编程:设picturebox: 
// cardP(54)图片数组
// 图片高宽为单张纸牌图大小
// 预制扑克牌序列图片底图,程序启动时按序将
// 每单张图片BitBlt..SRCCOPY到图片数组,
// cardP (i)就是整付牌的图片,洗牌发牌都要用到。
// 本程序简化用 num 序号表示54张牌
//********************

e912370564d74c6a8e1616eb9b798d14.png

 

shuffle_cards (){    //洗牌设计
     cs.SetColor (255,0,120,0);   //backcolor
     cs.DrawRect (2,2,718,900);
     cs.Update ();
      for (i=0;i<=51;i++){ pnum[i]=-1 ;   }
      pn=0;    //发牌计数清0
//** 洗牌 **********************
   for (i=0;i<=51;i++){    //洗牌
      ResetPiece:        //已生成牌有相同则重新生成
      Rn=random()*52;       //随机洗牌
             num=(int )(Rn);
             pnum[i]=num ;
         for (k=0;k<i; k++){
         if (num==pnum[k]) goto ResetPiece ;        }
                    }
   for (k=0;k<=51;k++){  //显示牌背面图案
        px=(k-k/13*13)*48+15;
        py=k/13*170+100;
     //cardback ();  //洗牌后可显示牌背或不显示
                }
      cs.Update ();
   // showcard();  //用于洗牌查验测试,游戏时注释掉
 }//shuffle_cards ()

cardback (){   //draw cards back picture
//发牌时隐藏牌面显示牌背图案
     //**** draw cards 圆角 ****
      cs.SetColor (255,0,0,60);  //黑色框线
      cs.DrawRect (px+10,py-30,px+109,py+122);
      cs.DrawRect (px,py-20,px+117,py+112);
      cs.DrawCircle (px+10,py-20,9);
      cs.DrawCircle (px+10,py+112,9);
      cs.DrawCircle (px+108,py+113,9);
      cs.DrawCircle (px+108,py-20,9);
      cs.SetColor (255,0,150,150);  //牌背蓝色
      cs.DrawRect (px+12,py-28,px+107,py+120);
      cs.DrawRect (px+2,py-18,px+115,py+111);
      cs.DrawCircle (px+12,py-19,9);
      cs.DrawCircle (px+12,py+111,9);
      cs.DrawCircle (px+106,py+111,9);
      cs.DrawCircle (px+106,py-19,9);
     cs.SetTextSize(70);
      cs.DrawText (cas3,px+18,py+70);  //show 背花
      cs.Update ();
}//cardback ()

redeal (){    //游戏开始,发牌,重新发牌
 // 预设玩家4人,本游戏为4人博奕
      bankers=5000;
      users1=5000;
      users2=5000;
      users3=5000;
      bet=10 ;      putbet () ;    //显示底注和加注额
   pn=0 ;  //重新开始,发牌序数清 0 用于其他游戏
   for (i=0;i<5;i++){     //init
        npn[i]=-1 ;  wpn[i]=-1 ;  spn[i]=-1 ; epn[i]=-1 ; }
        nn=0 ; wn=0 ; sn=0 ; en=0 ; pn=0 ;
     cs.SetColor (255,0,120,0);  //back color
     cs.DrawRect (2,2,718,900);
     cs.Update ();
     t$="游戏开始 >>>       请下注" ;
     sx=50;   sy=50;    tsize=30;
     print_t ();
     renewscreen ();
     isdo=0 ;    //先开局后发牌
    // cs.Update ();
}//redeal ()

1671a81662684fc3a356377ce4c6e030.png

9b5b513dfab0481eacf5b16d2b7f8146.png 

 

transcards (){ 
 //传入 num 0-51转换为 cardnum, cardstyle
//牌序号转为牌点和牌花色,画出牌张
    //**** draw cards 圆角 ****
      cs.SetColor (255,0,0,60);  //黑色框线
      cs.DrawRect (px+10,py-30,px+109,py+122);
      cs.DrawRect (px,py-20,px+117,py+112);
      cs.DrawCircle (px+10,py-20,9);
      cs.DrawCircle (px+10,py+112,9);
      cs.DrawCircle (px+108,py+113,9);
      cs.DrawCircle (px+108,py-20,9);
      cs.SetColor (255,250,250,250);  //牌面白色
      cs.DrawRect (px+12,py-28,px+107,py+120);
      cs.DrawRect (px+2,py-18,px+115,py+111);
      cs.DrawCircle (px+12,py-19,9);
      cs.DrawCircle (px+12,py+111,9);
      cs.DrawCircle (px+106,py+111,9);
      cs.DrawCircle (px+106,py-19,9);
     //******* 画出牌面
        cardnum=(num-num/13*13)+1;
        cardstyle=num/13;
        cas1=intToString(cardnum);
        if(cardnum==1) cas1="A";
        if(cardnum==11) cas1="J";
        if(cardnum==12) cas1="Q";
        if(cardnum==13) cas1="K";
        if (cardstyle==0) cas2="♠";
        if (cardstyle==1) cas2="❤";
        if (cardstyle==2) cas2="♣";
        if (cardstyle==3) cas2="🔶";
     if(cardstyle==0||cardstyle==2) {
            cs.SetColor (255,0,0,0);     }
     if(cardstyle==1||cardstyle==3) {
            cs.SetColor (255,250,0,0);      }
     cs.SetTextSize (30);      //画纸牌花色
     n=0;
     if (cardnum==10) n=8;           
     cs.DrawText (cas1,px+15-n,py+2);
     cs.DrawText (cas2,px+8,py+35);                
      cs.SetTextSize (60);
     cs.DrawText (cas4,px+37,py+93);      
     cs.Update ();
}//transcards ()

change_id (){   //切换庄家和3玩家 id
     dx=360 ;  dy=380 ;
      cs.SetColor (255,0,160,0);   
           cs.DrawCircle (dx,dy,37);
      cs.SetColor (255,0,250,0);   
           cs.DrawCircle (dx,dy,23);
       cs.DrawCircle (dx,dy-30,15);
          cs.DrawCircle (dx-30,dy,15);
          cs.DrawCircle (dx,dy+30,15);
          cs.DrawCircle (dx+30,dy,15);
      wnum=wnum+1 ;
      if (wnum>4) wnum=1 ;
         cs.SetColor (255,250,0,0);   
      if (wnum==1){  //北
           cs.DrawCircle (dx,dy-35,9);     }
      if (wnum==2){   //西
           cs.DrawCircle (dx-35,dy,9);     }
      if (wnum==3){   //南
           cs.DrawCircle (dx,dy+35,9);     }
      if (wnum==4){   //东
           cs.DrawCircle (dx+35,dy,9);     }          
    cs.Update ();
}//change_id ()

gamestart (){   //游戏 ”梭哈”  >>> 开局发牌
         shuffle_cards () ;    //洗牌
         clearOutput();
          renewscreen ();    //画界面
          putbet () ;
 //游戏开局时先发2张牌,一暗一明,然后轮流下注
  for (i=0;i<3;i++){     //init 北西南东
        npn[i]=-1 ;  wpn[i]=-1 ;  spn[i]=-1 ; epn[i]=-1 ; }
   // 发牌时各家底注为 10
        zu1=10 ; zu2=10 ; zu3=10 ; zu4=10 ;
        wnum=1 ;    //开局预设东家
         change_id () ;
  //*******显示"庄家"...文字及分数和下注数
         ss=intToString (bankers);
         //s=intToString (zu1);
     t$="庄家 "+"  "+ss ;
     sx=235;   sy=60;   tsize=40;
     print_t ();

         ss=intToString (users3);
          s=intToString (zu4);
      t$="西家 "+"  "+ss+"  "+s  ;
      sx=20;   sy=520;    tsize=40;
      print_t ();

         ss=intToString (users2);
         s=intToString (zu3);
      t$="南家 "+"  "+ss+"  "+s ;
      sx=235;   sy=850;    tsize=40;
      print_t ();

       t$="东家 " ;
     sx=620;   sy=520;    tsize=40;
     print_t ();
         ss=intToString (users1);
         s=intToString (zu2);
      t$=ss+"  "+s ;
      sx=440;   sy=520;    tsize=40;
      print_t ();

//**** 发牌 >>  ** 发牌顺序 北西南东
//transcards (int num) 传入num=0--51显示牌面
        px=180;    py=120;   //北家  
        npn[0]=pnum[0];  
         num=npn[0];    nn=0 ;
        px=nn*60+180 ;
        cardback ();   
   sleep (500) ;
       px=5;    py=340;   //西家  
       wpn[0]=pnum[1];  
        num=wpn[0];    wn=0 ;
        px=wn*40+5 ;
        cardback ();    
   sleep (500) ;
        px=180;    py=670;   //南家 
        spn[0]=pnum[2];  
        num=spn[0];    sn=0 ;
        px=sn*60+180 ;
        cardback ();    
   sleep (500) ;
       px=435;    py=340;   //东家  
       epn[0]=pnum[3];  
       num=epn[0];    en=0 ;
        px=en*40+435 ;
        cardback ();    
   sleep (500) ;
        px=180;    py=120;   //北家  
        npn[1]=pnum[4];  
        num=npn[1];    nn=1 ;
        px=nn*60+180 ;
        transcards ();     
    sleep (500) ;
       px=5;    py=340;   //西家  
        wpn[1]=pnum[5];  
        num=wpn[1];    wn=1 ;
        px=wn*40+5 ;
        transcards ();      
   sleep (500) ;
        px=180;    py=670;   //南家 
        spn[1]=pnum[6];  
        num=spn[1];    sn=1 ;
        px=sn*60+180 ;
        transcards ();      
      sleep (500) ;
        px=435;    py=340;   //东家  
        epn[1]=pnum[7];  
        num=epn[1];    en=1 ;
        px=en*40+435 ;
        transcards ();      
        pn=7 ;    //已发8张牌
    isdo=1 ;      //开局后方可发牌 deal ()
}//gamestart ()

deal (){    //发牌:第3圈到第5圈,round 3-5
       if (isdo==0) return ;
       if (pn>15)  return ;    //5 圈共发牌20张
        pn=pn+1 ;  nn=nn+1 ;
        px=180;    py=120;   //北家  
        npn[nn]=pnum[pn];  
        num=npn[nn];  
        px=nn*60+180 ;
        transcards ();     
   sleep (500) ;
       pn=pn+1 ;  wn=wn+1 ;
       px=5;    py=340;   //西家  
        wpn[wn]=pnum[pn];  
        num=wpn[wn];  
        px=wn*40+5 ;
        transcards ();      
   sleep (500) ;
        pn=pn+1 ;  sn=sn+1 ;
        px=180;    py=670;   //南家 
        spn[sn]=pnum[pn];  
        num=spn[sn];  
        px=sn*60+180 ;
        transcards ();      
    sleep (500) ;
        pn=pn+1 ;  en=en+1 ;
        px=435;    py=340;   //东家  
        epn[en]=pnum[pn];  
        num=epn[en];  
        px=en*40+435 ;
        transcards ();      
        if (pn>19) isdo=1 ;   //5张牌发好启动计分 
}//deal ()

game3 (){   //预设5张牌用于测试计分
    //游戏制作完成后可删除
     cs.SetColor (255,0,120,0);   //backcolor
     cs.DrawRect (2,2,718,900);
         clearOutput();
         renewscreen ();    //画界面
         cs.Update ();
   for (i=0;i<3;i++){     //init 北西南东
        npn[i]=-1 ;  wpn[i]=-1 ;  spn[i]=-1 ; epn[i]=-1 ; }
  // 发牌时各家底注为 10
        zu1=10 ; zu2=10 ; zu3=10 ; zu4=10 ;
        wnum=1 ;    //开局预设东家
         change_id () ;
  //*******显示"庄家"...文字及分数和下注数
         ss=intToString (bankers);
        // s=intToString (zu1);
     t$="庄家 "+"  "+ss;
     sx=235;   sy=60;   tsize=40;
     print_t ();

         ss=intToString (users3);
          s=intToString (zu4);
      t$="西家 "+"  "+ss+"  "+s  ;
      sx=20;   sy=520;    tsize=40;
      print_t ();

         ss=intToString (users2);
         s=intToString (zu3);
      t$="南家 "+"  "+ss+"  "+s ;
      sx=235;   sy=850;    tsize=40;
      print_t ();

       t$="东家 " ;
     sx=620;   sy=520;    tsize=40;
     print_t ();
         ss=intToString (users1);
         s=intToString (zu2);
      t$=ss+"  "+s ;
      sx=440;   sy=520;    tsize=40;
      print_t ();

//**** 发牌 >> 排序 ** 发牌顺序 北西南东
     //北家发牌  ******     
           npn[0]=5; //pnum[0];  
           npn[1]=44;  //pnum[4];
           npn[2]=31; //pnum[8];
           npn[3]=18; //pnum[12];
           npn[4]=28;  //pnum[16];
           nn=4 ;
      for (i=0;i<5;i++){      //排序
      for (j=0;j<i;j++){
            bf1=npn[j] ;    bf2=npn[i] ;
            bf1=(bf1-bf1/13*13)+1;
            bf2=(bf2-bf2/13*13)+1;
            if (bf1==1) bf1=14 ;  //A
            if (bf2==1) bf2=14 ;  //A
        if (bf1<bf2) {
            temp=npn[i] ;
            npn[i]=npn[j];
            npn[j]=temp ;     }
                   }   }    //排序
     px=180;    py=120;   //北家  
         num=npn[0];
         cardback ();    
     for (i=1; i<=nn;i++){    //显示牌面
          px=i*60+180 ;
          num=npn[i];
          transcards ();      }        

      // 西家发牌 ******
           wpn[0]=20; //pnum[1];     
           wpn[1]=7; //pnum[5];
           wpn[2]=11; //pnum[9];
           wpn[3]=24; //pnum[13];
           wpn[4]=46; //pnum[17];
           wn=4 ;
      for (i=0;i<5;i++){      //排序
      for (j=0;j<i;j++){
            bf1=wpn[j] ;    bf2=wpn[i] ;
            bf1=(bf1-bf1/13*13)+1;
            bf2=(bf2-bf2/13*13)+1;
            if (bf1==1) bf1=14 ;  //A
            if (bf2==1) bf2=14 ;  //A
        if (bf1<bf2) {
            temp=wpn[i] ;
            wpn[i]=wpn[j];
            wpn[j]=temp ;     }
                   }   }    //排序
     px=5;    py=340;   //西家  
        num=wpn[0];
        cardback ();    
       for (i=1; i<=wn;i++){    //显示牌面
          px=i*40+5 ;
          num=wpn[i];
          transcards ();      }

      // 南家发牌 ******
           spn[0]=47; //pnum[2];            
           spn[1]=48; //pnum[6];
           spn[2]=50; //pnum[10];
           spn[3]=51; //pnum[14];
           spn[4]=49; //pnum[18];
           sn=4 ;
       for (i=0;i<5;i++){      //排序
       for (j=0;j<i;j++){
            bf1=spn[j] ;    bf2=spn[i] ;
            bf1=(bf1-bf1/13*13)+1;
            bf2=(bf2-bf2/13*13)+1;
            if (bf1==1) bf1=14 ;  //A
            if (bf2==1) bf2=14 ;  //A
        if (bf1<bf2) {
            temp=spn[i] ;
            spn[i]=spn[j];
            spn[j]=temp ;     }
                   }   }    //排序
    px=180;    py=670;   //南家 
        num=npn[0];
         cardback ();    
     for (i=1; i<=sn;i++){    //显示牌面
          px=i*60+180 ;
          num=spn[i];
          transcards ();      }
 
     // 东家发牌 ******
           epn[0]=0; //pnum[3];    
           epn[1]=1; //pnum[7];
           epn[2]=4; //pnum[11];
           epn[3]=2; //pnum[15];
           epn[4]=3; //pnum[19];
           en=4 ;
     for (i=0;i<5;i++){      //排序
     for (j=0;j<i;j++){
            bf1=epn[j] ;    bf2=epn[i] ;
            bf1=(bf1-bf1/13*13)+1;
            bf2=(bf2-bf2/13*13)+1;
            if (bf1==1) bf1=14 ;  //A
            if (bf2==1) bf2=14 ;  //A
        if (bf1<bf2) {
            temp=epn[i] ;
            epn[i]=epn[j];
            epn[j]=temp ;     }
                   }   }    //排序
    px=435;    py=340;   //东家  
        num=epn[0];
        cardback ();           
     for (i=1; i<=en;i++){    //显示牌面
          px=i*40+435 ;
          num=epn[i];
          transcards ();      }
          pn=19 ;    //发牌序
     putbet () ;      // 下注,预设 10
     isdo=1 ;   //启动计分
     cs.Update ();
  }//game3 ()

 result (){   //翻牌比大小
    if (pn<18) return ;   //5张牌发好启动计分结算 
    if (isdo==0) return ;  //发牌后计分,不重复计分
//结算时各家先按大小排序,便于计分
     for (i=0;i<5;i++){      //北家排序
      for (j=0;j<i;j++){
            bf1=npn[j] ;    bf2=npn[i] ;
            bf1=(bf1-bf1/13*13)+1;
            bf2=(bf2-bf2/13*13)+1;
            if (bf1==1) bf1=14 ;  //A
            if (bf2==1) bf2=14 ;  //A
        if (bf1<bf2) {
            temp=npn[i] ;
            npn[i]=npn[j];
            npn[j]=temp ;     }
                   }   }    //北家排序
     for (i=0;i<5;i++){      //西家排序
      for (j=0;j<i;j++){
            bf1=wpn[j] ;    bf2=wpn[i] ;
            bf1=(bf1-bf1/13*13)+1;
            bf2=(bf2-bf2/13*13)+1;
            if (bf1==1) bf1=14 ;  //A
            if (bf2==1) bf2=14 ;  //A
        if (bf1<bf2) {
            temp=wpn[i] ;
            wpn[i]=wpn[j];
            wpn[j]=temp ;     }
                   }   }    //西家排序
       for (i=0;i<5;i++){      //南家排序
       for (j=0;j<i;j++){
            bf1=spn[j] ;    bf2=spn[i] ;
            bf1=(bf1-bf1/13*13)+1;
            bf2=(bf2-bf2/13*13)+1;
            if (bf1==1) bf1=14 ;  //A
            if (bf2==1) bf2=14 ;  //A
        if (bf1<bf2) {
            temp=spn[i] ;
            spn[i]=spn[j];
            spn[j]=temp ;     }
                   }   }    //南家排序
     for (i=0;i<5;i++){      //东家排序
     for (j=0;j<i;j++){
            bf1=epn[j] ;    bf2=epn[i] ;
            bf1=(bf1-bf1/13*13)+1;
            bf2=(bf2-bf2/13*13)+1;
            if (bf1==1) bf1=14 ;  //A
            if (bf2==1) bf2=14 ;  //A
        if (bf1<bf2) {
            temp=epn[i] ;
            epn[i]=epn[j];
            epn[j]=temp ;     }
                   }   }    //东家排序

//**** 翻牌 显示牌面 ************ 
    px=180;    py=120;   //北家  
    for (i=0;i<=nn;i++){
        px=i*60+180 ;
        num=npn[i];
        transcards ();      }  //显示底牌
    px=5;    py=340;   //西家  
    for (i=0;i<=wn;i++){
        px=i*40+5 ;
        num=wpn[i];
        transcards ();      }  //显示底牌
    px=180;    py=670;   //南家 
    for (i=0;i<=sn;i++){
        px=i*60+180 ;
        num=spn[i];
        transcards ();      }  //看牌
    px=435;    py=340;   //东家  
    for (i=0;i<=en;i++){
        px=i*40+435 ;
        num=epn[i];
        transcards ();      }  //显示底牌
 
   cs.Update ();

//计算各家得分 >> 比大小 ****
    c1=npn[0] ; c2=npn[1] ; c3=npn[2] ;
    c4=npn[3] ; c5=npn[4] ; 
          cal_score () ;     bs=gscore ;    //北家
          print "   北家得分 =  ", bs ;
    c1=wpn[0] ; c2=wpn[1] ; c3=wpn[2] ;
    c4=wpn[3] ; c5=wpn[4] ; 
         cal_score () ;     us1=gscore ;    //西家
          print "   西家得分 =  ", us1 ;
    c1=spn[0] ; c2=spn[1] ; c3=spn[2] ;
    c4=spn[3] ; c5=spn[4] ; 
         cal_score () ;     us2=gscore ;    //南家
          print "   南家得分 =  ", us2 ;
    c1=epn[0] ; c2=epn[1] ; c3=epn[2] ;
    c4=epn[3] ; c5=epn[4] ; 
         cal_score () ;     us3=gscore ;    //东家
          print "   东家得分 =  ", us3 ;
      num1=bs ;
//游戏是安卓单机版设计,故
//游戏规则稍加改动,以北家为庄家,
//比分大小关键:相同对子时要比散牌点大小
//都是散牌时要逐张牌比大小,比较复杂
//如都是金花也要逐张牌比大小
//相同分数时逐张比大小,比花色大小,
//本游戏暂不设比花色大小
//(bs&&user  n<100)为散牌, 500+ 为同花 
//**** 计算赢家分数 ** 首三张加权 ****
//**  bs 北家,us1 西家 , us2 南家 , us3 东家   
//最大分值为赢家,输家赔分,赢家独得 
//此安卓版手机游戏改为坐庄制,玩家与庄家比分
 // 庄家比西家 ** 散牌或同花加权 *****
    if (bs<100&&us1<100) { 
           bs=num1 ;    //重新计算还原分值
        c1=npn[0] ; c2=npn[1] ; c3=npn[2] ;
        c1s=(c1-c1/13*13)+1;     //庄家牌点
        c2s=(c2-c2/13*13)+1;  
        c3s=(c3-c3/13*13)+1;  
            if (c1s==1) c1s=14 ;
        b1=wpn[0] ; b2=wpn[1] ; b3=wpn[2] ;
        b1s=(b1-b1/13*13)+1;     //西家牌点
        b2s=(b2-b2/13*13)+1;  
        b3s=(b3-b3/13*13)+1;  
             if (b1s==1) b1s=14 ;
        if (c1s>b1s) bs=bs+60 ;
        if (c1s<b1s) us1=us1+60 ;
        if (c2s>b2s) bs=bs+20 ;
        if (c2s<b2s) us1=us1+20 ;       //比西家
        if (c3s>b3s) bs=bs+10 ;
        if (c3s<b3s) us1=us1+10 ;       //比西家
          print "  ";
          print "   北家得分 =  ", bs ;
          print "   西家得分 =  ", us1 ;     }
   if (bs>500&&bs<600&&us1>500&&us1<600) { 
           bs=num1 ;    //重新计算还原分值
        c1=npn[0] ; c2=npn[1] ; c3=npn[2] ;
        c1s=(c1-c1/13*13)+1;     //庄家牌点
        c2s=(c2-c2/13*13)+1;  
        c3s=(c3-c3/13*13)+1;  
            if (c1s==1) c1s=14 ;
        b1=wpn[0] ; b2=wpn[1] ; b3=wpn[2] ;
        b1s=(b1-b1/13*13)+1;     //西家牌点
        b2s=(b2-b2/13*13)+1;  
        b3s=(b3-b3/13*13)+1;  
             if (b1s==1) b1s=14 ;
        if (c1s>b1s) bs=bs+60 ;
        if (c1s<b1s) us1=us1+60 ;
        if (c2s>b2s) bs=bs+20 ;
        if (c2s<b2s) us1=us1+20 ;       //比西家
        if (c3s>b3s) bs=bs+10 ;
        if (c3s<b3s) us1=us1+10 ;       //比西家
         print "  ";
          print "   北家得分 =  ", bs ;
          print "   西家得分 =  ", us1 ;     }
 
    if (bs<us1){
          bankers=bankers-zu2 ;
          users1=users1+zu2 ;       
          t$= "+" +  "  "  +intToString (zu2) ;
          sx=192;   sy=570;   tsize=40;
          print_t ();   
          zf2=zu2*(-1) ;       }          
     if (bs>=us1){
          bankers=bankers+zu2 ;
          users1=users1-zu2 ;     
          t$= " -" +  "  "  +intToString (zu2) ;
          sx=194;   sy=570;   tsize=40;
          print_t ();     
          zf2=zu2 ;       }          
        
 // 庄家比南家 ** 散牌或同花加权 ******
    if (bs<100&&us2<100) { 
         bs=num1 ;    //重新计算还原分值
        c1=npn[0] ; c2=npn[1] ; c3=npn[2] ;
        c1s=(c1-c1/13*13)+1;     //庄家牌点
        c2s=(c2-c2/13*13)+1;  
        c3s=(c3-c3/13*13)+1;  
            if (c1s==1) c1s=14 ;
        b1=spn[0] ; b2=spn[1] ; b3=spn[2] ;
        b1s=(b1-b1/13*13)+1;     //南家牌点
        b2s=(b2-b2/13*13)+1;  
        b3s=(b3-b3/13*13)+1;  
             if (b1s==1) b1s=14 ;
        if (c1s>b1s) bs=bs+60 ;
        if (c1s<b1s) us2=us2+60 ;
        if (c2s>b2s) bs=bs+20 ;
        if (c2s<b2s) us2=us2+20 ;      //比南家
        if (c3s>b3s) bs=bs+10 ;
        if (c3s<b3s) us2=us2+10 ;       //比南家
          print "  ";
          print "   北家得分 =  ", bs ;
          print "   南家得分 =  ", us2 ;    }
    if (bs>500&&bs<600&&us2>500&&us2<600) { 
         bs=num1 ;    //重新计算还原分值
        c1=npn[0] ; c2=npn[1] ; c3=npn[2] ;
        c1s=(c1-c1/13*13)+1;     //庄家牌点
        c2s=(c2-c2/13*13)+1;  
        c3s=(c3-c3/13*13)+1;  
            if (c1s==1) c1s=14 ;
        b1=spn[0] ; b2=spn[1] ; b3=spn[2] ;
        b1s=(b1-b1/13*13)+1;     //南家牌点
        b2s=(b2-b2/13*13)+1;  
        b3s=(b3-b3/13*13)+1;  
             if (b1s==1) b1s=14 ;
        if (c1s>b1s) bs=bs+60 ;
        if (c1s<b1s) us2=us2+60 ;
        if (c2s>b2s) bs=bs+20 ;
        if (c2s<b2s) us2=us2+20 ;      //比南家
        if (c3s>b3s) bs=bs+10 ;
        if (c3s<b3s) us2=us2+10 ;       //比南家
          print "  ";
          print "   北家得分 =  ", bs ;
          print "   南家得分 =  ", us2 ;    }

     if (bs<us2){
          bankers=bankers-zu3 ;
          users2=users2+zu3 ;      
          t$= "+" +  "  "  +intToString (zu3) ;
          sx=407;   sy=895;   tsize=40;
          print_t ();      
          zf3=zu3*(-1) ;       }          
     if (bs>=us2){
          bankers=bankers+zu3 ;
          users2=users2-zu3 ;      
          t$= " -" +  "  "  +intToString (zu3) ;
          sx=409;   sy=895;   tsize=40;
          print_t ();   
          zf3=zu3 ;       }          
        
//庄家比东家 ** 散牌或同花加权 ******
    if (bs<100&&us3<100) { 
          bs=num1 ;    //重新计算还原分值
       c1=npn[0] ; c2=npn[1] ; c3=npn[2] ;
        c1s=(c1-c1/13*13)+1;     //庄家牌点
        c2s=(c2-c2/13*13)+1;  
        c3s=(c3-c3/13*13)+1;  
            if (c1s==1) c1s=14 ;   
        b1=epn[0] ; b2=epn[1] ; b3=epn[2] ;
        b1s=(b1-b1/13*13)+1;     //东家牌点
        b2s=(b2-b2/13*13)+1;  
        b3s=(b3-b3/13*13)+1; 
             if (b1s==1) b1s=14 ;
        if (c1s>b1s) bs=bs+60 ;
        if (c1s<b1s) us3=us3+60 ;
        if (c2s>b2s) bs=bs+20 ;
        if (c2s<b2s) us3=us3+20 ;         //比东家
        if (c3s>b3s) bs=bs+10 ;
        if (c3s<b3s) us3=us3+10 ;        //比东家
          print "  ";
          print "   北家得分 =  ", bs ;
          print "   东家得分 =  ", us3 ;    }
    if (bs>500&&bs<600&&us3>500&&us3<600) { 
          bs=num1 ;    //重新计算还原分值
        c1=npn[0] ; c2=npn[1] ; c3=npn[2] ;
        c1s=(c1-c1/13*13)+1;     //庄家牌点
        c2s=(c2-c2/13*13)+1;  
        c3s=(c3-c3/13*13)+1;  
            if (c1s==1) c1s=14 ;   
        b1=epn[0] ; b2=epn[1] ; b3=epn[2] ;
        b1s=(b1-b1/13*13)+1;     //东家牌点
        b2s=(b2-b2/13*13)+1;  
        b3s=(b3-b3/13*13)+1; 
             if (b1s==1) b1s=14 ;
        if (c1s>b1s) bs=bs+60 ;
        if (c1s<b1s) us3=us3+60 ;
        if (c2s>b2s) bs=bs+20 ;
        if (c2s<b2s) us3=us3+20 ;         //比东家
        if (c3s>b3s) bs=bs+10 ;
        if (c3s<b3s) us3=us3+10 ;        //比东家
         print "  ";
          print "   北家得分 =  ", bs ;
          print "   东家得分 =  ", us3 ;    }

     if (bs<us3){
          bankers=bankers-zu4 ;
          users3=users3+zu4 ;        
          t$= "+" +  "  "  +intToString (zu4) ;
          sx=505;   sy=570;   tsize=40;
          print_t ();
          zf4=zu4*(-1) ;       }          
     if (bs>=us3){
          bankers=bankers+zu4 ;
          users3=users3-zu4 ;          
          t$= " -" +  "  "  +intToString (zu4) ;
          sx=507;   sy=570;   tsize=40;
          print_t (); 
          zf4=zu4 ;         }          
    
//更新显示分数
 showscore :
     cs.SetColor (255,0,120,0);  //clear text
     cs.DrawRect (230,20,510,70);
     cs.DrawRect (20,480,700,530);
     cs.DrawRect (230,810,510,860);

  //*******显示"庄家"...文字及分数和下注数
        zf1=zf2+zf3+zf4 ;
            if (zf1>0) ss4= "+"+ intToString(zf1) ;
            if (zf1<0) ss4= intToString(zf1) ;
         ss=intToString (bankers);
         // s=intToString (zu1);
     t$="庄家 "+"  "+ss +"    " + ss4 ;
     sx=235;   sy=60;   tsize=40;
     print_t ();

         ss=intToString (users1);
         s=intToString (zu2);
      t$="西家 "+"  "+ss+"  "+s  ;
      sx=20;   sy=520;    tsize=40;
      print_t ();

         ss=intToString (users2);
         s=intToString (zu3);
      t$="南家 "+"  "+ss+"  "+s ;
      sx=235;   sy=850;    tsize=40;
      print_t ();

       t$="东家 " ;
     sx=620;   sy=520;    tsize=40;
     print_t ();
         ss=intToString (users3);
         s=intToString (zu4);
      t$=ss+"  "+s ;
      sx=440;   sy=520;    tsize=40;
      print_t ();

//******************
      cs.Update ();
      isdo=0;   //翻牌计分后不重复计分
 }//result ()

//**** 计分规则:
// 皇家同花顺 AKQJT    500+400+  =900+
// 炸弹 AAAA ......>  2222      700+
// 葫芦 AAAKK  33222            600+
// 同花 A♡Q♡J♡8♡5♡      500+
// 顺子 AKQJT ==>  A5432    400+
// 三条 AAA23   222K8           300+
// 双对子 AAKK◇ ==>  3322♤    200+
// 对子 AA○◇♧ ==> 22♧◇○   100+
// 散牌 按牌面计分 A +计 14分 =>> 2 +计 2分

cal_score (){
//计算分数,输入为c1,c2,c3,c4,c5 输出 gscore
//为计分:c1->c5 换算为 1 ->> 13 (A ->> K )序  
    c1s=(c1-c1/13*13)+1;     //牌点
    c2s=(c2-c2/13*13)+1;  
    c3s=(c3-c3/13*13)+1;  
    c4s=(c4-c4/13*13)+1;  
    c5s=(c5-c5/13*13)+1;  
    csh1=c1/13 ;  csh2=c2/13 ;  csh3=c3/13 ; 
    csh4=c4/13 ;  csh5=c5/13 ;        //花色
       if (c1s==1) c1s=14 ;            //A
       if (c2s==1) c2s=14 ;
       if (c3s==1) c3s=14 ;
       if (c4s==1) c4s=14 ;
       // if (c5s==1) c5s=14 ;
// 计算各家总分,
// 同花顺>四条>葫芦>同花>顺子>三条>对子加权
// 5张散牌或同花计分较复杂,要逐张牌比大小,
// 翻牌result () 对比计算
        gscore=c1s+c2s+c3s+c4s+c5s  ;     
            //gscore = 5张牌合计分
 //皇家同花顺:AKQJT 加权,最大
 //若是同花加顺子:同花500+顺子400+ => 900+

    //四条,99992 ,4连张炸弹  
     if (c1s==c2s&&c1s==c3s&&c1s==c4s){
             gscore=c1s*4+700 ;        
                     goto  putout ;        }
    if (c2s==c3s&&c2s==c4s&&c2s==c5s){
             gscore=c1s*4+700 ;         
                     goto  putout ;        }

      //葫芦AAAKK , 33222
     if (c1s==c2s&&c1s==c3s&&c4s==c5s){
             gscore=c1s*3+600 ;        
                     goto  putout ;        }
    if (c1s==c2s&&c3s==c4s&&c3s==c5s){
             gscore=c3s*3+600 ;         
                     goto  putout ;        }
    if(csh1==csh2&&csh1==csh3&&csh1==csh4&&csh1==csh5){       //同花♡♡♡♡♡
             gscore=gscore+500 ;        }         
 if(c5s==(c4s-1)&&c4s==(c3s-1)&&c3s==(c2s-1)&&c2s==(c1s-1)){   //AKQJT 460分 ==>>  65432 顺子
             gscore=gscore+400 ;        }     
 if(c1s==14&&c2s==5&&c3s==4&&c4s==3&&c5s==2) {             //A5432   =  A 顺子最小
              gscore=gscore -13+400 ;      }

  //三条  AAA23  22234  比三条大小即可,不加权
    if (c1s==c2s&&c1s==c3s){
             gscore=c1s*3+300 ;    
             goto putout ;      }
    if (c2s==c3s&&c2s==c4s){
             gscore=c2s*3+300 ;    
             goto putout ;      }
    if (c3s==c4s&&c3s==c5s){
             gscore=c3s*3+300 ;    
             goto putout ;      }
    
  //双对子   AAKK6  33225
     if (c1s==c2s&&c3s==c4s){
             gscore=c1s*3+c3s*2+200 ;    
             goto putout ;      }
    if (c2s==c3s&&c4s==c5s){
             gscore=c2s*3+c4s*2+200 ;   
            goto putout ;      }
    if (c1s==c2s&&c4s==c5s){
             gscore=c1s*3+c4s*2+200 ;   
            goto putout ;      }

        //对子: 相同对子情况较少故散牌不加权
    if (c1s==c2s) gscore=c1s*4+100 ;       
    if (c2s==c3s) gscore=c2s*4+100 ;       
    if (c3s==c4s) gscore=c3s*4+100 ;       
    if (c4s==c5s) gscore=c4s*4+100 ;       
        
 // **** 算法测试:print "..."  显示牌面 *******
putout :
        //显示大牌点 AKQJ 
           ss1=intToString (c1s) ;
        if (c1s==1||c1s==14)  ss1="A" ;       
        if (c1s==13)  ss1="K" ;       
        if (c1s==12)  ss1="Q" ;       
        if (c1s==11)  ss1="J" ;       
            ss2=intToString (c2s) ;
        if (c2s==1||c2s==14)  ss2="A" ;       
        if (c2s==13)  ss2="K" ;       
        if (c2s==12)  ss2="Q" ;       
        if (c2s==11)  ss2="J" ;       
            ss3=intToString (c3s) ;
        if (c3s==1||c3s==14)  ss3="A" ;       
        if (c3s==13)  ss3="K" ;       
        if (c3s==12)  ss3="Q" ;       
        if (c3s==11)  ss3="J" ;       
            ss4=intToString (c4s) ;
        if (c4s==1||c4s==14)  ss4="A" ;       
        if (c4s==13)  ss4="K" ;       
        if (c4s==12)  ss4="Q" ;       
        if (c4s==11)  ss4="J" ;       
            ss5=intToString (c5s) ;
        if (c5s==1||c5s==14)  ss5="A" ;       
        if (c5s==13)  ss5="K" ;       
        if (c5s==12)  ss5="Q" ;       
        if (c5s==11)  ss5="J" ;       

//**** 测试 print test ** return gscore ****
//calculate & putout gscore,  return gscore
    print "  " ;     // 算法测试检验,可注释掉
        print "取得牌面 = ",ss1 ,"     牌序 ", c1s ;
        print "取得牌面 = ",ss2 ,"     牌序 ", c2s ;
        print "取得牌面 = ",ss3 ,"     牌序 ", c3s ;
        print "取得牌面 = ",ss4 ,"     牌序 ", c4s ;
        print "取得牌面 = ",ss5 ,"     牌序 ", c5s ;
      // print "return  gscore = ",gscore ;
 }//cal_score ()

print_t (){   //打印标题提示等美术文字
//**  参数 sx,sy, ss0=t$, tsize=text size   
  cs.SetFillMode (1);//0不填色,1填色
    cs.SetTextStyle (0);    //0正常,1粗体
     ss0=t$ ;
 cs.SetTextSize (tsize);
    cs.SetColor (255,0,200,60);
 cs.DrawText (ss0,sx+2,sy+3);
    cs.SetColor (255,250,120,0);
 cs.DrawText (ss0,sx,sy);
 cs.SetFillMode (0);//0不填色,1填色
    cs.SetColor (255,250,250,0);
    cs.DrawText (ss0,sx,sy);
  cs.SetFillMode (1);//0不填色,1填色
      cs.Update ();
}//print _t ()

 print_t1 (){   //打印标题提示等美术文字
//**  参数 sx,sy, ss0=t$, tsize=text size   
  cs.SetFillMode (1);//0不填色,1填色
    cs.SetTextStyle (1);    //0正常,1粗体
     ss0=t$ ;
 cs.SetTextSize (tsize);
    cs.SetColor (255,0,20,100);
 cs.DrawText (ss0,sx+3,sy+4);
    cs.SetColor (255,20,250,20);
 cs.DrawText (ss0,sx,sy);
 cs.SetFillMode (0);//0不填色,1填色
    cs.SetColor (255,250,0,0);
    cs.DrawText (ss0,sx,sy);
  cs.SetFillMode (1);//0不填色,1填色
      cs.Update ();
}//print _t1 ()

myToolBarProc(int nBtn,int nContext){
      if(nBtn==100){//游戏开始 >  开局
            setDisplay (1);
            gamestart ();
              }  
      if(nBtn==101){//发牌
            setDisplay (1);
               deal () ;
             }
      if(nBtn==102){//切换玩家
            setDisplay (1);
            change_id () ;
             }
      if(nBtn==103){//下注加注
           setDisplay (1);
           add_bet () ;
              }
      if(nBtn==104){//退出程序
          clearOutput();
          cs.ClearDraw (0,src);
          setDisplay (0);
          exit (0);
               }
     if(nBtn==105){//@About
            setDisplay (1);
            drawcover ();
                 }
}//myToolBar ()

myMenuProc(int nMen,int nContext){
     if(nMen==200){  //重新开始
          setDisplay (1);
          redeal ();
                 }   
     if(nMen==201){   // 预设牌测试计算分数
          setDisplay (1);
          shuffle_cards ();
           game3 () ;
                  }   
     if(nMen==202){    //停牌盖牌暂不设置
           setDisplay (1);
          //  isdo=1 ;
                     }
      if (nMen==203){  //翻牌结算
             result ();
                    }
    if (nMen==204){//选项:洗牌验牌测试
            shuffle_cards ();
               sleep (1000);
            //drawcards ();    //原顺序显示牌面
            showcard ();       //洗牌后显示牌面
              }
  if(nMen==205){//close canvas 测试查看
        setDisplay (0);  
             }  
    if(nMen==206){//show canvas
          setDisplay (1);    
             }
    if (nMen==207){//Exit 
        clearOutput();
        cs.ClearDraw (0,src);
        exit (0);
          }
  }//myMenu()


//纸牌游戏《梭哈》V.1.1.0   设计制作,用时5天
// 2022年9月22日完成于上海

 

//**** End ****

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值