斗地主的两种发牌方式

作为一个初学java的菜鸟,近期在老师的指导下做了一个包含斗地主洗牌发牌的简单小项目.
我自己做的思路是直接将54张牌分成3组 17张,最后剩的3张直接给地主
首先创建两个实体类Card和Player.
![Card类](https://img-blog.csdnimg.cn/20200718182854747.png)![Player类](https://img-blog.csdnimg.cn/202007181829334.png)


在Card类中实现Comparable接口方便之后将每组牌发出后根据大小排序,将所有牌都存入集合中,之后分出一个人的牌
public List<Card> getCards() {
	//将牌乱序
	Collections.shuffle(list);
	//定义集合接收
	List<Card> group=new ArrayList<Card>();
	//循环拿出一组牌
	for (int i = 0; i <17; i++) {
		//根据索引取牌
		int index=r.nextInt(list.size());
		group.add(list.get(index));
		//排序
		group.sort(null);
		//取出一个就移除一个
		list.remove(index);
		}
	return group;
	
}

分三组17张后还剩下三张存入一个集合,方便之后给地主

public List<Card> lastCard(){
		List<Card> s=list;
		System.out.println(s);
		return s;
	
	}

最后随机选出地主,完成发牌并排序的功能


```java
import java.util.Random;

public class PlayerTest {

	CardDemo cd = new CardDemo();
	Player a=new Player(1, "张三");
	Player b=new Player(2, "李四");
	Player c=new Player(3, "王五");
	
	/**
	 * 随机定地主,并根据地主给牌
	 */
	public void dizhu() {
		Random r=new Random();
		int d=r.nextInt(3)+1;
		if (d==1) {
			a.isBoss=true;
			a.setCard(cd.getCards());
			b.setCard(cd.getCards());
			c.setCard(cd.getCards());
			a.getCard().addAll(cd.lastCard());
			//给地主的牌排序
			a.getCard().sort(null);
			System.out.println(a);
			System.out.println(b);
			System.out.println(c);
		}
		if (d==2) {
			b.isBoss=true;
			b.setCard(cd.getCards());
			a.setCard(cd.getCards());
			c.setCard(cd.getCards());
			b.getCard().addAll(cd.lastCard());
			b.getCard().sort(null);
			System.out.println(a);
			System.out.println(b);
			System.out.println(c);
		}
		if (d==3) {
			c.isBoss=true;
			c.setCard(cd.getCards());
			b.setCard(cd.getCards());
			a.setCard(cd.getCards());
			c.getCard().addAll(cd.lastCard());
			c.getCard().sort(null);
			System.out.println(a);
			System.out.println(b);
			System.out.println(c);
		}
		}

	public static void main(String[] args) {
		PlayerTest a=new PlayerTest();
		a.dizhu();
	}
}

	

下面是老师给出的解决方案,相对于我的代码量就要少很多,运用的方法和思路也都要高级一点
首先同样是定义Card和Player两个实体类,不过老师是将大小王和普通牌分开,运用笛卡尔积写两组循环得出了普通牌的集合,相对于我一张一张添加方便了很多

```java
private static String[] names= {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
	private static String[] colors= {"♥","♠","♣","♦"};
	private static List<Card> allCards;
	private static int id=0;
	/**声明存储玩家的引用*/
	private static List<Player> players;
	Random r=new Random();
	static {
		allCards=new ArrayList<Card>();
		for (int i = 0; i < names.length; i++) {
			for (int j = 0; j < colors.length; j++) {
				id++;
				//创建一张牌
				Card c=new NormalCard(id, names[i], i+1, colors[j]);
				//将创建的牌加入集合
				allCards.add(c);
			}
		}
		allCards.add(new Card(++id, "小王", 444));
		allCards.add(new Card(++id, "大王", 666));

我的方法是直接17张一组,老师的则更加贴合实际,一人一张的发
public void sendCard() {
		//声明临时变量表示该谁抽取了
		int pos=0;
		//遍历所有牌
		for (int i = 0; i < allCards.size()-3; i++) {
			players.get(pos).getCards().add(allCards.get(i));
			pos=pos==0?1:pos==1?2:0;
//			if (pos==0) {
//				//玩家一抽牌
//				pos=1;
//			}if (pos==1) {
//				//玩家二抽牌
//				
//				pos=2;
//			}else {
//				//玩家三抽牌
//				
//				pos=0;
//			}
		}
		//将剩余的牌给地主
		for (Player p : players) {
			if (p.isBoss()) {
				p.getCards().addAll(allCards.subList(allCards.size()-3, allCards.size()));
			}
		}
	}
之后再将洗牌,排序等写成一个个方法,最后在主方法中new一个对象,调用各个方法得出最终结果.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值