卡牌类
public class Card {
private String size;//大小
private String color;//花色
private int value;//权值
public Card() {
}
public Card(String size, String color, int value) {
this.size = size;
this.color = color;
this.value = value;
}
public String toString(){
return size+color;
}
/**
* 获取
* @return size
*/
public String getSize() {
return size;
}
/**
* 设置
* @param size
*/
public void setSize(String size) {
this.size = size;
}
/**
* 获取
* @return color
*/
public String getColor() {
return color;
}
/**
* 设置
* @param color
*/
public void setColor(String color) {
this.color = color;
}
/**
* 获取
* @return value
*/
public int getValue() {
return value;
}
/**
* 设置
* @param value
*/
public void setValue(int value) {
this.value = value;
}
}
玩家类
import java.util.List;
public class Player {
private String name;// 玩家姓名
private List<Card> cards;// 玩家手牌
public Player() {
}
public Player(String name, List<Card> cards) {
this.name = name;
this.cards = cards;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return cards
*/
public List<Card> getCards() {
return cards;
}
/**
* 设置
* @param cards
*/
public void setCards(List<Card> cards) {
this.cards = cards;
}
public String toString() {
return "Player{name = " + name + ", cards = " + cards + "}";
}
}
游戏类(程序入口)
import java.util.*;
public class game {
public static void main(String[] args) {
//1.准备花色
String[] colors = {"♥", "♠", "♣", "♦"};
//2.准备点数
String[] numbers = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
//3.准备牌
List<Card> cards = new ArrayList<>();
//4.添加牌 count代表权值
int count = 0;
for (String number : numbers) {
count++;
for (String color : colors) {
cards.add(new Card(color, number, count));
}
}
//5.添加大王和小王
cards.add(new Card("🃏", "", 14));
cards.add(new Card("👲", "", 15));
System.out.println(cards);
//6.洗牌
Collections.shuffle(cards);//比for循环更优雅
System.out.println(cards);
//7.发牌,并且要留3张底牌
List<Player> players = new ArrayList<>();
players.addAll(Arrays.asList(new Player("张三", new ArrayList<>()),
new Player("李四", new ArrayList<>()), new Player("王五", new ArrayList<>())));
for (int i = 0; i < cards.size()-3; i++) {
if (i%3==0){
//如果下标取余是0,则给张三发一张
players.get(0).getCards().add(cards.get(i));
}else if (i%3==1){
//如果下标取余是1,则给李四发一张
players.get(1).getCards().add(cards.get(i));
}else {
//如果下标取余是2,则给王五发一张
players.get(2).getCards().add(cards.get(i));
}
}
//通过随机数把地主牌放到对应的人里面,如果随机数是0,则张三当地主。
Random random = new Random();
int index = random.nextInt(3);
players.get(index).getCards().addAll(cards.subList(cards.size()-3,cards.size()));
//根据stream流对玩家的牌进行排序
players.forEach(player -> {
player.getCards().sort(Comparator.comparingInt(Card::getValue));
System.out.println(player);
});
}
}
程序运行结果
小结
1.Collections.shuffle(cards);//比for循环更优雅代码量少,同样比stream流优雅,stream不会对对象本身操作,因此排序后还要再重新赋值,故这里不选用stream流实现排序。
2.通过对card类封装value属性可以很好的解决斗地主2比3大的问题,这里体现了面向对象的思想。