javase扎金花程序

来源:互联网 发布:c语言中break的用法 编辑:程序博客网 时间:2024/06/11 06:40

love聊网络那点事:http://weibo.com/u/3923942488 

package zhajinhua;

import java.util.Comparator;

public class Card implements Comparator<Card> {
 /** 花色 */
 private int suit;// 实例变量, 每个扑克牌实例都有自己的花色
 /** 点数 0代表3, 1代表4, 2代表5 */
 private int rank;// 实例变量, 每个扑克牌实例都有自己的点数

 public static final int DIAMOND = 0; // 方块(钻石)
 public final static int CLUB = 1; // 梅花
 public static final int HEART = 2; // 红桃(红心)
 public static final int SPADE = 3; // 黑桃(花锄)

 public final static int DEUCE = 0; // 2
 public final static int THREE = 1;
 public final static int FOUR = 2;
 public final static int FIVE = 3;
 public final static int SIX = 4;
 public final static int SEVEN = 5;
 public final static int EIGHT = 6;
 public final static int NINE = 7;
 public final static int TEN = 8;
 public final static int JACK = 9;// J
 public final static int QUEEN = 10;// Q
 public final static int KING = 11;// K
 public final static int ACE = 12;// A

 public Card() {
 }

 public Card(int suit, int rank) {
  setRank(rank);
  setSuit(suit);
 }

 public int getRank() {
  return rank;
 }

 /** 更新点数 */
 public void setRank(int rank) {
  if (rank < DEUCE || rank > ACE) {
   throw new RuntimeException("超了!");
  }
  this.rank = rank;
 }

 public int getSuit() {
  return suit;
 }

 public void setSuit(int suit) {
  if (suit < DIAMOND || suit > SPADE) {
   throw new RuntimeException("超了!");
  }
  this.suit = suit;
 }

 private final static String[] SUIT_NAMES = { "方块", "梅花", "红桃", "黑桃" };
 private final static String[] RANK_NAMES = { "2", "3", "4", "5", "6", "7",
   "8", "9", "10", "J", "Q", "K", "A" };

 public String toString() {
  return SUIT_NAMES[suit] + RANK_NAMES[rank];
 }

 public boolean equals(Object obj) {
  if (obj == null) // 与null比较返回false
   return false;
  if (this == obj) // obj对象就是当前(this)对象, 返回true
   return true;
  if (obj instanceof Card) {// 检查obj引用的对象是否是Card类型
   Card other = (Card) obj;// 引用类型转换,方便访问属性
   return this.rank == other.rank && this.suit == other.suit;
  }
  return false;// 类型不一致返回false
 }

 public int hashCode() {
  return (suit << 16) | rank;
 }
 //比较器  按大到小顺序
 public int compare(Card o1, Card o2) {
  if (o1.rank != o2.rank) {
   return o2.rank - o1.rank;
  } else {
   return o2.suit - o1.suit;
  }
 }
}

 

package zhajinhua;

import java.util.ArrayList;
import java.util.Random;
/**
 * 符合扎金花要求的一副牌以及扎金花的一些规则
 * @author Administrator
 *
 */
public class CardsOfZJH {
 public ArrayList<Card> cardsOfZJH = new ArrayList<Card>();
 public CardsOfZJH(){
  cardsOfZJH = createCards();
 }
 //生成一副符合扎金花要求的打乱的扑克牌
 public ArrayList<Card> createCards(){
  ArrayList<Card> cards = new ArrayList<Card>();
  for (int i = 0; i < 4; i++) {
   for (int j = 0; j < 13; j++) {
    Card c = new Card(i, j);
    cards.add(c);
   }
  }
     Random r = new Random();
     for(int i=cards.size() - 1; i>=1;i --){
       int j = r.nextInt(i);
       Card t=cards.get(i);
       cards.set(i,cards.get(j));
       cards.set(j,t);
     }
  return cards;
 }
 public String toString() {
  return cardsOfZJH.toString();
 }
}

 

 

package zhajinhua;
/**
 *该类定义了所有关于扎金花的比牌规则
 */
import java.util.Arrays;
import java.util.Comparator;
import java.util.Random;

