10点半是一个典型的扑克牌游戏!10点半的规则如下:

一副扑克牌,大于或等于10的记作0.5 其他的按照其点数记。洗牌后,各玩家依次取一张牌。然后,各玩家根据自己的牌点数的大小决定是否继续要牌,最后由玩家的点数大小来决定胜负,点数大的赢。如果点数总和超过10.5,则被炸掉,记为0.

这里定义牌的数据结构如下:

class Card2

{

int Suit;

String Number;

float Num;

}

Card2[] OneCard=new Card2[52];

这里Suit代表花色,Number代表牌数,Num代表点数,OneCard保存每张牌的花色 数字和点数。

初始化52张扑克牌:

static void ShowCard(){
     int i,j;
     String s="";
     for(i=0,j=0;i<52;i++,j++){
         if(j%13==0){
             System.out.print("\n");
         }
         switch(OneCard[i].Suit){
         case 1:
             s="黑桃";
             break;
         case 2:
             s="红桃";
             break;
         case 3:
             s="梅花";
             break;
         case 4:
             s="方块";
             break;
             default:
                 ;
         }
         System.out.printf(" "+s+OneCard[i].Number);
     }
     System.out.print("\n");
 }

洗牌算法:通过初始化随机种子j,并在循环体中与i随机交换,将牌的顺序打乱,达到洗牌的效果。

static void Shuffle(){
     int i,j,temp;
     int suit;
     Card2 tempcard=new Card2();
     suit=0;
     for(i=0;i<52;i++){
         if(i%13==0){
             suit++;
         }
         Card2 t=new Card2();
         t.Suit=suit;
         temp=i%13;
         switch(temp){
         case 0:
             t.Number="A";break;
         case 9:
             t.Number="10";break;
         case 10:
             t.Number="J";break;
         case 11:
             t.Number="Q";break;
         case 12:
             t.Number="K";break;
             default:
                 t.Number=String.valueOf(temp+1);
         }
         if(temp>=10){
             t.Num=(float) 0.5;
         }
         else{
             t.Num=(float)(temp+1);
         }
         OneCard[i]=t;
     }
     System.out.print("一付新牌的初始拍排列如下:\n");
     ShowCard();
     Random r=new Random();
     for(i=0;i<52;i++){
        j=r.nextInt(52);
        tempcard=OneCard[j];
        OneCard[j]=OneCard[i];
        OneCard[i]=tempcard;
     }
     System.out.print("洗完牌后排列如下:\n");
     ShowCard();
 }

