// 用繼承來處理21點程式 //莊家然後發出兩張牌,牌面朝上,給每一個玩家,另兩張牌 給莊家自己, //一張牌面朝上,一張朝下。老K,皇后(Q),傑克(J)以及十都算作十點。 //玩家可以自由決定Aces(A)算作1或11。其它的牌如2到9,以原來的面值為準。 import java.util.*; class player{ protected int[] card=new int[13];//記錄手上的牌 private static String[][] cname={{"梅花","方塊","紅心","黑桃"}, //共用的對照表可以用static {"Club","Diamond","Hearts","Spades"}, {"花","塊","心","桃"}, {"C","D","H","S"}}; private static int obj_cnt=0; //共用的物件技術器 protected int card_cnt; private int card_pt;//記錄選定哪一組牌名 /**建構元,用來先把牌清乾淨***/ public player() { this(0);//預設選用中文全名,呼叫player(0) } public player(int cpt) { int i; card_pt=cpt;//可以設定選用不同牌名 card_cnt=0;//預設選用中文全名 for (i=0;i<13;i=i+1) this.card[i]=-1; obj_cnt=obj_cnt+1;//登記多了一家 } /**** method 用來show出共有幾個物件 ******/ public static void show_cnt() { System.out.println("目前共有"+obj_cnt+"家"); } /**** method 用來show出第幾張牌 ******/ public String show(int id) { int A,B; if (card[id]==-1) return ("沒有這張牌"); else { A=card[id]%4; B=card[id]/4; B=B+2; if (B==14) return (cname[card_pt][A]+"A"); else if (B==13) return (cname[card_pt][A]+"K"); else if (B==12) return (cname[card_pt][A]+"Q"); else if (B==11) return (cname[card_pt][A]+"J"); else return (cname[card_pt][A]+B); } } //SHOW /**** method 用來發牌給本玩家 ******/ public void set_card(int id,int x) { if (id<13 && x<52) {card[id]=x;card_cnt=card_cnt+1;} else System.out.println("錯誤 id="+id+" x="+x); } /**** method 用來發牌給本玩家,利用overload來處理沒有設定第幾張的時候 ******/ public void set_card(int x) { int i,flag; if (x>52 || x<0) { System.out.println("錯誤 x="+x); return; } //flag用來看看有沒有發到牌 flag=0; for (i=0;i<13;i=i+1) { if (card[i]==-1) //那個位置沒有牌 { card[i]=x; flag=1; card_cnt=card_cnt+1; break; //發完牌就可以跳出去了 }//if card }//for if (flag==0) System.out.println("錯誤!本家發超過13張牌"+x); } } class p21 extends player{ private int card_value; private int status;//0:繼續收牌 1:停止發牌 p21() { card_value=0;//清理牌計數 status=0;//設定收牌 } p21(int cpt) { super(cpt); card_value=0;//清理牌計數 status=0;//設定收牌 } public boolean isgo() //決定要不要再要牌 { if (status==1) return false; if (count_value()<17) return true; //大於17點就不要牌了 return false; } public int card_num() //傳回現在的牌數目 { return card_cnt; } public int count_value() { int i; int B,A; A=0; card_value=0; for (i=0;i<13;i=i+1) { if (card[i]==-1) //那個位置沒有牌 { break; //發完牌就可以跳出去了 }//if card B=card[i]/4+2; if (B>10 && B<14) B=10;//JKQ都算10 if (B==14) A=A+1;//算有幾張A else card_value=card_value+B; }//for card_value=card_value+A;//先把A算1 while (card_value<=21 && A>0) //把A算成11試試看 { card_value=card_value+10; if (card_value<21) //如果不爆就算11 A=A-1; else //如果會爆就算回A { card_value=card_value-10; break; } } return card_value; } } public class demo24c { public static void main(String[] args) { int i,j,x; int[] dcard=new int[52]; //用來記錄該位牌是否已被發出 int num=5; int A,B; Random randomG=new Random(); p21[] p=new p21[4];//定義四家玩家,配置空間給陣列 for (i=0;i<4;i=i+1) { p[i]=new p21(); //為每個元素配置物件 player.show_cnt(); } //---------------起始值設定------ for (i=0;i<=51;i=i+1) dcard[i]=0; //-------------由電腦亂數發牌------ for (j=0;j 21) System.out.println("積點是"+p[i].count_value()+"點!爆了!"); else { if (num>=5) System.out.print("喔!過五關囉! "); System.out.println("積點是"+p[i].count_value()+"點"); } } } }