JAVA學習練習(扎金花與21點)
阿新 • • 發佈:2019-02-04
目前轉行學習JAVA。記得N年學過C++,接觸JAVA後感覺上手比較容易。學習半月熟練使用迴圈、判斷,自行看書瞭解JAVA類的使用,並嘗試用類完成程式設計。大概完成了老師題目,類和方法用得很混亂,但是總歸做出來了!
設計思路:
一、撲克牌類的建立
最初想法:將牌組建立為
int pkp[][]=new pkp[4][13];
直接賦值2—14(目的可以很直接得到花色和大小)。通過類中的show()進行翻譯顯示(已經完成過載的單張顯示,和多張牌的顯示)。通過隨機函式取得不同的隨機牌下標,將隨機下標放入陣列中。同時用1個數組放置隨機取出的牌。。。。。
最終我需要處理的是:下標的下標的下標。。。
迫於無賴,採用老師的牌組建立方式:
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張不同的牌;三、21點的處理:
滿足21點不會超過9張牌,在for迴圈中使用Scanner類,用鍵盤輸入判斷是否要牌,並輸出結果。
四、炸金花處理: 1、建立方法,將取出的牌每3張一次迴圈、判斷它的性質(炸彈、同花順等)。返回1個二維陣列,它包含每個人的牌屬性、主屬性大小、副屬性大小; 2、建立方法,將上一步中取出的方法進行逐層比較 3、輸出結果。總結:1、應該在先在牌PKP的類中建立一個int型二維陣列:
int[][] pai2=new int[52][2];
用數字和花色代號 來對應PKP類牌中的資料,這樣分開呼叫更加方便對比花色、大小;//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;
}
}