public class CardsOfPlayer implements Comparator<CardsOfPlayer>{
 //所有玩家共用一副牌,但是每次重新开始应该生成不同顺序的牌,所以此处不能初始化,而应该设置一个set方法。
 private static CardsOfZJH cardsOfZJH;
 private Player player;
 private Card firstCard;
 private Card secondCard;
 private Card thirdCard;
 //每次重新开始可以调用该方法重新生成一副新牌
 public static void setCardsOfZJH(CardsOfZJH cardsOfZJH) {
  CardsOfPlayer.cardsOfZJH = cardsOfZJH;
 }
 public CardsOfPlayer(){
  
 }
 //从一幅牌的剩余牌中随即抽取三张
 public CardsOfPlayer(Player p){
  this.player = p;
  if(null == cardsOfZJH){
   throw new RuntimeException("提示:该局游戏的牌还没创建,不能进行游戏!");
  }
  Card[] cards = getCards();
  Arrays.sort(cards,new Card());//让三张牌按大到小的顺序排序
  firstCard = cards[0];
  secondCard = cards[1];
  thirdCard = cards[2];
 }
 public Player getPlayer() {
  return player;
 }
 //获得抽取的那三张牌
 private Card[] getCards(){
  Card[] cards = new Card[3];
  Random ran = new Random();
  int j = 0;
  for(int i = 0;i < 3;i ++){
   j = ran.nextInt(cardsOfZJH.cardsOfZJH.size());
   cards[i] = cardsOfZJH.cardsOfZJH.remove(j);//获取随即抽取的那张牌并删除它。
  }
  return cards;
 }

 //这个需要完善。
 public int hashCode() {
  return firstCard.hashCode() + secondCard.hashCode() + thirdCard.hashCode();
 }
 public boolean equals(Object obj) {
  if(null == obj){
   return false;
  }
  if(this == obj){
   return true;
  }
  if(obj instanceof CardsOfPlayer){
   CardsOfPlayer cardsOfPlayer = (CardsOfPlayer)obj;
   return this.firstCard.equals(cardsOfPlayer.firstCard) && this.secondCard.equals(cardsOfPlayer.secondCard) && this.thirdCard.equals(cardsOfPlayer.thirdCard);
  }
  return false;
 }
 public String toString() {
  return player.getName() + " : \t" + firstCard + "," + secondCard + "," + thirdCard;
 }
 //判断牌型
  public int Type(){
   //豹子
   if(firstCard.getRank() == secondCard.getRank() && firstCard.getRank() == thirdCard.getRank()){
    return 1;
   }
   //同花顺 金花
   if(firstCard.getSuit() == secondCard.getSuit() && firstCard.getSuit() == thirdCard.getSuit()){
    if(firstCard.getRank() - secondCard.getRank() == 1 && secondCard.getRank() - thirdCard.getRank() == 1){
     return 2;
    }else{
     return 4;
    }
   }
   //顺子
   if(firstCard.getRank() - secondCard.getRank() == 1 && secondCard.getRank() - thirdCard.getRank() == 1){
    return 3;
   }
   //对子
   if(firstCard.getRank() == secondCard.getRank() || secondCard.getRank() == thirdCard.getRank()){
    return 5;
   }
   //特殊235
   if(firstCard.getRank() == 0 && secondCard.getRank() == 3 && thirdCard.getRank() == 5){
    return 7;
   }else{//散牌
    return 6;
   }
  }
  //比较两手牌的大小  升序
 public int compare(CardsOfPlayer o1, CardsOfPlayer o2) {
  //特殊情况7
  if(o1.Type() == 7){
   if(o2.Type() == 1){
    return 1;
   }else{
    return -1;
   }
  }
  if(o2.Type() == 7){
   if(o1.Type() == 1){
    return -1;
   }else{
    return 1;
   }
  }
  //两手牌牌型相同时  先比较各张牌的大小  再比较花色
  if(o1.Type() == o2.Type()){
   if(o1.firstCard.getRank() == o2.firstCard.getRank()){
    if(o1.secondCard.getRank() == o2.secondCard.getRank()){
     if(o1.thirdCard.getRank() == o2.thirdCard.getRank()){
      if(o1.firstCard.getSuit() > o2.firstCard.getSuit()){//牌的点数都相同时比较最大那张牌的花色
       return 1;
      }else{
       return -1;
      }
     }else{
      return o1.thirdCard.getRank() - o2.thirdCard.getRank();
     }
    }else{
     return o1.secondCard.getRank() - o2.secondCard.getRank();
    }
   }else{
    return o1.firstCard.getRank() - o2.firstCard.getRank();
   }
  }
  //牌型不同时只需比较牌型大小即可(前面已经出去了特殊情况)
  return o2.Type() - o1.Type();
 }
}

 

 

package zhajinhua;

import java.util.Random;
import java.util.Scanner;
import java.util.TreeSet;

