目录
案例要求:
实现思路:
1构造卡牌,细节:实体类另设一个int类型变量表示大小,后面为了实现斗地主牌降序或者升序排序
2打乱卡牌的顺序和发牌
3选定大小王
4实现对牌顺序
5展示玩家的卡牌即可
代码:
Main启动类:
java
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
//TIP 要<b>运行</b>代码,请按 <shortcut actionId="Run"/> 或
// 点击装订区域中的 <icon src="AllIcons.Actions.Execute"/> 图标。
public class Main {
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
Room room = new Room();
room.start();
}
}
Card实体类:
java
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Objects;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Card implements Comparable<Card> {
private String number;
private String color;
private int size;
@Override
public String toString() {
return number + color;
}
@Override
public int compareTo(Card o) {
return o.size-size;
}
}
Room操作类:
java
import java.util.*;
import java.util.stream.Collectors;
public class Room {
private List<Card> list=new ArrayList<>();
{
String [] colors={"♥","♠","♣","♦"};
String [] numbers={"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
for (int i = 0; i < numbers.length; i++){
for(int j = 0; j < colors.length; j++){
list.add(new Card(numbers[i],colors[j],i));
}
}
list.add(new Card("","\uD83C\uDCCF",13));
list.add(new Card("","\uD83E\uDDD1",14));
}
Scanner sc = new Scanner(System.in);
public void start(){
System.out.println("洗牌前");
System.out.println(list);
System.out.println("洗牌后");
// 使用集合类工具打乱卡牌顺序
Collections.shuffle(list);
System.out.println(list);
// 发牌,三个玩家
Map<String,List<Card>> players=new HashMap<>();
List<Card> p1=new ArrayList<>();
players.put("张三",p1);
List<Card> p2=new ArrayList<>();
players.put("李四",p2);
List<Card> p3=new ArrayList<>();
players.put("王五",p3);
for(int i=0;i<list.size()-3;i++){
if(i%3==0){
p1.add(list.get(i));
} else if (i%3==1) {
p2.add(list.get(i));
}else{
p3.add(list.get(i));
}
}
System.out.print("底牌是 ");
for (int i = list.size()-3; i < list.size(); i++) {
System.out.print(list.get(i)+" ");
}
System.out.println();
System.out.print("玩家 ");
for (String name : players.keySet()){
System.out.print(name+" ");
}
System.out.print("请决定谁是地主(姓名)");
String name=sc.next();
for(Map.Entry<String,List<Card>> entry:players.entrySet()) {
if (entry.getKey().equals(name)) {
List<Card> cards = entry.getValue();
cards.addAll(list.stream().skip(51).toList());
}
}
////TODO或者
// if(entry.getKey().equals(name)){
// entry.getValue().addAll(list.stream().skip(51).collect(Collectors.toList()));
// }
// 对拍顺序
// TODO法一
// sortCards(p1);
// sortCards(p2);
// sortCards(p3);
// TODO法二
Collections.sort(p1);
Collections.sort(p2);
Collections.sort(p3);
// 看牌
/* //TODO遍历方法一:
List<String> names=players.entrySet().stream().map(Map.Entry::getKey).toList();
for(int i=0;i<names.size();i++){
System.out.println(names.get(i)+"的牌是:");
List<Card> cards=players.get(names.get(i));
for(int j=0;j<cards.size();j++){
System.out.print(cards.get(j)+" ");
}
System.out.println();
}*/
for(Map.Entry entry:players.entrySet()){
System.out.println(entry.getKey()+"的牌是:");
List<Card> cards=(List<Card>) entry.getValue();
for(Card card:cards){
System.out.print(card+" ");
}
System.out.println();
}
}
//TODO法一;哪用哪里构造比较器
// private void sortCards(List<Card> p1) {
// Collections.sort(p1, new Comparator<Card>() {
// @Override
// public int compare(Card o1, Card o2) {
//
// return o1.getSize()-o2.getSize();
// }
// });
// }
//// TODO简化版的
// private void sortCards(List<Card> p1) {
// Collections.sort(p1, (o1, o2) -> o1.getSize()-o2.getSize());
// }
}
总结:
本文展示了一个Java实现的简单扑克牌游戏程序。程序主要包含三个类:Main启动类、Card实体类(使用Lombok简化代码)和Room操作类。程序实现了洗牌、发牌、选择地主、排序牌面和显示牌面等功能。通过Collections工具类实现洗牌和排序,使用HashMap存储玩家信息,并展示了多种遍历和排序的实现方式(包括Lambda表达式)。程序能正确处理54张牌(含大小王),支持3名玩家游戏,由用户指定地主并获得底牌。