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点半算法:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
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 }
用户和计算机来对战,程序根据用户的选择进行发牌,而对于计算机,程序会根据用户的点数来决定是否继续发牌,最后根据双方的点数大小判断谁赢得了胜利。
主函数如下:
首先调用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")); }