發新話題

[JAVA] 利用繼承來擴充發牌運算玩21點

[JAVA] 利用繼承來擴充發牌運算玩21點

引用:
// 用繼承來處理21點程式
//莊家然後發出兩張牌,牌面朝上,給每一個玩家,另兩張牌 給莊家自己,
//一張牌面朝上,一張朝下。老K,皇后(Q),傑克(J)以及十都算作十點。
//玩家可以自由決定Aces(A)算作1或11。其它的牌如2到9,以原來的面值為準。
import java.util.*;
class player{
         int[] card=new int[13];//記錄手上的牌
         private static String[] cname={"梅花","方塊","紅心","黑桃"};
        private static int obj_cnt=0; //共用的物件技術器
        int card_cnt;
        /**建構元,用來先把牌清乾淨***/
        public player()
        {
                int i;
                card_cnt=0;
                for (i=0;i<13;i=i+1)  this.card=-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[A]+"A");
                        else if (B==13)
                                return (cname[A]+"K");
                        else if (B==12)
                                return (cname[A]+"Q");
                        else if (B==11)
                                return (cname[A]+"J");
                        else
                                return (cname[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==-1) //那個位置沒有牌
                        {
                                card=x;
                                flag=1;
                                card_cnt=card_cnt+1;
                                break; //發完牌就可以跳出去了
                        }//if card
                }//for
                if (flag==0) System.out.println("錯誤!本家發超過13張牌"+x);
        }
}
class p21 extends player{
        int card_value;
        int status;//0:繼續收牌 1:停止發牌
        p21()
        {
                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==-1) //那個位置沒有牌
                        {
                                break; //發完牌就可以跳出去了
                        }//if card
                        B=card/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 demo24a
{
        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=new p21(); //為每個元素配置物件
                        player.show_cnt();
                }
//---------------起始值設定------
                for (i=0;i<=51;i=i+1)
                        dcard=0;

//-------------由電腦亂數發牌------
              for (j=0;j<num;j=j+1)  //最多發5張就可以過5關了
                  for (i=0;i<4;i=i+1) //發給一家
                        {
                                x=randomG.nextInt(52);
                                while (dcard[x]!=0) x=randomG.nextInt(52);
                                if (p.isgo())
                                {
                                        p.set_card(x);
                                        dcard[x]=1;
                                        System.out.print("第 "+(i+1)+" 家要牌得到:");
                                        System.out.println(p.show(j)+"  目前"+p.count_value()+"點");
                                }
                                else System.out.println("第 "+(i+1)+" 家不要牌了");
                        }  
//show出最後結果
                System.out.println("========================最後的結果====================");
                for (i=0;i<4;i=i+1)
                {
                        num=p.card_num();//取得真正的牌數
                        System.out.print("第 "+(i+1)+" 家的牌:");
                        for (j=0;j<num;j=j+1)
                        {
                                System.out.print(p.show(j)+"  ");
                        }
                        if (p.count_value() > 21)
                                System.out.println("積點是"+p.count_value()+"點!爆了!");
                        else
                        {
                                if (num>=5) System.out.print("喔!過五關囉! ");
                                System.out.println("積點是"+p.count_value()+"點");
                        }
                }        
        }
}

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。