1. 程式人生 > >JAVA學習練習(扎金花與21點)

JAVA學習練習(扎金花與21點)

目前轉行學習JAVA。記得N年學過C++,接觸JAVA後感覺上手比較容易。學習半月熟練使用迴圈、判斷,自行看書瞭解JAVA類的使用,並嘗試用類完成程式設計。大概完成了老師題目,類和方法用得很混亂,但是總歸做出來了!

設計思路:

一、撲克牌類的建立

最初想法:將牌組建立為

int pkp[][]=new pkp[4][13];

直接賦值2—14(目的可以很直接得到花色和大小)。通過類中的show()進行翻譯顯示(已經完成過載的單張顯示,和多張牌的顯示)。通過隨機函式取得不同的隨機牌下標,將隨機下標放入陣列中。同時用1個數組放置隨機取出的牌。。。。。

最終我需要處理的是:下標的下標的下標。。。

於無賴,採用老師的牌組建立方式:

String[] clour={"黑桃","紅桃","梅花","方塊"};
String[] paishu={"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
String[][] pai=new String[52][2];
//將牌組的花色和數字組成52個一位陣列

用方法對pai進行順序賦值(取出時用隨機下標),同時構造過載的顯示方法。
此方法構造的牌類,需要經過翻譯後才能比較大小。

二、21點類和炸金花類的取牌(剛開始並不知道建立類需要首字母大寫,順便試了一下將“_”放開頭)

1、建立牌的物件後,隨機取出小於52且不重複n個數字放入陣列,表示n張不同的牌;
2、建立翻譯牌組大小的方法,將n張牌的數字大小放入一個新int陣列;

三、21點的處理:

滿足21點不會超過9張牌,在for迴圈中使用Scanner類,用鍵盤輸入判斷是否要牌,並輸出結果。

四、炸金花處理: 1、建立方法,將取出的牌每3張一次迴圈、判斷它的性質(炸彈、同花順等)。返回1個二維陣列,它包含每個人的牌屬性、主屬性大小、副屬性大小; 2、建立方法,將上一步中取出的方法進行逐層比較 3、輸出結果。

總結1、應該在先在牌PKP的類中建立一個int型二維陣列:

int[][] pai2=new int[52][2];

用數字和花色代號 來對應PKP類牌中的資料,這樣分開呼叫更加方便對比花色、大小;
   2、在牌類PKP賦值時直接採用隨機賦值。按順序取牌,可以大量減少程式碼數量(還有腦細胞死亡數量);    3、在構造類時不需要用void做為修飾符,這樣在new的過程中就已經完成賦值。    4、變數應養成使用英文的習慣,減少不必要的卡殼。 程式碼如下: 主函式名:zs010.java
//21點
import java.util.Scanner;
class _21dian{
	void _21dian(){
		PKP p1=new PKP();				//新建一個撲克牌的物件p1
		p1.PKP();					//對p1進行賦值
		int[] m1=suijs(52);				//用suijs函式取出52張牌並存儲撲克的下標
		int[] m2=shijidx(m1,p1.pai); 			//儲存撲克的實際大小
		System.out.println();
		System.out.println("現在進行21點遊戲:");
		p1.show(m1[0]);
		p1.show(m1[1]);
		int sum=m2[0]+m2[1];
		System.out.println("總共"+sum+"點,繼續要牌請按1,停止要牌請按0,以回車鍵結束");
		for(int i=2;i<m1.length;i++){
			Scanner reader=new Scanner(System.in);
			int pp=reader.nextInt();
			if(sum<=21){
				if(pp==1){
					sum+=m2[i];
					for(int j=0;j<=i;j++){
						p1.show(m1[j]);
					}
					System.out.println("總共"+sum+"點。");
					if(sum>21){
						System.out.println();
						System.out.println("你輸了!");
						break;
					}else if(sum==21){
						System.out.println();
						System.out.println("21點你牛B了");
						break;
					}
					else{
						System.out.print("繼續要牌請按1,停止要牌請按0,以回車鍵結束");
					}
				}else{
					System.out.println("真沒種!!!!這就不要牌了");
					break;
				}
			}else{
				System.out.println();
				System.out.print("你輸了!");
				break;
			}
		}
	}
	//21點遊戲對m陣列對應的牌組賦予m1實際大小
	static int[] shijidx(int[] m,String[][] pai1){
		int[] m1=new int[m.length];
		for(int i=0;i<m.length;i++){
			if(pai1[m[i]][1].equals("J")||pai1[m[i]][1].equals("Q")||pai1[m[i]][1].equals("K")||pai1[m[i]][1].equals("A")){
				m1[i]=10;
			}else{
				m1[i]=Integer.parseInt(pai1[m[i]][1]);
			}
		}
		return m1;
	}
	//取q張牌下標
	static int[] suijs(int q){
		int[] p=new int[q];
		int i=0;
		while(i<q){
			boolean temp=true;
			int o=(int)(Math.random()*52);
			for(int k=0;k<i;k++){
				if(o==p[k]){
					temp=false;
					break;
				}
			}
			if(temp){
				p[i]=o;
				i++;
			}
		}
		return p;
	}
	//判斷花色是否相等
	static boolean tonghs(String[] k1,String[] k2){
		boolean temp=false;
		if(k1[0].equals(k2[0]))
			temp=true;
		return temp;
	}
}
//撲克牌類
class PKP{
	String[] clour={"黑桃","紅桃","梅花","方塊"};
	String[] paishu={"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
	String[][] pai=new String[52][2];
	void PKP(){
		int k=0;
		for(int i=0;i<clour.length;i++){
			for(int j=0;j<paishu.length;j++){
				String t=clour[i]+paishu[j];
				pai[k][0]=t;
				pai[k][1]=paishu[j];
				k++;
			}
		}
	}
	void show(){
		for(int i=0;i<pai.length;i++){
			System.out.print(pai[i][0]+"\t");
		}
	}
	void show(int m){
		System.out.print(pai[m][0]+"\t");
	}
	void show(int[] m){
		for(int i=0;i<m.length;i++){
			System.out.print(pai[m[i]][0]+"\t");
		}
	}
	
}


public class zs010{
	public static void main(String args[]){
		_21dian _dian=new _21dian();
		zjh newzjh=new zjh();
		System.out.println("1、21點"+"\n"+"2、炸金花"+"\n"+"請輸入想玩遊戲序號");
		Scanner read=new Scanner(System.in);
		int k=read.nextInt();
		if(k==1){
			_dian._21dian();
		}else if(k==2){
			newzjh.zjh();
		}else{
			System.out.print("輸入非法字元"+"\n"+"GEME OVER");
		}
	}
}


class zjh{
	void zjh(){
		PKP p2=new PKP();
		p2.PKP();
		int[] suijp=suijs(3);
		int[] suijsdx=shijidx(suijp,p2.pai);
		System.out.println("請輸入要玩遊戲的人數:");
		Scanner pp=new Scanner(System.in);
		int fg=pp.nextInt();
		zjh2(fg);
	}
	//判斷大小的主程式,輸入玩遊戲人數
	void zjh2(int fg){
		//建立一個牌組物件
		PKP p1=new PKP();
		p1.PKP();
		//取出fg*3張牌
		int[] pais=suijs(fg*3);
		//取出牌對應的大小
		int[] paisdx=shijidx(pais,p1.pai);
		//每個人的花色大小的判斷結果,並輸出每個人的牌
		int[][] pdjg=new int[fg][];
		int ff=0;
		for(int j=0;j<pais.length;j+=3){
			int[] pp1={pais[j],pais[j+1],pais[j+2]};
			int[] pp2={paisdx[j],paisdx[j+1],paisdx[j+2]};
			pdjg[ff]=jieguo(pp1,pp2);
			System.out.println();
			System.out.print("第"+(ff+1)+"個玩家的牌是:");
			p1.show(pp1);
			show(pdjg[ff]);
			pdjg[ff][2]=ff+1;
			ff++;
		}
		//判斷每個人的大小(通過對pdjg的1維排序)
		for(int i=0;i<pdjg.length;i++){
			for(int j=i+1;j<pdjg.length;j++){
				if(pdjg[i][0]<pdjg[j][0]){
					int[] llll=pdjg[i];
					pdjg[i]=pdjg[j];
					pdjg[j]=llll;
				}
			}
		}
		//輸出結果
		System.out.println();
		if(pdjg[0][0]>pdjg[1][0]){
			System.out.print("第"+pdjg[0][2]+"個玩家獲得勝利");
		}else{
			boolean temp=true;
			int n=1;
			while(temp&&n<pdjg.length-1){
				if(pdjg[n][0]>pdjg[n+1][0]){
					temp=false;
				}
				n++;
			}
			for(int i=0;i<n;i++){
				for(int j=i+1;j<n;j++){
					if(pdjg[i][1]<pdjg[j][1]){
						int[] llll=pdjg[i];
						pdjg[i]=pdjg[j];
						pdjg[j]=llll;
					}
				}
			}
			if(pdjg[0][1]>pdjg[1][1]){
				System.out.print("第"+pdjg[0][2]+"個玩家獲得勝利");
			}else{
				if(pdjg[0][3]>pdjg[1][3]){
					System.out.print("第"+pdjg[0][2]+"個玩家獲得勝利");
				}else{
					System.out.print("第"+pdjg[1][2]+"個玩家獲得勝利");
				}
			}
		}
	}
	void show(int[] k){
		switch(k[0]){
			case 1:System.out.print("雜牌");
				break;
			case 2:System.out.print("對子");
				break;
			case 3:System.out.print("順子");
				break;
			case 4:System.out.print("清一色");
				break;
			case 5:System.out.print("同花順");
				break;
			case 6:System.out.print("炸彈");
				break;
		}
	}
	//扎金花判斷定性
	int[] jieguo(int[] k1,int[] k2){
		int[] cout=new int[4];
		boolean temp1=false,temp2=false,temp3=false;
		//炸彈
		if(k2[0]==k2[1]&&k2[2]==k2[1]){
			cout[0]=6;
			cout[1]=k2[0];
		//對子
		}else if(k2[0]==k2[1]||k2[2]==k2[1]||k2[0]==k2[2]){
			cout[0]=2;
			if(k2[0]==k2[1]||k2[2]==k2[1]){
				cout[1]=k2[1];
				if(k2[0]==k2[1]){
					cout[3]=k2[2];
				}else{
					cout[3]=k2[0];
				}
			}else{
				cout[1]=k2[2];
				cout[3]=k2[1];
			}
		//同花順
		}else if(shunz(k2)&&thua(k1)){
			cout[0]=5;
			px(k2);
			cout[1]=k2[0];
		//同花
		}else if(thua(k1)){
			cout[0]=4;
			px(k2);
			cout[1]=k2[0];
		//順子
		}else if(shunz(k2)){
			cout[0]=3;
			px(k2);
			cout[1]=k2[0];
		//雜牌
		}else{
			cout[0]=1;
			px(k2);
			cout[1]=k2[0];
		}
		return cout;
	}
	//降序排序方法
	static int[] px(int[] kk){
		int[] yy=kk;
		for(int i=0;i<yy.length;i++){
			for(int j=i+1;j<yy.length;j++){
				if(yy[i]<yy[j]){
					int erwe=yy[i];
					yy[i]=yy[j];
					yy[j]=erwe;
				}
			}
		}
		return yy;
	}
	//判斷是否是順子
	static boolean shunz(int[] kkk){
		int[] ggg=kkk;
		boolean temp=true;
		for(int i=0;i<ggg.length;i++){
			for(int j=i+1;j<ggg.length;j++){
				if(ggg[i]>ggg[j]){
					int o=ggg[i];
					ggg[i]=ggg[j];
					ggg[j]=o;
				}
			}
		}
		for(int i=0;i<ggg.length-1;i++){
			if(ggg[i]+1!=ggg[i+1]){
				temp=false;
				break;
			}
		}
		return temp;
	}
	//判斷花色書否相同
	static boolean thua(int[] ppp){
		int[] n1=new int[ppp.length];
		boolean temp=true;
		for(int i=0;i<ppp.length;i++){
			if(ppp[i]<13){
				n1[i]=1;
			}else if(ppp[i]<26){
				n1[i]=2;
			}else if(ppp[i]<39){
				n1[i]=3;
			}else{
				n1[i]=4;
			}
		}
		for(int i=1;i<ppp.length;i++){
			if(n1[i-1]!=n1[i]){
				temp=false;
				break;
			}
		
		}
		return temp;
	}
	//扎金花遊戲對m陣列對應的牌組賦予m1實際大小
	static int[] shijidx(int[] m,String[][] pai1){
		int[] m1=new int[m.length];
		for(int i=0;i<m.length;i++){
			if(pai1[m[i]][1].equals("J")){
				m1[i]=11;
			}else if(pai1[m[i]][1].equals("Q")){
				m1[i]=12;
			}else if(pai1[m[i]][1].equals("K")){
				m1[i]=13;
			}else if(pai1[m[i]][1].equals("A")){
				m1[i]=14;
			}
			else{
				m1[i]=Integer.parseInt(pai1[m[i]][1]);
			}
		}
		return m1;
	}
	//取q張牌下標
	static int[] suijs(int q){
		int[] p=new int[q];
		int i=0;
		while(i<q){
			boolean temp=true;
			int o=(int)(Math.random()*52);
			for(int k=0;k<i;k++){
				if(o==p[k]){
					temp=false;
					break;
				}
			}
			if(temp){
				p[i]=o;
				i++;
			}
		}
		return p;
	}
	//判斷花色是否相等
	static boolean tonghs(String[] k1,String[] k2){
		boolean temp=false;
		if(k1[0].equals(k2[0]))
			temp=true;
		return temp;
	}
}