java简单斗地主部分功能实现+详解

2019.6.22:斗地主

主要的功能:
1.生成扑克牌
2.分发牌给赌徒
3.为分发好牌的赌徒排好牌的顺序
实现过程
1.对象类:

1.Card:每张牌的对象
2.Gambler:每个玩家赌徒对象
3.CardDEAL:一副牌的处理类
4.TestCard:游戏测试类

2.实现思路
生成一副牌并且分配给3个人,并且可以指定其中一个人为地主

一副扑克  共有54张
每一张扑克: 牌面值、花色(黑桃、红桃、梅花、方块)
特殊情况: 大王、小王

牌面值
2、3、。。。10,j、Q、K 、A 、小王、大王
牌面的计算属性值:

j = 11
Q = 12
K = 13
A = 14
2 = 15
小王 = 16
大王 = 17

如何产生出一副牌 
	/**
 * 
 * @return  随机生成的一副牌
 */
public Card[] produrce()
发牌
	/**
 * 
 * @param gamblers 赌徒的数量(一般为3人)
 * @param cards 一副牌
 * @return 分发好牌的赌徒们
 */
public void dealCards(Gambler[] gamblers,Card[]cards)
3个人斗
每人拿17张  如果是地主 多拿3张

发牌的过程

循环17次每次随机从数组中获取3张牌发给每个人

随机产生地主,地主获取剩余中3张牌

	/**
 * 
 * @param gamblers 分发好牌但是牌还没整理的赌徒们
 */
public void sortCards(Gambler[] gamblers)
整理牌的顺序	

可执行代码
Card类代码:

package com.kp;

public class Card {
	/**
	 * 牌面对象
	 */
	
	/**
	 * 牌面的数字大小
	 */
	private int value;
	/**
	 * 牌面的文本
	 */
	private String text;
	/**
	 * 牌面的花色
	 */
	private String style;
	public Card(int value, String text, String style) {
		super();
		this.value = value;
		switch (value) {
		case 11:
			this.text = "J";
			break;
		case 12:
			this.text = "Q";
			break;
		case 13:
			this.text = "K";
			break;
		case 14:
			this.text = "A";
			break;
		case 15:
			this.text = "2";
			break;
		case 16:
			this.text = "小王";
			break;
		case 17:
			this.text = "大王";
			break;	
		default:
			this.text=text;
			break;
		}
		
		this.style = style;
	}
	
	public Card() {
		super();
	}

	public int getValue() {
		return value;
	}
	public void setValue(int value) {
		this.value = value;
	}
	public String getText() {
		return text;
	}
	public void setText(String text) {
		this.text = text;
	}
	public String getStyle() {
		return style;
	}
	public void setStyle(String style) {
		this.style = style;
	}

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return this.style+this.text+" ";
	}
	
}


  • CardDeal类具体代码:*
package com.kp;

import java.util.Arrays;
import java.util.Random;

public class CardDeal {
/**
 * 牌面处理类
 */
	
	
	/**
	 * 
	 * @return  随机生成的一副牌
	 */
	public Card[] produrce()
	{
		Card [] cards=new Card[54];
		String []styles=new String[] {"黑桃","红桃","梅花","方块"};
		/**
		 * 记录整副牌的下标
		 */
		int index=0;
		/**
		 * 先按照花色生成对应的牌
		 */
		for (int i = 0; i < styles.length; i++) {
			/**
			 * 生成对应花色的每一张牌(除了大小王)
			 */
			for (int j = 3; j <= 15; j++) {
				Card card = new Card(j, ""+j, styles[i]);
				cards[index]=card;
				index++;
			}
		}
		/**
		 * 加入大小王
		 */
		cards[cards.length-2]=new Card(16, "", "");
		cards[cards.length-1]=new Card(17, "", "");
		return cards;
	}
	
	/**
	 * 
	 * @param gamblers 赌徒的数量(一般为3人)
	 * @param cards 一副牌
	 * @return 分发好牌的赌徒们
	 */
	public void dealCards(Gambler[] gamblers,Card[]cards)
	{
		/**
		 * 发牌的过程
		 */
		if (gamblers.length!=3) {
			System.out.println("赌徒人数不为3!");
			return ;
		}
		if (cards.length!=54) {
			System.out.println("一副牌的数量不为54!");
			return ;
		}
		/**
		 * 先发17轮,每轮给每个人发一张牌
		 */
		for (int i = 0; i <17; i++) {
			for (int j = 0; j < gamblers.length; j++) {
				Random r=new Random();
				int cardIndex=r.nextInt(cards.length);
				gamblers[j].getCards()[i]=cards[cardIndex];
				/**
				 * 每发完一张就将该牌销毁
				 */
				Card[] newCard=new Card[cards.length-1];
				/**
				 * 如果选中的是整副牌中的最后一个时
				 */
				if(cardIndex==cards.length-1)
				{
					newCard=Arrays.copyOf(cards, cards.length-1);
				}
				/**
				 * 如果选中的是中间的就直接将最后的值赋值到该元素
				 */
				else
				{
					cards[cardIndex]=cards[cards.length-1];
					newCard=Arrays.copyOf(cards, cards.length-1);
				}
				cards=newCard;
				
			}
		}
		/**
		 * 随机产生地主
		 * 并将剩余的三张牌发给地主
		 */
		int dzIndex=new Random().nextInt(gamblers.length);
		gamblers[dzIndex].setFlag(true);
		int length=gamblers[dzIndex].getCards().length;
		gamblers[dzIndex].getCards()[length-3]=cards[cards.length-3];
		gamblers[dzIndex].getCards()[length-2]=cards[cards.length-2];
		gamblers[dzIndex].getCards()[length-1]=cards[cards.length-1];
		
		/**
		 * 整理好牌之后再分发给赌徒们
		 */
		sortCards(gamblers);
		
	}
	