public class StartGame {
 public static void main(String[] args) {
  Random ran = new Random();
  int flag;//用于接收产生的庄家序号
  Scanner con = new Scanner(System.in);
  Player[] players;
  while(true){
   //每次重新开始都要生成一幅牌
   CardsOfPlayer.setCardsOfZJH(new CardsOfZJH());
   String name;//用于接收输入的玩家名
   System.out.println("输入玩家人数(2 - 6):");
   int number = Integer.valueOf(con.nextLine());
   if(number < 2 || number > 6){
    System.out.println("提示:输入的玩家人数不正确!");
    continue;
   }
   //生成玩家数组
   players = new Player[number];
   for(int i = 0;i < number;i ++){
    System.out.println("输入第" + (i + 1) + "位玩家姓名:");
    name = con.nextLine();
    players[i] = new Player(name);
    //打印下每个玩家的牌
    System.out.println("只有选择看牌了才能看到自己的牌哦!");
   }
   Player.setPlayer_Number(players.length);//初始化有效玩家个数。
   //随机产生庄家
   flag = ran.nextInt(players.length);
   players[flag].setZhuangjia();
   //将所有玩家按操作顺序排好序。  双向链表或者数组。庄家 0 1 2 3 、、、定轮流规则(将庄家调为第一个)
   if(flag != 0){
    Player p = players[0];
    players[0] = players[flag];
    players[flag] = p;
   }
   //庄家蒙牌
   System.out.println("庄家是:" + players[0].getName());
   System.out.println("-------------------庄家蒙牌-------------------");
   players[0].mengpai();
   boolean b = true;
   int c = 1;//为了用来区分是不是第一轮操作
   while(b){
    //出庄家外各位玩家轮流选择操作 --跟牌、加注、弃牌、看牌、比牌、开牌。switch()
    for(int i = c;i < players.length;i ++){
     //如果有效玩家只剩下一个时就停止循环直接判断赢家
     if(Player.getPlayer_Number() == 1){
      b = false;break;
     }
     if(players[i].isQipai()){//判断是否弃牌,弃牌了则轮下一个玩家。
      continue;
     }
     System.out.println(players[i].getName() + "的操作:");
     //系统是否强制要求某玩家开牌判断
     if(kaipai(players[i],players)){
      b = false;break;
     }
     if(players[i].isKanpai()){
      caozuojiemian(players,i,0,1,1,1,1);//看了牌者的选择界面
     }else{
      caozuojiemian(players,i,1,1,1,1,1);
     }
    }
    c = 0;//下一轮循环从庄家开始。
   }
  }
 }
 //计时读秒    //超时则调用弃权
 public static void dumiao(){
  
 }
 //开牌  不管加注还是跟注之前都要判断是否必须开牌。
 public static boolean kaipai(Player p,Player[] players){
  //先判断是否看了牌
  if((p.isKanpai() && (p.getCion() < 6 * Player.getGenzhuFlag())) || (!p.isKanpai() && (p.getCion() < 3 * Player.getGenzhuFlag()))){
    //满足以上条件则需要开牌,显示坚持下来的所有玩家牌信息 并判定赢家
   TreeSet<CardsOfPlayer> set = new TreeSet<CardsOfPlayer>(new CardsOfPlayer());
   for(int i = 0;i < players.length;i ++){
    set.add(players[i].getCards());
   }
   System.out.println("以下输出的顺序是从小到大");
   System.out.println(set);
   set.last().getPlayer().setCion(set.last().getPlayer().getCion() + Player.getGuodi());
   return true;
  }else{
   return false;
  }
 }
 // 比牌  
 public static void bipai(Player[] players,int i){
  //也得判断是否看了牌然后更改锅底和自己的金额
  if(players[i].isKanpai()){
   players[i].setCion(players[i].getCion() - 2 * Player.getGenzhuFlag());Player.setGuodi(Player.getGuodi() + 2 * Player.getGenzhuFlag());
  }else{
   players[i].setCion(players[i].getCion() - Player.getGenzhuFlag());Player.setGuodi(Player.getGuodi() + Player.getGenzhuFlag());
  }
  int [] biaohaoshuzu = new int[players.length - 1];
  int biaohao =-1;//用于标记你要选择比牌的对象
  int k = 0;
  System.out.println("你可以选择的比牌对象有:");
  for(int j = 0;j < players.length;j ++){
   if(players[j] == players[i] || players[j].isQipai()){//弃牌了的玩家和自己不是比牌对象
    continue;
   }else{
    System.out.println("标号:" + k + "," + players[j].getName());
    biaohaoshuzu[k ++] = j;
   }
  }
  boolean bool = true;
  //确定比牌对象的索引biaohao
  while(bool){
   System.out.println("输入你的选择标号");
   Scanner con = new Scanner(System.in);
   biaohao = con.nextInt();
   for(int j = 0;j < biaohaoshuzu.length;j ++){
    if(biaohao == biaohaoshuzu[j])
    {
     bool = false;
     break;
    }
   }
   if(bool == true){
    System.out.print("输入有误请重新");
   }
  }
  //比较players[i]和players[biaohao]的牌的大小 
  System.out.println("测试");
  System.out.println(i);
  System.out.println(biaohao);
  System.out.println(players.length);
  System.out.println("测试");
  System.out.println(biaohaoshuzu[biaohao]);
  System.out.println(biaohao);
  System.out.println("测试");
  if(players[i].getCards().compare(players[i].getCards(),players[biaohaoshuzu[biaohao]].getCards()) < 0){
   players[i].qipai();
   if(Player.getPlayer_Number() == 1){
    players[i].setCion(players[i].getCion() + Player.getGuodi());
    System.out.println("第一轮游戏结束,打印所有玩家牌信息揭晓大家心中的疑问");
    for(int m = 0;m < players.length;m ++){
     System.out.println(players[m]);
    }
   }
  }else{
   players[biaohaoshuzu[biaohao]].qipai();
   if(Player.getPlayer_Number() == 1){
    players[biaohaoshuzu[biaohao]].setCion(players[biaohaoshuzu[biaohao]].getCion() + Player.getGuodi());
    System.out.println("第一轮游戏结束,打印所有玩家牌信息揭晓大家心中的疑问");
    for(int m = 0;m < players.length;m ++){
     System.out.println(players[m]);
    }
   }
  }
 }
 /**
  * 当你选择看牌操作时你有第二次操作选择机会,这时你将不再用于看牌操作权限,当你输入的选择不在范围内时系统将给你重新选择的机会
  * */
 public static void caozuojiemian(Player[] players,int i,int a,int b,int c,int d,int e){//abcde用来标记各个选项有没有必要出现
  System.out.println("---------------------------------操作选择-------------------------------");
  if(a  == 1){
   System.out.println("-----------------------------1.======看牌-------------------------------");
  }
  if(b == 1){
   System.out.println("-----------------------------2.======跟注-------------------------------"); 
  }
  if(c == 1){
   System.out.println("-----------------------------3.======加注-------------------------------"); 
  }
  if(d == 1){
   System.out.println("-----------------------------4.======比牌-------------------------------");
  }
  if(e == 1){
   System.out.println("-----------------------------5.======弃牌-------------------------------");
  }
  System.out.println("---------------------------------操作选择-------------------------------");
  Scanner con = new Scanner(System.in);
  int number;
  System.out.println("输入你的选择:");
  if(players[i].isKanpai()){
   while(true){
    System.out.println("你看过牌只能选择2、3、4、5:");
    number = con.nextInt();
    if(number == 2 || number == 3 || number == 3 || number == 4 || number == 5){
     break;
    }else{
     System.out.print("你的选择有误!");
    }
   }
  }else{
   number = con.nextInt();
  }
  //如果选择的是看牌的话可以重新选择其他的。
  switch(number){
  case 1:players[i].kanpai();caozuojiemian(players,i,0,1,1,1,1);break;
  case 2:players[i].genzhu();break;
  case 3:players[i].jiazhu();break;
  case 4:bipai(players,i);break;
  case 5:players[i].qipai();break;
  default:System.out.println("你的选择不在范围内,请重新选择");caozuojiemian(players,i,a,b,c,d,e);
  }
 }
}

 

 

