集合的使用-模拟斗地主

集合的基本概念

在实际处理问题的时候,因为很多因素都不确定,而数组的长度又是固定的,所以数组的长度就不好控制了,数组的容量小了,就会造成数组越界异常,数组的容量大了,就会造成空间的浪费!为了避免这些问题,集合的使用就十分重要了。集合按照其存储结构可以分为两大类,一类是单列集合Collection,一类是双列集合Map。这里使用的是Collection的实现类ArrayList类。ArrayList类是Collection的子接口List的实现类。

问题描述:

1.创建Card类,定义花色suit和点数rank的属性
2.添加相应的构造方法
3.在Card中覆盖toString,hashCode,equals方法 (必须写)
4.创建玩家类 Player类 ,定义名字name ,手牌 cards (List) 5.添加相应的构造方法
6.在Player中覆盖toString,hashCode,equals方法 (必须写)
7.创建一副扑克牌,54张(到这)
8.实现洗牌(查看API选做)
9.实现轮流发牌
最终结果需要看到XXX手上的牌:[XXX,XXXX,XXXX…]

Card类的实现

Card类,用来保存牌的具体牌面信息,比如牌的花色,点数。重写toString方法

public class Card {
	//定义花色
	private char suit;
	private String rank;
	//有参构造方法
	public Card(char suit, String rank) {
		super();
		this.suit = suit;
		this.rank = rank;
	}
	//生成无参构造构造方法
	public Card() {
		
	}
	//生成getter和setter方法
	public char getSuit() {
		return suit;
	}
	public void setSuit(char suit) {
		this.suit = suit;
	}
	public String getRank() {
		return rank;
	}
	public void setRank(String rank) {
		this.rank = rank;
	}
	//重写toString方法
	public String toString() {
		return "["+suit +  rank + "]";
	}
	//重写hashCode方法
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + suit;
		return result;
	}
	//重写equals 
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Card other = (Card) obj;
		if (rank != other.rank)
			return false;
		if (suit != other.suit)
			return false;
		return true;
	}
	
}

Player类的实现

public class Player {
	// 定义一个姓名
	private String name;
	// 定义一个card集合
	private List<Card> cards = new ArrayList<Card>();

	// 有参构造方法
	public Player(String name) {
		super();
		this.name = name;
	}

	// 无参构造方法
	public Player() {
		super();
	}

	// name的getter和setter方法
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public List<Card> getCards() {
		return cards;
	}

	public void setCards(List<Card> cards) {
		this.cards = cards;
	}

	// 重写toString方法
	public String toString() {
		// 定义一个字符串用来保存拼接Cards集合中的所有牌的信息
		String showCards="All of card:";
		// 遍历集合,拼接所有card信息
		for (Card card : cards) {
			showCards+= card.toString();
		}
		return "Player [name=" + name + ", " + showCards + "]";
	}

	// 重写hashCode方法
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

	// 重写equals方法
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Player other = (Player) obj;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

}

测试类的实现

测试类中定义有生成一副扑克牌的方法,实现洗牌,以及轮流发牌的操作

public class Test {

	public static void main(String[] args) {
		//创建一副扑克牌
		List <Card> cards= createCards();
		//洗牌
		Collections.shuffle(cards);
		//发牌创建玩家
		List <Player>players=new ArrayList <Player> (3);
		//添加三个玩家
		for(int i=0;i<3;i++) {
			players.add(new Player("玩家"+i));
		}
		//获取cards迭代器,在遍历cards时使用
		Iterator it=cards.listIterator(3);
		//创建一个计数器变量,用来控制给三个人轮流发牌
		int count=0;
		//遍历cards,将牌轮流发给三个玩家
		while(it.hasNext()) {
			players.get(count).getCards().add((Card) it.next());
			count++;
			if(count==3) {
				count=0;
			}
		}
		//打印每个玩家的手牌以及底牌
		System.out.println(players.get(0).toString());
		System.out.println(players.get(1).toString());
		System.out.println(players.get(2).toString());
		System.out.print("底牌:"+cards.get(0).toString()+cards.get(1).toString()+cards.get(2).toString());
	}

	//定义一个用来生成54张牌的方法
	private static List<Card> createCards() {
		//创建一个集合用来保存一副扑克牌
		List <Card> cards=new ArrayList<Card>();
		//字符串存放所有种类的花色
		String suits="♥♠♣♦";
		//字符串数组存放所有点数
		String [] ranks= {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
		//利用双重循环生成各种花色点数的扑克牌,并将其存放在集合中
		for(int i=0;i<suits.length();i++) {
			for(int j=0;j<ranks.length;j++) {
				Card card=new Card();
				card.setSuit(suits.charAt(i));
				card.setRank(ranks[j]);
				cards.add(card);
			}
		}
		//单独存放大小王
		Card card1=new Card();
		card1.setSuit('大');
		card1.setRank("boss");
		Card card2=new Card();
		card2.setSuit('小');
		card2.setRank("boss");
		cards.add(card1);
		cards.add(card2);
		//将集合返回
		return cards;
	}
	
}

这里的斗地主只实现到给每个玩家发牌,并留下底牌,抢地主以及后面具体的打牌还未实现。对于集合的选用,使用ArrayList的原因是因为ArrayList集合适合用于快速随机访问元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值