1樓
大 中
小 發表於 2006-8-7 20:34
[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()+"點");
}
}
}
}
|