	/**
	 * 
	 * @param gamblers 分发好牌但是牌还没整理的赌徒们
	 */
	public void sortCards(Gambler[] gamblers)
	{
		for (int i = 0; i < gamblers.length; i++) {
			for (int j = 0; j < gamblers[0].getCards().length-1; j++) {
				for (int t = 0; t < gamblers[0].getCards().length-1-j; t++) {
					if (gamblers[i].getCards()[t]!=null&&gamblers[i].getCards()[t+1]!=null) {
						if(gamblers[i].getCards()[t].getValue()>gamblers[i].getCards()[t+1].getValue())
						{
							Card tempCard=gamblers[i].getCards()[t];
							gamblers[i].getCards()[t]=gamblers[i].getCards()[t+1];
							gamblers[i].getCards()[t+1]=tempCard;
						}
					}
				}
			}
		}
	}
	
	
}

Gambler类具体代码:

package com.kp;

public class Gambler {
/**
 * 赌徒对象
 */
	/**
	 * 赌徒的牌
	 */
	private Card cards[]=new Card[20];
	
	/**
	 * 赌徒的角色,flag=false表示为平民,flag=true表示为地主
	 */
	private boolean flag=false;

	
	
	
	public Gambler(Card[] cards, boolean flag) {
		super();
		this.cards = cards;
		this.flag = flag;
	}

	
	
	public Gambler() {
		super();
	}



	public Card[] getCards() {
		return cards;
	}

	public void setCards(Card[] cards) {
		this.cards = cards;
	}

	public boolean isFlag() {
		return flag;
	}

	public void setFlag(boolean flag) {
		this.flag = flag;
	}
	
	
	
}

TestCard类具体代码:

package com.kp;

public class TestCard {
	public static void main(String[] args) {
		CardDeal cd=new CardDeal();
		Card[] produrce = cd.produrce();
		Gambler [] gamblers=new Gambler[] {
				new Gambler(),new Gambler(),new Gambler()
		};
		
		for (int i = 0; i < produrce.length; i++) {
			System.out.print(produrce[i]);
			if ((i+1)%13==0) {
				System.out.println();
			}
		}
		System.out.println();
		System.out.println("=========================================");
		cd.dealCards(gamblers, produrce);
		for (int i = 0; i < gamblers.length; i++) {
			for (int j = 0; j < gamblers[i].getCards().length; j++) {
				if (gamblers[i].getCards()[j]!=null) {
					System.out.print(gamblers[i].getCards()[j]);
				}
				
			}
			System.out.println();
		}
		
	}
}

运行结果

生成的牌为:
黑桃3 黑桃4 黑桃5 黑桃6 黑桃7 黑桃8 黑桃9 黑桃10 黑桃J 黑桃Q 黑桃K 黑桃A 黑桃2 
红桃3 红桃4 红桃5 红桃6 红桃7 红桃8 红桃9 红桃10 红桃J 红桃Q 红桃K 红桃A 红桃2 
梅花3 梅花4 梅花5 梅花6 梅花7 梅花8 梅花9 梅花10 梅花J 梅花Q 梅花K 梅花A 梅花2 
方块3 方块4 方块5 方块6 方块7 方块8 方块9 方块10 方块J 方块Q 方块K 方块A 方块2 
小王 大王 
=========================================
分发好牌并且排序好后的结果为:
红桃3 方块3 黑桃5 方块5 黑桃6 方块6 方块7 黑桃7 红桃7 方块8 梅花8 梅花10 黑桃10 方块J 梅花J 方块Q 梅花K 方块A 黑桃A 红桃2 
黑桃3 梅花3 梅花4 方块4 梅花6 红桃8 方块9 黑桃9 方块10 黑桃J 黑桃Q 梅花Q 黑桃K 红桃K 梅花A 方块2 小王 
黑桃4 红桃4 梅花5 红桃5 红桃6 梅花7 黑桃8 红桃9 梅花9 红桃10 红桃J 红桃Q 方块K 红桃A 梅花2 黑桃2 大王 

如有疑问请联系博主QQ:1056015243,加好友时请备注具体信息!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值