10点半算法:

  1 static void tenhalf(){
  2      int i,count=0;
  3      int iUser=0,iCom=0;
  4      int flag=1,flagc=1;
  5      String jixu,s="";
  6      Card2[] User=new Card2[20],Com=new Card2[20];
  7      float TotalU=0,TotalC=0;
  8      Scanner input=new Scanner(System.in);
  9      while(flag==1&&count<52){
 10         User[iUser++]=OneCard[count++]; 
 11         TotalU+=User[iUser-1].Num;
 12         if(count>=52){
 13             flag=0;
 14         }
 15         else{
 16             if(TotalC<10.5&&TotalC<TotalU){
 17                 Com[iCom++]=OneCard[count++];
 18                 TotalC+=Com[iCom-1].Num;
 19             }
 20         }
 21         System.out.printf("\n用户的总点数:%f\t", TotalU);
 22         System.out.print("用户的牌为:");
 23         for(i=0;i<iUser;i++){
 24             switch(User[i].Suit){
 25             case 1:
 26                 s="黑桃";
 27                 break;
 28             case 2:
 29                 s="红桃";
 30                 break;
 31             case 3:
 32                 s="梅花";
 33                 break;
 34             case 4:
 35                 s="方块";
 36                 break;
 37                 default:
 38                     ;
 39             }
 40             System.out.print(" "+s+User[i].Number);
 41         }
 42         System.out.print("\n");
 43         System.out.printf("计算机的总点数为:%f\t",TotalC);
 44         System.out.print("计算机的牌为:");
 45         for(i=0;i<iCom;i++){
 46             switch(Com[i].Suit){
 47             case 1:
 48                 s="黑桃";
 49                 break;
 50             case 2:
 51                 s="红桃";
 52                 break;
 53             case 3:
 54                 s="梅花";
 55                 break;
 56             case 4:
 57                 s="方块";
 58                 break;
 59                 default:
 60                     ;
 61             }
 62             System.out.print(" "+s+Com[i].Number);
 63         }
 64         System.out.print("\n");
 65         if(TotalU<10.5){
 66             do{
 67                 System.out.print("还要牌吗(y/n)?");
 68                 jixu=input.next();
 69             }while(!jixu.equalsIgnoreCase("y")&&!jixu.equalsIgnoreCase("n"));
 70             if(jixu.equalsIgnoreCase("y")){
 71                 flag=1;
 72             }else{
 73                 flag=0;
 74             }
 75             if(count==52){
 76                 System.out.print("牌已经发完了!\n");
 77                 break;
 78             }
 79         }else break;
 80      }
 81      while(flagc==1&&count<52){
 82          if(TotalU>10.5){
 83              break;
 84          }
 85          else{
 86              if(TotalC<10.5&&TotalC<TotalU){
 87                  Com[iCom++]=OneCard[count++];
 88                  TotalC+=Com[iCom-1].Num;
 89              }
 90              else{
 91                  break;
 92              }
 93          }
 94      }
 95      System.out.printf("\n用户的总点数:%f\t", TotalU);
 96      System.out.print("用户的牌为:");
 97      for(i=0;i<iUser;i++){
 98          switch(User[i].Suit){
 99          case 1:
100              s="黑桃";
101              break;
102          case 2:
103              s="红桃";
104              break;
105          case 3:
106              s="梅花";
107              break;
108          case 4:
109              s="方块";
110              break;
111              default:
112                  ;
113          }
114          System.out.print(" "+s+User[i].Number);
115      }
116      System.out.print("\n");
117      System.out.printf("\n计算机的总点数:%f\t", TotalC);
118      System.out.print("计算机的牌为:");
119      for(i=0;i<iCom;i++){
120          switch(Com[i].Suit){
121          case 1:
122              s="黑桃";
123              break;
124          case 2:
125              s="红桃";
126              break;
127          case 3:
128              s="梅花";
129              break;
130          case 4:
131              s="方块";
132              break;
133              default:
134                  ;
135          }
136          System.out.print(" "+s+Com[i].Number);
137      }
138      System.out.print("\n");
139      if(TotalU==TotalC){
140         System.out.print("\n用户和计算机打成了平手!\n");
141      }
142      else{
143          if(TotalU>10.5&&TotalC>10.5){
144         System.out.print("\n用户和计算机打成了平手!\n");
145          }
146          else if(TotalU>10.5){
147              System.out.print("\n抱歉,计算机赢了,再接再厉!\n");
148          }
149          else if(TotalC>10.5){
150              System.out.print("\n恭喜,用户赢了!\n");
151          }
152          else if(TotalU>TotalC){
153              System.out.print("\n恭喜,用户赢了!\n");
154          }
155          else if(TotalU<TotalC){
156              System.out.print("\n抱歉,计算机赢了,再接再厉!\n");
157          }
158      }
159  }
View Code

用户和计算机来对战,程序根据用户的选择进行发牌,而对于计算机,程序会根据用户的点数来决定是否继续发牌,最后根据双方的点数大小判断谁赢得了胜利。

主函数如下:

首先调用Shuffle()方法洗牌,再调用方法tenhalf()开始游戏。最后游戏结束时根据用户的选择是否继续游戏。

public static void main(String[] args){
     String go;
     Scanner s=new Scanner(System.in);
     do{
     System.out.print("10点半游戏开始!\n");
     Shuffle();
     tenhalf();
     System.out.print("\n游戏结束,还要在玩不?(y/n)");
     go=s.next();
 }while(go.equalsIgnoreCase("y"));
}