package zhajinhua;
/**
 * 没看牌的话最大额为20看了牌才能到达40
 * 加注  只有当跟注 <= 10 才可以加注,看了牌之后加注 翻倍//////////////////////////////////////////////////需要一个禁用
 *  //跟注  看牌之后跟注翻倍
 */
import java.util.Scanner;

public class Player {
 private String name;
 @SuppressWarnings("unused")
 private boolean zhuangjia = false;// 标记是否是庄家
 private static int genzhuFlag;//跟注金额
 private static int guodi = 0;
 private boolean kanpai = false;//用于标记是否看了牌
 private boolean qipai = false;//用于标记玩家是否弃牌
 private CardsOfPlayer cards;
 private static int player_Number;//有效玩家数
 // 每个玩家所拥有的金币
 private int coin = 2000;
 public Player(String name) {
  this.name = name;
  this.cards = new CardsOfPlayer(this);
 }
 // 设置庄家
 public void setZhuangjia() {
  this.zhuangjia = true;
 }
 // 蒙牌
 public void mengpai() {
  Scanner con = new Scanner(System.in);
  int number;
  boolean bool = true;
  while (bool) {
   System.out.println("---------------蒙牌的选择项-------------------");
   System.out.println("---------1.----1金币------------------------");
   System.out.println("---------2.----5金币------------------------");
   System.out.println("---------3.----10金币------------------------");
   System.out.println("---------4.----20金币------------------------");
   System.out.println("---------------蒙牌的选择项-------------------");
   System.out.println("选择你要蒙牌项为:");
   number = Integer.valueOf(con.nextLine());
   switch (number) {
   case 1:coin -= 1;bool = false;genzhuFlag = 1;guodi = 1;break;
   case 2:coin -= 5;bool = false;genzhuFlag = 5;guodi = 5;break;
   case 3:coin -= 10;bool = false;genzhuFlag = 10;guodi = 10;break;
   case 4:coin -= 20;bool = false;genzhuFlag = 20;guodi = 20;break;
   default:System.out.println("输入选项无效,重新选择:");
   }
  }
 }
 //跟注  看牌之后跟注翻倍
 public void genzhu(){
  if(kanpai){
   coin = coin - 2 * genzhuFlag;
   guodi = guodi + 2 * genzhuFlag;
  }else{
   coin -=genzhuFlag;
   guodi +=genzhuFlag;
  }
 }
 //加注  只有当跟注 <= 10 才可以加注,看了牌之后加注 翻倍
 public void jiazhu(){
  Scanner con = new Scanner(System.in);
  int number;//加注金额
  boolean bool = true;//输入不符合规则重新输入标签
  System.out.println("目前跟注价额为:" + genzhuFlag);
  while(bool){
   if(genzhuFlag == 1){
    System.out.println("你可以选择的加注金额有:5,10,20");
    System.out.print("输入你的跟注金额:");
    number = Integer.valueOf(con.nextLine());
    if(number == 5 || number == 10 || number == 20){
     bool = false;
     if(kanpai){//判断是否看了牌  看了牌要加倍
      coin = coin -2 * number;genzhuFlag = number;guodi = guodi + 2 * number;
     }else{
      coin -= number;genzhuFlag = number;guodi = guodi + number;
     }
    }else{
     System.out.println("输入不符合规则,请重新输入:");
    }
   }else if(genzhuFlag == 5){
    System.out.println("你可以选择的加注金额有:10,20");
    System.out.print("输入你的跟注金额:");
    number = Integer.valueOf(con.nextLine());
    if(number == 10 || number == 20){
     bool = false;
     if(kanpai){//判断是否看了牌  看了牌要加倍
      coin = coin -2 * number;genzhuFlag = number;guodi = guodi + 2 * number;
     }else{
      coin -= number;genzhuFlag = number;guodi = guodi + number;
     }
    }else{
     System.out.println("输入不符合规则,请重新输入:");
    }
   }else if(genzhuFlag == 10){
    bool = false;
    System.out.println("你可以选择的加注金额只有:20");
    if(kanpai){//判断是否看了牌  看了牌要加倍
     coin = coin -2 * 20;genzhuFlag = 20;guodi = guodi + 2 * 20;
    }else{
     coin -= 20;bool = false;genzhuFlag = 20;guodi = guodi + 20;
    }
   }
  }
 }
 //看牌
 public void kanpai(){
  this.kanpai = true;
  //显示牌信息
  showpai();
 }
 //弃牌
 public void qipai(){
  Player.setPlayer_Number(--Player.player_Number);
  qipai = true;
 }
 //显示牌
 public void showpai(){
  System.out.println(cards);
 }
 public static int getGuodi() {
  return guodi;
 }
 public static void setGuodi(int guodi) {
  Player.guodi = guodi;
 }
 public static int getGenzhuFlag() {
  return genzhuFlag;
 }
 public boolean isKanpai() {
  return kanpai;
 }
 public boolean isQipai() {
  return qipai;
 }
 public static int getPlayer_Number() {
  return player_Number;
 }
 public static void setPlayer_Number(int player_Number) {
  Player.player_Number = player_Number;
 }
 public String getName() {
  return name;
 }
 public CardsOfPlayer getCards() {
  return cards;
 }
 public int getCion() {
  return coin;
 }
 public void setCion(int cion) {
  this.coin = cion;
 }
 public String toString() {
  return cards.toString() + "  \n金币:" + coin;// /////////////////////////
 }
}

 


原创粉丝点击