最好将这种重复代码封装成方法
package com.itheima.d4_collection_test;
import javax.swing.plaf.SliderUI;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* 功能:
* 1.做牌
* 2.洗牌
* 3.定义三个玩家
* 4.发牌
* 5.排序
* 6.看牌
*/
public class GameDemo {
/**
* 1.定义一个静态的集合存储54张牌对象
*/
public static List<Card> allCards = new ArrayList<>();
/**
* 2. 做牌:定义静态代码块初始化牌数据 ( 加载类之后,就会加载静态代码块)
* @param args
*/
// ( 加载类之后,就会加载静态代码块)
static {
// 3. 定义点数:个数确定,类型确定,使用数组
String[] sizes = {"3","4","5","6","7","8","9","10","J","" +
"Q","K","A","2"};
// 4 定义花色:个数确定,类型确定,使用数组
String[] colors = {"♠","❤","♣","♦"};
// 5. 组合点数和花色
int index = 0; // 记录牌的大小
// 这里可以使用foreach(增强for) 遍历数组 数组名.for
for (String size : sizes) {
index ++ ; // 每遍历一次牌的点数 大小就 + 1
// 数组名.for
for (String color : colors) { // 一个点数,对应虽有的花色(4种)
// 6 封装成一个牌的对象
Card c = new Card(size,color,index); // 每次遍历到的点数和花色都创建一个Card对象
// 7. 存入到集合容器中去
allCards.add(c);
}
}
// 8 .由于大小王特殊没有点数和花色,所以不加入for循环中,单独创建对象
Card c1 = new Card("🃏","",++index); // 没有花色,直接定义为空字符串
Card c2 = new Card("🤡","",++ index); // 先加1 在返回
//使用 Collections工具类的addAll方法将所有对 象加入到集合中去
Collections.addAll(allCards,c1,c2);
System.out.println("新牌:" + allCards); // 写在静态类中,直接加载
}
public static void main(String[] args) {
// 9. 洗牌:
Collections.shuffle(allCards); // 使用Collections工具类的随机排序Api
System.out.println("洗牌后:" + allCards);
// 10. 发牌:(定义三个玩家加,每个玩家的牌也是一个集合容器
List<Card> linhuchong = new ArrayList<>();
List<Card> jiumozhi = new ArrayList<>();
List<Card> renyingying = new ArrayList<>();
// 11. 开始发牌(从牌集合中发出51张牌给三个玩家,剩余三个牌作为底牌)
// allCards = [[♣9, ♦9, ♣K, ♣A, ❤6, ♦K, ♣3, ♦Q, ♣5]
// i 0 1 2 3 4 5 6 // 轮询的方法:对3求余:余数为0,发给第一个人为1发给第二个人
for (int i = 0; i < allCards.size() -3; i++) { // 因为要留三张牌作为底牌所以 长度减三
// 先拿到当前玩家对象
Card c = allCards.get(i);
if (i % 3 == 0){
// 请阿冲接牌
linhuchong.add(c); // 由于把玩家定义为了集合容器(负责接牌的对象)
}else if (i % 3 == 1) {
// 请阿jiu接牌
jiumozhi.add(c);
}else if (i % 3 == 2){
// 请盈盈接牌
renyingying.add(c);
}
}
// 12. 拿到最后三张牌 这里用get方法比较低级low,用高级的sublist方法可以将集合截取
// 参数意思:从倒数第51张牌开始截取(原来总数是54张牌,-3剩54,),一直到最后一张54-- 计算机包前不包后
List<Card> lastThreeCards = allCards.subList(allCards.size() - 3,allCards.size());
// 13. 给玩家的牌排序(从小到大 可以自己先试试怎么实现)
sortCards(linhuchong);
sortCards(jiumozhi);
sortCards(renyingying);
// 14. 输出玩家的牌[♣A, ♣5, ♠3, ❤5, ♦4, ❤2]
System.out.println("阿冲" + linhuchong);
System.out.println("阿jiu" + jiumozhi);
System.out.println("盈盈" + renyingying);
System.out.println("三张底牌" + lastThreeCards);
}
private static void sortCards(List<Card> cards) {
// cards = [♣A, ♣5, ♠3, ❤5, ♦4, ❤2]
Collections.sort(cards, new Comparator<Card>() { // 创建一个比较器,比较cards集合
@Override
public int compare(Card o1, Card o2) {
// o1 = J
// o2 = A
// 知道牌的大小,才可以指定规则
return o2.getIndex() - o1.getIndex(); // 降序
}
});
}
}
package com.itheima.d4_collection_test;
public class Card {
private String size; // 这个是牌的点数
private String color; // 这是牌的花色
private int index; // 牌的真正的大小
public Card() {
}
public Card(String size, String color, int index) {
this.color = color;
this.size = size;
this.index = index;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getSize() {
return size;
}
public void setSize(String size) {
this.size = size;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
// 重写一个toString方法,让他打印内容
@Override // 在开发中不一定会用默认给的toString方法的格式
public String toString() {
return size + color; // 直接返回点数和花色
}
}